Sayangnya saya tidak punya cukup perwakilan untuk mengomentari jawaban ypercubeᵀᴹ , jadi saya akan mengirim jawaban alternatif sebagai gantinya - Saya setuju dengan jawaban itu secara umum, tetapi saya pikir kunci primer dan kendala unik AlbumTrack
salah karena album dan trek keduanya lemah. entitas. Misalnya, data yang valid berikut akan, dengan batasan yang ditentukan, dilarang:
artistID | albumID | trackID | trackNo
----------+---------+---------+---------
1 | 1 | 1 | 1
2 | 1 | 1 | 1
Sebagai gantinya saya akan mengatur PRIMARY KEY (artistID, albumID, trackID)
dan menjatuhkan batasan unik, menghasilkan:
CREATE TABLE Artist
( artistID INT NOT NULL
, name VARCHAR(100) NOT NULL
, PRIMARY KEY (artistID)
) ;
CREATE TABLE Album
( artistID INT NOT NULL
, albumID INT NOT NULL
, title VARCHAR(100) NOT NULL
, PRIMARY KEY (artistID, albumID)
, FOREIGN KEY (artistID)
REFERENCES Artist (artistID)
) ;
CREATE TABLE Track
( artistID INT NOT NULL
, trackID INT NOT NULL
, title VARCHAR(100) NOT NULL
, PRIMARY KEY (artistID, trackID)
, FOREIGN KEY (artistID)
REFERENCES Artist (artistID)
) ;
CREATE TABLE AlbumTrack
( artistID INT NOT NULL
, albumID INT NOT NULL
, trackID INT NOT NULL
, trackNo INT NOT NULL
, PRIMARY KEY (artistID, albumID, trackID)
, FOREIGN KEY (artistID, albumID)
REFERENCES Album (artistID, albumID)
, FOREIGN KEY (artistID, trackID)
REFERENCES Track (artistID, trackID)
) ;
Lagu masih dibatasi untuk muncul paling banyak satu kali per album.
Selain itu, pertanyaannya tidak benar-benar menentukan bahwa trek adalah entitas yang lemah (hanya itu albumnya) - jika trek sebenarnya bisa ada terlepas dari artis, Track
dan AlbumTrack
tabel didefinisikan sedikit berbeda:
CREATE TABLE Track
( trackID INT NOT NULL
, artistID INT
, title VARCHAR(100) NOT NULL
, PRIMARY KEY trackID
, FOREIGN KEY (artistID)
REFERENCES Artist (artistID)
) ;
CREATE TABLE AlbumTrack
( artistID INT NOT NULL
, albumID INT NOT NULL
, trackID INT NOT NULL
, trackNo INT NOT NULL
, PRIMARY KEY (artistID, albumID, trackID)
, FOREIGN KEY (artistID, albumID)
REFERENCES Album (artistID, albumID)
, FOREIGN KEY (trackID)
REFERENCES Track (trackID)
) ;
artist_id
kunci asing yang merujuk pada artis tersebut. Jika Anda ingin satu trek dipetakan ke beberapa album kemudian gunakan tabel pemetaan dengantrack_id, album_id
. Mudah :)