如何設計關係數據庫來處理多值屬性?數據庫中的多值屬性
編輯:爲了詳細說明:
有兩種方法我能想到的這樣做 -
- 嘗試一些喜歡把逗號分隔值在場上,這似乎有點笨拙。
- 爲該字段創建另一個表並讓多個值進入該字段。如果我有這麼多的字段,這可能會導致大量的表格。
的問題是:
- 是否有處理這個任何更多的方式?
- 以上兩種方法中哪一種通常使用?
在此先感謝
如何設計關係數據庫來處理多值屬性?數據庫中的多值屬性
編輯:爲了詳細說明:
有兩種方法我能想到的這樣做 -
的問題是:
在此先感謝
的關係是一個一對多或多對多多少?通過一對多關係,我建議在引用父表(一個)的子表(多個)中使用一個外鍵。有了多對多的關係,那麼你最好的選擇很可能是一個獨立的表,並且父母和孩子都有外鍵。
在傳統的關係數據庫設計中,每行&列必須只存儲一個值。
不要存儲逗號分隔的列表或任何古怪的東西。
例如,說一個運動隊有七個成員。你可以這樣做:
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