2008-11-13 38 views
5

如何设计关系数据库来处理多值属性?数据库中的多值属性

编辑:为了详细说明:

有两种方法我能想到的这样做 -

  1. 尝试一些喜欢把逗号分隔值在场上,这似乎有点笨拙。
  2. 为该字段创建另一个表并让多个值进入该字段。如果我有这么多的字段,这可能会导致大量的表格。

的问题是:

  1. 是否有处理这个任何更多的方式?
  2. 以上两种方法中哪一种通常使用?

在此先感谢

+0

你必须比这更加明确。我想英语可能不会成为你的第一语言,但给它一个镜头。人们会尽力帮助,有些人会解决你的问题,但你必须给我们一些东西继续下去。 – 2008-11-13 19:24:43

回答

1

的关系是一个一对多或多对多多少?通过一对多关系,我建议在引用父表(一个)的子表(多个)中使用一个外键。有了多对多的关系,那么你最好的选择很可能是一个独立的表,并且父母和孩子都有外键。

12

在传统的关系数据库设计中,每行&列必须只存储一个值。

不要存储逗号分隔的列表或任何古怪的东西。

例如,说一个运动队有七个成员。你可以这样做:

CREATE TABLE team (
    team_id  INT PRIMARY KEY, 
    team_name VARCHAR(50), 
    team_members VARCHAR(200) 
); 
INSERT INTO team VALUES (1,'Dwarfs', 'Sleepy,Dopey,Sneezy,Happy,Grumpy,Doc,Bashful') 

但它更好地做到这一点:

CREATE TABLE team (
    team_id  INT PRIMARY KEY, 
    team_name VARCHAR(50), 
); 
INSERT INTO team (team_name) VALUES ('Dwarfs'); 

CREATE TABLE team_members (
    team_id  INT, 
    member_name VARCHAR(20), 
    FOREIGN KEY (team_id) REFERENCES team(team_id) 
); 
INSERT INTO team_members VALUES 
    (LAST_INSERT_ID(), 'Sleepy'), 
    (LAST_INSERT_ID(), 'Dopey'), 
    (LAST_INSERT_ID(), 'Sneezy'), 
    (LAST_INSERT_ID(), 'Happy'), 
    (LAST_INSERT_ID(), 'Grumpy'), 
    (LAST_INSERT_ID(), 'Doc'), 
    (LAST_INSERT_ID(), 'Bashful'); 

注:LAST_INSERT_ID()是一个MySQL的功能。其他品牌的数据库也有类似的解决方案。

+0

LAST_INSERT_ID绑定到表吗?或者是整个数据库的唯一编号? – 2008-11-13 19:26:47

+0

在MySQL中,自动增加值绑定到一个表,没有像Oracle或PostgreSQL那样的序列对象。但是LAST_INSERT_ID()返回由INSERT生成的最新值,而不管您使用的是哪个表,这对于填充子表非常有用。 – 2008-11-13 19:53:31

1

如果您仅限于使用严格关系数据库,则需要将这些值作为行存储在表中。那就是你的问题 - 如何用关系数据库来做到这一点。 但是,有很多数据库可用,这些数据库在一个字段中提供了多个值的本地存储,实际上它与很多真实世界的数据非常匹配,易于编程并且更易于理解(如果没有爆炸的表格,与第三正常形式)。 欲了解更多信息,请参阅http://en.wikipedia.org/wiki/MultiValue http://en.wikipedia.org/wiki/IBM_U2 http://en.wikipedia.org/wiki/InterSystems