残念ながらypercubeᵀᴹの答えにコメントするのに十分な担当者がいないので、代わりに別の答えを投稿します-一般的にその答えに同意しますが、AlbumTrack
アルバムとトラックの両方が弱いので、主キーと一意の制約は間違っていると思いますエンティティ。たとえば、次の有効なデータは、規定の制約により禁止されます。
artistID | albumID | trackID | trackNo
----------+---------+---------+---------
1 | 1 | 1 | 1
2 | 1 | 1 | 1
代わりにPRIMARY KEY (artistID, albumID, trackID)
、一意の制約を設定および削除して、次のようにします。
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)
) ;
トラックは、アルバムごとに1回しか発生しないように制限されています。
また、質問はトラックが弱いエンティティであることを実際に指定していません(アルバムのみ)-実際にトラックがアーティストとは無関係に存在できる場合Track
、AlbumTrack
テーブルとテーブルはわずかに異なって定義されます:
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
、アーティストを参照する外部キーを取得できます。単一のトラックを複数のアルバムにマッピングする場合は、でマッピングテーブルを使用しtrack_id, album_id
ます。簡単:)