Leider habe ich nicht genug Repräsentanten, um Kommentare abzugeben um die Antwort ypercube , daher werde ich stattdessen eine alternative Antwort posten. Ich stimme dieser Antwort im Allgemeinen zu, denke jedoch, dass der Primärschlüssel und die eindeutigen Einschränkungen AlbumTrack
falsch sind, da Alben und Tracks beide schwach sind Entitäten. Beispielsweise würden die folgenden gültigen Daten mit den vorgeschriebenen Einschränkungen nicht zugelassen:
artistID | albumID | trackID | trackNo
----------+---------+---------+---------
1 | 1 | 1 | 1
2 | 1 | 1 | 1
Stattdessen würde ich setzen PRIMARY KEY (artistID, albumID, trackID)
die eindeutige Einschränkung und löschen, was zu Folgendem führt:
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)
) ;
Titel dürfen weiterhin höchstens einmal pro Album vorkommen.
Außerdem gibt die Frage nicht an, dass Tracks schwache Entitäten sind (nur Alben). Wenn Tracks tatsächlich unabhängig von Interpreten existieren können, werden die Track
und AlbumTrack
-Tabellen leicht unterschiedlich definiert:
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
Fremdschlüssel, der auf den Künstler verweist. Wenn Sie möchten, dass ein einzelner Titel mehreren Alben zugeordnet wird, verwenden Sie eine Zuordnungstabelle mittrack_id, album_id
. Easy :)