दुर्भाग्य से मेरे पास ypercube answer के उत्तर पर टिप्पणी करने के लिए पर्याप्त प्रतिनिधि नहीं है , इसलिए मैं इसके बजाय एक वैकल्पिक उत्तर पोस्ट करूंगा - मैं सामान्य रूप से उस उत्तर से सहमत हूं, लेकिन लगता है कि प्राथमिक कुंजी और अद्वितीय संदर्भ 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
। आसान :)