如何设计关系数据库来处理多值属性?数据库中的多值属性
编辑:为了详细说明:
有两种方法我能想到的这样做 -
- 尝试一些喜欢把逗号分隔值在场上,这似乎有点笨拙。
- 为该字段创建另一个表并让多个值进入该字段。如果我有这么多的字段,这可能会导致大量的表格。
的问题是:
- 是否有处理这个任何更多的方式?
- 以上两种方法中哪一种通常使用?
在此先感谢
如何设计关系数据库来处理多值属性?数据库中的多值属性
编辑:为了详细说明:
有两种方法我能想到的这样做 -
的问题是:
在此先感谢
的关系是一个一对多或多对多多少?通过一对多关系,我建议在引用父表(一个)的子表(多个)中使用一个外键。有了多对多的关系,那么你最好的选择很可能是一个独立的表,并且父母和孩子都有外键。
在传统的关系数据库设计中,每行&列必须只存储一个值。
不要存储逗号分隔的列表或任何古怪的东西。
例如,说一个运动队有七个成员。你可以这样做:
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的功能。其他品牌的数据库也有类似的解决方案。
LAST_INSERT_ID绑定到表吗?或者是整个数据库的唯一编号? – 2008-11-13 19:26:47
在MySQL中,自动增加值绑定到一个表,没有像Oracle或PostgreSQL那样的序列对象。但是LAST_INSERT_ID()返回由INSERT生成的最新值,而不管您使用的是哪个表,这对于填充子表非常有用。 – 2008-11-13 19:53:31
在这里阅读关于第一(1NF),第二(2NF)和第三(3NF)数据库设计的常规形式的http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html。在3NF以上有更多的形式,但通常3NF就足够了。
如果您仅限于使用严格关系数据库,则需要将这些值作为行存储在表中。那就是你的问题 - 如何用关系数据库来做到这一点。 但是,有很多数据库可用,这些数据库在一个字段中提供了多个值的本地存储,实际上它与很多真实世界的数据非常匹配,易于编程并且更易于理解(如果没有爆炸的表格,与第三正常形式)。 欲了解更多信息,请参阅http://en.wikipedia.org/wiki/MultiValue http://en.wikipedia.org/wiki/IBM_U2 http://en.wikipedia.org/wiki/InterSystems
你必须比这更加明确。我想英语可能不会成为你的第一语言,但给它一个镜头。人们会尽力帮助,有些人会解决你的问题,但你必须给我们一些东西继续下去。 – 2008-11-13 19:24:43