2008-11-13 35 views
5

如何設計關係數據庫來處理多值屬性?數據庫中的多值屬性

編輯:爲了詳細說明:

有兩種方法我能想到的這樣做 -

  1. 嘗試一些喜歡把逗號分隔值在場上,這似乎有點笨拙。
  2. 爲該字段創建另一個表並讓多個值進入該字段。如果我有這麼多的字段,這可能會導致大量的表格。

的問題是:

  1. 是否有處理這個任何更多的方式?
  2. 以上兩種方法中哪一種通常使用?

在此先感謝

+0

你必須比這更加明確。我想英語可能不會成爲你的第一語言,但給它一個鏡頭。人們會盡力幫助,有些人會解決你的問題,但你必須給我們一些東西繼續下去。 – 2008-11-13 19:24:43

回答

1

的關係是一個一對多或多對多多少?通過一對多關係,我建議在引用父表(一個)的子表(多個)中使用一個外鍵。有了多對多的關係,那麼你最好的選擇很可能是一個獨立的表,並且父母和孩子都有外鍵。

12

在傳統的關係數據庫設計中,每行&列必須只存儲一個值。

不要存儲逗號分隔的列表或任何古怪的東西。

例如,說一個運動隊有七個成員。你可以這樣做:

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的功能。其他品牌的數據庫也有類似的解決方案。

+0

LAST_INSERT_ID綁定到表嗎?或者是整個數據庫的唯一編號? – 2008-11-13 19:26:47

+0

在MySQL中,自動增加值綁定到一個表,沒有像Oracle或PostgreSQL那樣的序列對象。但是LAST_INSERT_ID()返回由INSERT生成的最新值,而不管您使用的是哪個表,這對於填充子表非常有用。 – 2008-11-13 19:53:31

1

如果您僅限於使用嚴格關係數據庫,則需要將這些值作爲行存儲在表中。那就是你的問題 - 如何用關係數據庫來做到這一點。 但是,有很多數據庫可用,這些數據庫在一個字段中提供了多個值的本地存儲,實際上它與很多真實世界的數據非常匹配,易於編程並且更易於理解(如果沒有爆炸的表格,與第三正常形式)。 欲瞭解更多信息,請參閱http://en.wikipedia.org/wiki/MultiValue http://en.wikipedia.org/wiki/IBM_U2 http://en.wikipedia.org/wiki/InterSystems