数据库中的多值属性

Abh*_*dav 7 database-design

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

编辑:详细说明:

我有两种方法可以做到这一点 -

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

问题是:

  1. 还有其他办法吗?
  2. 通常使用以上两种方法中的哪一种?

提前致谢

Bil*_*win 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')
Run Code Online (Sandbox Code Playgroud)

但最好这样做:

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');
Run Code Online (Sandbox Code Playgroud)

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

  • 还应注意,API中的LAST_INSERT_ID()和mysql_insert_id()是每个连接.即,该值来自该连接上的最后一个插入,而不是整个数据库. (2认同)

Gle*_*enn 1

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