Mysql

基於多對多數據透視表的唯一鍵

  • May 1, 2016

我必須管理藝術家和專輯表:

| 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 列)會更有用。

引用自:https://dba.stackexchange.com/questions/136526