Mysql
基於多對多數據透視表的唯一鍵
我必須管理藝術家和專輯表:
| artists | | albums | | album_artist | +--------------+ +--------------+ +--------------+ | id | | id | | id | | artist | | album | | album_id | | created_at | | created_at | | artist_id | | updated_at | | updated_at | +--------------+ +--------------+ +--------------+
請記住,這是一個多對多的關係,我確實需要找到一種方法讓專輯-藝術家對獨一無二,因為專輯可能具有相同的名稱但屬於不同的藝術家(fe “Greatest Hits ” 2Pac 專輯和 Notorious BIG 的“Greatest Hits”)。
有沒有已知的方法/模式來解決這個問題?
最簡單且可能最常見的方法是將*(album_id, artist_id)*列對聲明為唯一的複合鍵。
這種方法有兩種變體。首先,您可以保留album_artist表的目前結構,只需在上述兩列上添加唯一約束:
ALTER TABLE album_artist ADD CONSTRAINT uq_album_artist UNIQUE (album_id, artist_id);
添加 UNIQUE 約束有更多選項,可以在連結的手冊中找到。
第二種變體是去掉id列並聲明*(album_id, artist_id)*為表的主鍵,正如Rick James在評論中所建議的那樣:
ALTER TABLE album_artist DROP PRIMARY KEY; /* assuming id has actually been declared as the PK; if not, omit this step */ ALTER TABLE album_artist DROP id; ALTER TABLE album_artist ADD CONSTRAINT pk_album_artist PRIMARY KEY (album_id, artist_id);
像您的album_artist表這樣的聯結表,除了表引用之外不儲存任何附加資訊,通常不需要被其他表引用——至少,不足以證明需要專用ID 列的必要性。因此,第二種變化可能更合適。Rick 關於實現聯結表的其他有用想法可以在他的部落格中找到。
如果另一個表需要引用專輯和藝術家作為有效組合(即存在於聯結表中的組合),它可以簡單地使用複合外鍵來引用album_artist:
FOREIGN KEY (album_id, artist_id) REFERENCES album_artist (album_id, artist_id)
只有當您需要經常引用聯結表(即從許多表中)時,我才會認為第一種方法(允許您在聯結表中保留一個專用的 PK 列)會更有用。