অনেক থেকে অনেক এবং দুর্বল সত্তা


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 অ্যালবাম ট্র্যাক সারণিতে নিম্নলিখিত অনন্য সীমাবদ্ধতাগুলি যুক্ত করা কি আপনার কাছে বোধগম্য হবে: (ট্র্যাকআইডি, অ্যালবামআইডি) এবং (অ্যালবামআইডি, ট্র্যাকনো)?
এ কে

@ অ্যালেক্সকুজনসভ আপনি ঠিক আছেন, ধন্যবাদ আমি আপনার প্রস্তাবিত পিকেটিকে "সঙ্কুচিত" করব (albumID, trackNo)এবং অন্যান্য অনন্য বাধাও যুক্ত করব।
ypercubeᵀᴹ

1
"বিভিন্ন" বা অনুরূপ ডামি শিল্পী থাকার দ্বারা বা অ্যালবামের টেবিলের শিল্পী কলামকে নলাবদ্ধ করে অ্যালবামগুলিতে অনুমতি দেওয়ার কথা মনে রাখবেন no প্রকৃতপক্ষে, আপনি ট্র্যাক প্রতি একাধিক শিল্পী থাকতে পারে, তাই আপনার সেখানেও অনেকগুলি থেকে বহু ব্যবস্থার প্রয়োজন হতে পারে।
ডেভিড স্পিললেট 13

1
@ ডেভিডস্পিলিট হ্যাঁ, আমরা এটি করতে পারতাম তবে এটি বিষয়গুলিকে জটিল করে তুলবে এবং জিজ্ঞাসা করা ফর্মটিকে বিচ্যুত করবে। প্রশ্নটি ধরে নেয় / নির্দেশ দেয় যে প্রতিটি অ্যালবামে একটি শিল্পী থাকে। ট্র্যাক প্রতি আলাদা শিল্পী পাওয়া সম্ভব নয়, অ্যালবাম বা ট্র্যাকের জন্য অনেক শিল্পীও নেই। এটি সত্যিকারের বিশ্বের খুব ভাল উপস্থাপনা নয়।
ypercubeᵀᴹ

1
@ টিমএবেল আমি মনে করি এটি ওয়ার্কবেঞ্চের একটি দুর্ঘটনা যেখানে ডায়াগ্রামগুলি তৈরি করা হয়েছিল (পিকেগুলিতে কলামের ক্রমের কারণে এটি অ্যালবাম-অ্যালবামট্র্যাক সংযোগ হিসাবে একই স্বীকৃতি দেয় না)
ypercubeᵀᴹ

2

দুর্ভাগ্যক্রমে 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)
) ;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.