我目前正在考慮「朋友」表(多對多,存儲用戶之間的友誼)的數據庫設計。MySQL表格設計:主要外國多列鍵可能嗎?
列:user_id friend_id
是否有意義喜歡多列主鍵,而不是額外的「friendship_id」列?
如果是這樣,我可以爲兩列添加外鍵嗎?
我目前正在考慮「朋友」表(多對多,存儲用戶之間的友誼)的數據庫設計。MySQL表格設計:主要外國多列鍵可能嗎?
列:user_id friend_id
是否有意義喜歡多列主鍵,而不是額外的「friendship_id」列?
如果是這樣,我可以爲兩列添加外鍵嗎?
數據庫在這方面努力,最快的方式可能是
PRIMARY KEY ('user_id', 'friend_id')
這保證了他們獨特的組合,並在同一時間既可以是外鍵。 也許你也想在user_id上找到一個索引,這樣你就可以快速查找所有的朋友給一個用戶。
INDEX ('user_id')
沒有必要擁有代理鍵,因爲它會創建與維護表相關的額外工作。無論如何,這些組合都是獨一無二的,而且你已經知道兩個有問題的ID。
是的,你確實可以創建兩個外鍵列,這通常是這個關聯的設計。您還可以指定兩個列一起是唯一的,因此(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)
);
我會去單列代理鍵(friendship_id
),加上獨特的約束和對user_id
,friend_id
組合的指數。爲了保持一致性,我會使用代理鍵,因爲您似乎在其他表上使用代理(user_id
大概是指id
列上的user
等)。
如果您需要跟蹤友情事件,您可以擁有一個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。
是否有自動生成的外鍵索引? – Psaniko 2010-01-09 17:43:45
也許。但不傷害具體。 – 2010-01-09 17:44:21
也許「friend_id」上的索引更重要。 PK聲明將按照該順序產生「user_id」和「friend_id」的索引,並且在查找特定的user_id時將使用該組合索引。但是在friend_id上查找需要單獨的索引。 – 2010-01-11 15:22:49