数据库中的多值属性

时间:2008-11-13 18:32:07

标签: database-design

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

修改:详细说明:

我有两种方法可以考虑这样做 -

  1. 尝试在字段中放置逗号分隔值,这看起来有点笨拙。
  2. 为该字段创建另一个表,并让多个值转到该字段。如果我有太多这样的字段,这可能会导致非常多的表。
  3. 问题是:

    1. 还有其他方法可以解决这个问题吗?
    2. 通常使用上述两种方法中的哪一种?
    3. 提前致谢

5 个答案:

答案 0 :(得分:15)

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

不要存储以逗号分隔的列表或任何古怪的内容。

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

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');

nb: LAST_INSERT_ID()是一个MySQL函数。其他品牌的数据库也提供类似的解决方案。

答案 1 :(得分:1)

这种关系是一对多还是多对多?使用一对多关系,我建议引用父表(一个)的子表(众多)中的外键。通过多对多的关系,那么您最好的选择很可能是一个单独的表,其中包含父母和子女的外键。

答案 2 :(得分:1)

在这里阅读http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html关于第一(1NF),第二(2NF)和第三(3NF)正常形式的数据库设计。 3NF以上有更多的形式,但通常3NF就足够了。

答案 3 :(得分:1)

如果您只能使用严格的关系数据库,那么您需要将这些值存储为表中的行。这是你的问题 - 如何使用关系数据库。 但是,有许多可用的数据库可以在一个字段中提供多个值的本机存储,这对于许多真实世界的数据来说非常匹配,易于编程,并且更容易理解(没有表格的爆炸性增长)第3范式)。 有关详细信息,请参阅http://en.wikipedia.org/wiki/MultiValue http://en.wikipedia.org/wiki/IBM_U2 http://en.wikipedia.org/wiki/InterSystems

答案 4 :(得分:1)

有两种可能的解决方法-

  1. 关系:为一个存储多个值 实体的属性是通过引用的键-外键完成的 关系。有关更多信息,请检查this
  2. Set :mysql中的标量数据类型,可以具有零个或多个值,每个值必须从创建表时指定的允许值列表中选择。有关更多信息,请检查thisthis链接。