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就足够了。如果您仅限于使用严格的关系数据库,则需要将这些值作为行存储在表中。这就是你的问题——如何使用关系数据库。
但是,有许多数据库可以在一个字段中提供多个值的本机存储,这与许多真实数据非常匹配,易于编程,并且易于理解(无需使用第三种标准形式获得大量表)。
有关详细信息,请参阅
这有两种可能的方法-
你必须比这更明确。我想英语可能不是你的第一语言,但试试看吧。人们会尽力帮助你,有些人会解决你的问题,但你必须给我们一些继续下去的东西。这是否回答了你的问题?最后一个插入ID是否绑定到表?或者这是数据库中唯一的数字?在MySQL中,自动增量值绑定到一个表,没有Oracle或PostgreSQL中的sequence对象。但是LAST_INSERT_ID()返回由INSERT生成的最新值,而不管您使用的表是什么,这对于填充子表很有用。还应该注意,API中的LAST_INSERT_ID()和mysql_INSERT_ID()是每个连接的。i、 e.该值来自该连接的最后一次插入,而不是整个数据库。@Fire Lancer:谢谢,这是一个很好的观点,也是正确的。如果LAST_INSERT_ID()返回为任何并发连接生成的最后一个值,则它的值不会太大。你会有比赛条件,如果你使用“从…中选择最大值(id)”技术,情况也不会好到哪里去。