簡體   English   中英

復合鍵和獨特的約束性能和替代品

[英]Composite keys and unique constrains performances and alternatives

我正在為學校項目的音樂流應用程序使用 MySQL 創建一個數據庫。 它有一個表“song_discoveries”,其中包含以下列:user_id、song_id 和 discovery_date。 它沒有主鍵。 “user_id”和“song_id”是外鍵,“discovery_date”是不言自明的。 我的問題是我想確保此表中沒有重復行,因為顯然用戶可以發現一首歌一次,但我不確定是對所有列使用唯一約束還是創建復合主列所有列的鍵。 我主要關心的是什么是最好的做法,哪個有更好的表現? 這些方法是否有任何替代方法?

如果目標是創建“此表中沒有重復的行”。 然后要做到這一點,您需要確定是什么構成了“獨特”的記錄。 如果唯一性由復合 user_id、discovery_date 和 song_id 保證,那應該是您的主要復合鍵。 多想想,如果我們應用一個規則說,“一首歌只能被發現一次”,那么你的復合主鍵應該是 user_id,song_id(這將保證你不會多次添加同一首歌),但如果你能在多天里發現同一首歌。 那么您可以將密鑰保留為 3 個字段的組合:如果您使用 go 和用戶/歌曲,那么表格可能如下所示:

CREATE TABLE song_discoveries (
    user_id int NOT NULL,
    song_id int NOT NULL,
    discovery_date DATE NOT NULL,
    PRIMARY KEY (user_id, song_id)
);

在MySQL中,一個表存儲為按主鍵排序的聚簇索引

如果表沒有主鍵,但在非 NULL 列上有唯一鍵約束,則唯一鍵成為聚簇索引,其作用幾乎與主鍵完全相同。 這兩種情況之間沒有性能差異。

非 NULL 列上的主鍵和唯一鍵之間的唯一區別是您可以指定唯一鍵的名稱,但主鍵始終稱為PRIMARY

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM