불행히도 나는 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)
) ;
트랙은 여전히 앨범 당 최대 한 번 발생하도록 제한되어 있습니다.
또한이 질문은 실제로 트랙이 약한 엔티티 (앨범 만 있음)임을 지정하지 않습니다. 실제로 트랙이 아티스트와 독립적으로 존재할 수 있으면 테이블 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
. Easy :)