Infelizmente, não tenho representante suficiente para comentar a resposta do ypercubeᵀᴹ , por isso vou postar uma resposta alternativa - concordo com essa resposta em geral, mas acho que a chave primária e as restrições exclusivas AlbumTrack
estão incorretas, uma vez que os álbuns e as faixas são fracos entidades. Por exemplo, os seguintes dados válidos seriam proibidos, com as restrições prescritas:
artistID | albumID | trackID | trackNo
----------+---------+---------+---------
1 | 1 | 1 | 1
2 | 1 | 1 | 1
Em vez disso, eu definiria PRIMARY KEY (artistID, albumID, trackID)
e eliminaria a restrição exclusiva, resultando em:
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)
) ;
As faixas ainda estão limitadas a ocorrer no máximo uma vez por álbum.
Além disso, a questão não especifica que as faixas são entidades fracas (apenas os álbuns) - se as faixas podem existir independentemente dos artistas, as tabelas Track
e AlbumTrack
são definidas de maneira um pouco 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
chave estrangeira que faz referência ao artista. Se você deseja que uma única faixa seja mapeada para vários álbuns, use uma tabela de mapeamento comtrack_id, album_id
. Fácil :)