Desafortunadamente, no tengo suficiente representante para comentar la respuesta de ypercubeᵀᴹ , por lo que publicaré una respuesta alternativa en su lugar, estoy de acuerdo con esa respuesta en general, pero creo que la clave principal y las contracciones únicas AlbumTrack
son incorrectas dado que los álbumes y las pistas son débiles entidades. Por ejemplo, los siguientes datos válidos serían, con las restricciones prescritas, no permitidos:
artistID | albumID | trackID | trackNo
----------+---------+---------+---------
1 | 1 | 1 | 1
2 | 1 | 1 | 1
En cambio, establecería PRIMARY KEY (artistID, albumID, trackID)
y soltaría la restricción única, lo que resultaría en:
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)
) ;
Las pistas todavía están limitadas a ocurrir como máximo una vez por álbum.
Además, la pregunta en realidad no especifica que las pistas son entidades débiles (solo que los álbumes lo son): si las pistas pueden existir independientemente de los artistas, las tablas Track
y AlbumTrack
se definen de manera ligeramente diferente:
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
clave externa que hace referencia al artista. Si desea asignar una sola pista a varios álbumes, utilice una tabla de asignación contrack_id, album_id
. Fácil :)