Ne yazık ki ypercubeᵀᴹ'un cevabı hakkında yorum yapmak için yeterli temsilcim yok , bu yüzden alternatif bir cevap göndereceğim - genel olarak bu cevaba katılıyorum, ancak AlbumTrack
albümlerin ve parçaların her ikisinin de zayıf olduğu göz önüne alındığında birincil anahtarın ve benzersiz kontraksiyonların yanlış olduğunu düşünüyorum varlıklar. Örneğin, aşağıdaki geçerli verilere, öngörülen kısıtlamalarla izin verilmez:
artistID | albumID | trackID | trackNo
----------+---------+---------+---------
1 | 1 | 1 | 1
2 | 1 | 1 | 1
Bunun yerine PRIMARY KEY (artistID, albumID, trackID)
, benzersiz kısıtlamayı ayarlayıp bıraktım , sonuç olarak:
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)
) ;
Parçaların her albüm için en fazla bir kez olmaya devam etmesi sınırlıdır.
Ayrıca, soru aslında parçaların zayıf varlıklar olduğunu belirtmez (sadece albümler) - parçalar sanatçılardan bağımsız olarak mevcutsa, Track
ve AlbumTrack
tabloları biraz farklı tanımlanır:
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
sanatçıyı referans alan yabancı bir anahtarınız olabilir . Tek bir parçanın birden fazla albüme eşlenmesini istiyorsanız ile eşleme tablosu kullanıntrack_id, album_id
. Kolay :)