आप एक ऐसा डिज़ाइन करने का प्रयास कर रहे हैं जिसे बहुरूपी संघ . कहा जाता है . यही है, विदेशी कुंजी कई संबंधित तालिकाओं में पंक्तियों को संदर्भित कर सकती है।
लेकिन एक विदेशी कुंजी बाधा को बिल्कुल एक तालिका का संदर्भ देना चाहिए। आप एक विदेशी कुंजी घोषित नहीं कर सकते जो आपके Comments
के दूसरे कॉलम में मान के आधार पर विभिन्न तालिकाओं का संदर्भ देती है टेबल। यह रिलेशनल डेटाबेस डिज़ाइन के कई नियमों का उल्लंघन करेगा।
टिप्पणियों द्वारा संदर्भित एक प्रकार का "सुपरटेबल" बनाना एक बेहतर समाधान है।
CREATE TABLE Commentable (
id SERIAL PRIMARY KEY
);
CREATE TABLE Comments (
comment_id SERIAL PRIMARY KEY,
foreign_id INT NOT NULL,
...
FOREIGN KEY (foreign_id) REFERENCES Commentable(id)
);
आपके प्रत्येक सामग्री प्रकार को इस सुपरटेबल का उपप्रकार माना जाएगा। यह एक इंटरफ़ेस . की वस्तु-उन्मुख अवधारणा के अनुरूप है ।
CREATE TABLE BlogPosts (
blogpost_id INT PRIMARY KEY, -- notice this is not auto-generated
...
FOREIGN KEY (blogpost_id) REFERENCES Commentable(id)
);
CREATE TABLE UserPictures (
userpicture_id INT PRIMARY KEY, -- notice this is not auto-generated
...
FOREIGN KEY (userpicture_id) REFERENCES Commentable(id)
);
इससे पहले कि आप BlogPosts
. में एक पंक्ति सम्मिलित कर सकें या UserPictures
, आपको Commentable
. में एक नई पंक्ति डालनी होगी एक नई स्यूडोकी आईडी उत्पन्न करने के लिए। जब आप संबंधित उप-प्रकार तालिका में सामग्री सम्मिलित करते हैं तो आप उस उत्पन्न आईडी का उपयोग कर सकते हैं।
एक बार जब आप यह सब कर लेते हैं, तो आप संदर्भात्मक अखंडता बाधाओं पर भरोसा कर सकते हैं।