Malheureusement, je n'ai pas assez de représentant pour commenter la réponse de ypercubeᵀᴹ , donc je posterai une réponse alternative à la place - je suis d'accord avec cette réponse en général, mais je pense que la clé primaire et les contraintes uniques AlbumTrack
sont incorrectes étant donné que les albums et les pistes sont tous deux faibles entités. Par exemple, les données valides suivantes seraient, avec les contraintes prescrites, interdites:
artistID | albumID | trackID | trackNo
----------+---------+---------+---------
1 | 1 | 1 | 1
2 | 1 | 1 | 1
Au lieu de cela, je définirais PRIMARY KEY (artistID, albumID, trackID)
et supprimerais la contrainte unique, ce qui entraînerait:
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)
) ;
Les morceaux sont toujours contraints de se produire au plus une fois par album.
De plus, la question ne spécifie pas réellement que les pistes sont des entités faibles (seulement que les albums le sont) - si les pistes peuvent en fait exister indépendamment des artistes, les tableaux Track
et AlbumTrack
sont définis légèrement différemment:
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
clé étrangère qui fait référence à l'artiste. Si vous souhaitez qu'une seule piste soit mappée sur plusieurs albums, utilisez une table de mappage avectrack_id, album_id
. Facile :)