कई से कई और कमजोर संस्थाएँ


16

मेरे पास एक इकाई है जो किसी अन्य द्वारा परिभाषित किए बिना मौजूद नहीं हो सकती है, और मैं चाहता हूं कि यह इकाई कई-कई संबंधों में भाग ले।

उदाहरण: एक कलाकार के पास एक एल्बम होता है (एल्बम कलाकार के बिना मौजूद नहीं हो सकता), एल्बम में कई ट्रैक भी होते हैं, लेकिन एक ही ट्रैक कई एल्बमों में मौजूद हो सकता है।

इसलिए हम एल्बम और पटरियों के बीच कई-कई संबंध हैं।

यदि एल्बम एक कमजोर इकाई है, तो इसकी प्राथमिक कुंजी कलाकार को संदर्भित करने वाली एक विदेशी कुंजी है, इस प्रकार यह कई-से-कई संबंधों का प्रतिनिधित्व करने वाली एक अन्य तालिका के लिए एक विदेशी कुंजी नहीं हो सकती है।

सवाल यह है कि क्या एसक्यूएल में इस तरह का संबंध होना संभव है, और यदि हां, तो मैं इसे कैसे व्यक्त करूं?


नहीं, एल्बम प्राथमिक कुंजी केवल एक पूर्णांक होगा जो एल्बम को विशिष्ट बनाता है। फिर आपके पास एक artist_idविदेशी कुंजी हो सकती है जो कलाकार को संदर्भित करती है। यदि आप एकल ट्रैक को कई एल्बमों में मैप करना चाहते हैं तो मैपिंग टेबल का उपयोग करें track_id, album_id। आसान :)
फिलो

जवाबों:


16

मुझे लगता है कि आप "डायमंड" संबंध आरेख का उपयोग कर सकते हैं:

आरेख

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 (albumID, trackNo)
, FOREIGN KEY (artistID, albumID)
    REFERENCES Album (artistID, albumID)
, FOREIGN KEY (artistID, trackID)
    REFERENCES Track (artistID, trackID)
, UNIQUE (trackID, albumID)               -- this Unique constraint should be added
                                          -- if no track is allowed twice in an album
) ;

1
+1 क्या यह आपके लिए एल्बमट्रैक तालिका में निम्नलिखित अद्वितीय बाधाओं को जोड़ने के लिए समझ में आएगा: (ट्रैकआईडी, एल्बमआईडी) और (एल्बमआईडी, ट्रैकनो)?
AK

@AlexKuznetsov आप सही हैं, thnx मैं आपके सुझाए गए PK को "छोटा" कर दूंगा (albumID, trackNo)और दूसरे अद्वितीय अवरोध भी जोड़ूंगा।
ypercube y

1
उन एल्बमों की अनुमति देना याद रखें, जिनमें कोई एकल नाममात्र कलाकार नहीं है, या तो "विभिन्न" या इसी तरह का एक डमी कलाकार है या एल्बम तालिका के कलाकार स्तंभ को अशक्त बनाकर। वास्तव में, आपके पास प्रति ट्रैक एक से अधिक कलाकार हो सकते हैं, इसलिए आपको वहां भी कई-कई व्यवस्थाओं की आवश्यकता हो सकती है।
डेविड स्पिललेट

1
@DavidSpillett हां, हम ऐसा कर सकते थे लेकिन यह चीजों को उलझा देगा और पूछे जाने वाले प्रश्न को बना देगा। प्रश्न मानता है / हुक्म देता है कि हर एल्बम में एक ही कलाकार है। प्रति ट्रैक अलग कलाकारों के लिए संभव नहीं है, न ही प्रति एल्बम या ट्रैक के कई कलाकार। यह वास्तव में वास्तविक दुनिया का बहुत अच्छा प्रतिनिधित्व नहीं है।
ypercube y

1
@TimAbell मुझे लगता है कि यह वर्कबेन्च का एक हादसा है जहाँ आरेख बनाए गए थे (पीके में स्तंभों के आदेश के कारण इसे एल्बम-एल्बमट्रैक कनेक्शन के समान नहीं पहचानते)
ypercube

2

दुर्भाग्य से मेरे पास 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)
) ;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.