Database design 数据库中的多值属性

Database design 数据库中的多值属性,database-design,Database Design,关系数据库应该如何设计来处理多值属性 编辑:详细说明: 我可以想出两种方法来做这件事- 尝试在字段中放置逗号分隔的值,这看起来有点笨拙 为字段创建另一个表,并让多个值进入该字段。如果这类字段太多,可能会导致非常多的表 问题是: 还有其他处理方法吗 通常使用上述两种方法中的哪一种 提前感谢关系是一对多还是多对多?对于一对多关系,我建议在引用父表(一)的子表(多)中使用外键。对于多对多关系,您的最佳选择很可能是一个单独的表,其中包含父级和子级的外键。在传统的关系数据库设计中,每行和每列只能存储一个值

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

编辑:详细说明:

我可以想出两种方法来做这件事-

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

  • 还有其他处理方法吗
  • 通常使用上述两种方法中的哪一种

  • 提前感谢

    关系是一对多还是多对多?对于一对多关系,我建议在引用父表(一)的子表(多)中使用外键。对于多对多关系,您的最佳选择很可能是一个单独的表,其中包含父级和子级的外键。

    在传统的关系数据库设计中,每行和每列只能存储一个值

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

    例如,假设一个运动队有七名成员。您可以这样做:

    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\u INSERT\u ID()
    是一个MySQL函数。其他品牌的数据库也有类似的解决方案。

    请阅读这里关于第一(1NF)、第二(2NF)和第三(3NF)种数据库设计标准形式的内容。3NF以上有更多的表单,但通常3NF就足够了。

    如果您仅限于使用严格的关系数据库,则需要将这些值作为行存储在表中。这就是你的问题——如何使用关系数据库。 但是,有许多数据库可以在一个字段中提供多个值的本机存储,这与许多真实数据非常匹配,易于编程,并且易于理解(无需使用第三种标准形式获得大量表)。 有关详细信息,请参阅

    这有两种可能的方法-

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

  • 你必须比这更明确。我想英语可能不是你的第一语言,但试试看吧。人们会尽力帮助你,有些人会解决你的问题,但你必须给我们一些继续下去的东西。这是否回答了你的问题?最后一个插入ID是否绑定到表?或者这是数据库中唯一的数字?在MySQL中,自动增量值绑定到一个表,没有Oracle或PostgreSQL中的sequence对象。但是LAST_INSERT_ID()返回由INSERT生成的最新值,而不管您使用的表是什么,这对于填充子表很有用。还应该注意,API中的LAST_INSERT_ID()和mysql_INSERT_ID()是每个连接的。i、 e.该值来自该连接的最后一次插入,而不是整个数据库。@Fire Lancer:谢谢,这是一个很好的观点,也是正确的。如果LAST_INSERT_ID()返回为任何并发连接生成的最后一个值,则它的值不会太大。你会有比赛条件,如果你使用“从…中选择最大值(id)”技术,情况也不会好到哪里去。