น่าเสียดายที่ฉันมีตัวแทนไม่เพียงพอที่จะแสดงความคิดเห็นในคำตอบของ ypercube so ดังนั้นฉันจะโพสต์คำตอบอื่นแทน - ฉันเห็นด้วยกับคำตอบทั่วไป แต่คิดว่าคีย์หลักและข้อ จำกัด เฉพาะ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
ถ้าคุณต้องการให้ทางเดียวที่จะแมปไปหลายอัลบั้มแล้วใช้ตารางการทำแผนที่ด้วย ง่าย :)