2010-01-09 108 views
0

我目前正在考慮「朋友」表(多對多,存儲用戶之間的友誼)的數據庫設計。MySQL表格設計:主要外國多列鍵可能嗎?

列:user_id friend_id

是否有意義喜歡多列主鍵,而不是額外的「friendship_id」列?

如果是這樣,我可以爲兩列添加外鍵嗎?

回答

1

數據庫在這方面努力,最快的方式可能是

PRIMARY KEY ('user_id', 'friend_id') 

這保證了他們獨特的組合,並在同一時間既可以是外鍵。 也許你也想在user_id上找到一個索引,這樣你就可以快速查找所有的朋友給一個用戶。

INDEX ('user_id') 

沒有必要擁有代理鍵​​,因爲它會創建與維護表相關的額外工作。無論如何,這些組合都是獨一無二的,而且你已經知道兩個有問題的ID。

+0

是否有自動生成的外鍵索引? – Psaniko 2010-01-09 17:43:45

+0

也許。但不傷害具體。 – 2010-01-09 17:44:21

+0

也許「friend_id」上的索引更重要。 PK聲明將按照該順序產生「user_id」和「friend_id」的索引,並且在查找特定的user_id時將使用該組合索引。但是在friend_id上查找需要單獨的索引。 – 2010-01-11 15:22:49

1

是的,你確實可以創建兩個外鍵列,這通常是這個關聯的設計。您還可以指定兩個列一起是唯一的,因此(user_id,friend_id)是唯一的。

編輯:這樣的例子可能是:

CREAT TABLE friendship (
    user_id INT, 
    friend_id INT, 
    FOREIGN KEY (user_id) REFERENCES user(id), 
    FOREIGN KEY (friend_id) REFERENCES user(id), 
    UNIQUE(user_id,friend_id) 
); 
0

我會去單列代理鍵(friendship_id),加上獨特的約束和對user_idfriend_id組合的指數。爲了保持一致性,我會使用代理鍵,因爲您似乎在其他表上使用代理(user_id大概是指id列上的user等)。

0

如果您需要跟蹤友情事件,您可以擁有一個friendship_id(例如,您想要一個框,列出系統中最近的友情鏈接和詳細信息鏈接),但是如果您的數據模型不需要這種關係,多列主鍵就好了。你可以像這樣創建:

create table friend (
    user_id int, 
    friend_id int, 
    foreign key (user_id) references user(id), 
    foreign key (friend_id) references user(id), 
    primary key (user_id, friend_id) 
); 

會有由外鍵約束單獨創建兩列的索引,並在user_ID的多列唯一索引,friend_id。