सबसे पहले, अंगूठे का एक डिज़ाइन नियम है कि एक टेबल मॉडल या तो एक इकाई प्रकार या इकाई प्रकारों के बीच संबंध है लेकिन दोनों नहीं। इसलिए, मैं तीन टेबल, Media
(इकाई), Idea
(इकाई) और IdeasMedia
(रिश्ते) की कल्पना करता हूं। अनुलेख आप जानते हैं कि 'मीडिया' का एकवचन 'मध्यम' है, है ना? :)
यहाँ कुछ मानक SQL-92 DDL है कि केवल चाबियाँ पर केंद्रित है:
CREATE TABLE Media (MediaID INTEGER NOT NULL UNIQUE);
CREATE TABLE Idea (IdeaID INTEGER NOT NULL UNIQUE);
CREATE TABLE IdeasMedia
(
MediaID INTEGER NOT NULL REFERENCES Media (MediaID),
IdeaID INTEGER NOT NULL REFERENCES Idea (IdeaID)
);
CREATE ASSERTION Idea_must_have_media DEFERRABLE
CHECK (
NOT EXISTS (
SELECT *
FROM Idea AS i
WHERE NOT EXISTS (
SELECT *
FROM IdeasMedia AS im
WHERE im.MediaID = i.IdeaID
)
)
);
वहाँ एक 'चिकन और अंडे' यहाँ परिदृश्य है: एक को संदर्भित IdeasMedia
लेकिन कर सकते हैं बिना साथ एक विचार नहीं बना सकते Idea
बनाये बिना IdeasMedia
बनाएं!
आदर्श (सेट-आधारित) समाधान एकाधिक असाइनमेंट का समर्थन करने के लिए SQL मानक के लिए होगा।
INSERT INTO Media (MediaID) VALUES (22),
INSERT INTO Idea (IdeaID) VALUES (55),
INSERT INTO IdeasMedia (MediaID, IdeaID) VALUES (22, 55);
जहां अर्धविराम SQL विवरण सीमा जिस बिंदु पर बाधाओं जाँच कर रहे हैं और अल्पविराम के उप बयान को संकेतित करते इंगित करता है।
अफसोस की बात है, इस मानक-आधारित प्रतिमान को SQL मानक में जोड़ने की कोई योजना नहीं है।
SQL-92 (प्रक्रियात्मक) इस का हल इस प्रकार है:
BEGIN TRANSACTION;
INSERT INTO Media (MediaID) VALUES (22);
SET CONSTRAINTS Idea_must_have_media DEFERRED;
-- omit the above if the constraint was declared as INITIALLY DEFERRED.
INSERT INTO Idea (IdeaID) VALUES (55);
INSERT INTO IdeasMedia (MediaID, IdeaID) VALUES (55, 22);
SET CONSTRAINTS Idea_must_have_media IMMEDIATE;
-- above may be omitted: constraints are checked at commit anyhow.
COMMIT TRANSACTION;
दुःख की बात है एसक्यूएल सर्वर CREATE ASSERTION
है और न ही CHECK
की कमी है कि अन्य तालिकाओं और न ही deferrable की कमी का उल्लेख कर सकते का समर्थन नहीं करता!
निश्चित रूप से, यह (फिर से प्रक्रियात्मक) कार्यान्वयन दूर आदर्श सेट-आधारित दृष्टिकोण है, जो शायद यही कारण है सबसे एसक्यूएल कोडर एक 1 के लिए एक आवश्यकता को नजरअंदाज कर देते हैं से निकाल दिया जाता डिजाइनर का मानना है कि 1: 0..एन !!
मुझे यकीन नहीं है कि आप एक अलग तालिका में 'मीडिया' रखने के साथ ऐसा कैसे कर सकते हैं: आप डेटा कैसे डालेंगे? आपको पहले एक टेबल में, फिर दूसरे में डालना होगा। आप क्या कर सकते हैं पहला 'मीडिया' को 'आइडिया' (डी-सामान्यीकरण) में डालकर और फ़ील्ड को 'शून्य नहीं' घोषित करना है - लेकिन मैं इसकी अनुशंसा नहीं करता। डेटाबेस के बजाए कोड में कुछ तर्क के साथ आप बेहतर हो सकते हैं। –
मैं Aleks से सहमत हूं। मुझे लगता है कि यह एक व्यापार नियम है जो कहीं भी मध्यम स्तर पर है, डेटाबेस में नहीं। – David
@ आइडिया से मीडिया तक एफके नॉट को जोड़ने वाले एलेक्स असामान्य नहीं हैं। यह आसान है, और हाँ उसे पहले मीडिया को पॉप्युलेट करने की आवश्यकता होगी। – vol7ron