Thật không may, tôi không có đủ đại diện để nhận xét về câu trả lời của ypercubeᵀᴹ , vì vậy tôi sẽ đăng một câu trả lời thay thế - tôi đồng ý với câu trả lời đó nói chung nhưng nghĩ rằng khóa chính và các điều kiện độc đáo trên AlbumTrack
là không chính xác vì các album và bài hát đều yếu thực thể. Ví dụ: dữ liệu hợp lệ sau đây, với các ràng buộc được quy định, sẽ không được phép:
artistID | albumID | trackID | trackNo
----------+---------+---------+---------
1 | 1 | 1 | 1
2 | 1 | 1 | 1
Thay vào đó tôi sẽ thiết lập PRIMARY KEY (artistID, albumID, trackID)
và loại bỏ các ràng buộc duy nhất, dẫn đến:
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)
) ;
Các bản nhạc vẫn bị hạn chế xuất hiện nhiều nhất một lần cho mỗi album.
Ngoài ra, câu hỏi không thực sự xác định rằng các bản nhạc là các thực thể yếu (chỉ có album đó) - nếu trên thực tế các bản nhạc có thể tồn tại độc lập với các nghệ sĩ, thì các bảng Track
và AlbumTrack
được định nghĩa hơi khác nhau:
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
khóa ngoại tham chiếu đến nghệ sĩ. Nếu bạn muốn một bản nhạc duy nhất được ánh xạ tới nhiều album thì hãy sử dụng bảng ánh xạ vớitrack_id, album_id
. Dễ dàng :)