2011-09-05 11 views
6

हाय वहाँ डेटाबेस डिजाइन के बारे में मेरा एक छोटा सवाल है। मैंने खोज की भी कोशिश की लेकिन मैं जो खोज रहा हूं उसे नहीं मिल सका। तो यहाँ मेरी सवाल यह है:1: एन रिश्ते जहां एन कम से कम एक प्रविष्टि होना चाहिए

मैं दो डेटाबेस तालिकाओं आइडिया और मीडिया है (1: एन)। तो मूल रूप से इसका मतलब है कि एक विचार में कोई भी, एक या कई माध्यम नहीं हो सकता है। लेकिन मैंने खुद से पूछा कि क्या तालिका को परिभाषित करना संभव है कि प्रत्येक विचार में कम से कम एक मीडिया होना चाहिए। यदि यह संभव है तो मैं इसे एमएस एसक्यूएल सर्वर 2008 के साथ कैसे प्राप्त कर सकता हूं?

मुझे उम्मीद है कि कोई मेरी मदद कर सकता है। आपकी मदद के लिए

Thx बहुत

अद्यतन: यह है कि क्या यह इस समय की तरह लग रहा है: करने के लिए आइडिया में

enter image description here

+2

मुझे यकीन नहीं है कि आप एक अलग तालिका में 'मीडिया' रखने के साथ ऐसा कैसे कर सकते हैं: आप डेटा कैसे डालेंगे? आपको पहले एक टेबल में, फिर दूसरे में डालना होगा। आप क्या कर सकते हैं पहला 'मीडिया' को 'आइडिया' (डी-सामान्यीकरण) में डालकर और फ़ील्ड को 'शून्य नहीं' घोषित करना है - लेकिन मैं इसकी अनुशंसा नहीं करता। डेटाबेस के बजाए कोड में कुछ तर्क के साथ आप बेहतर हो सकते हैं। –

+0

मैं Aleks से सहमत हूं। मुझे लगता है कि यह एक व्यापार नियम है जो कहीं भी मध्यम स्तर पर है, डेटाबेस में नहीं। – David

+0

@ आइडिया से मीडिया तक एफके नॉट को जोड़ने वाले एलेक्स असामान्य नहीं हैं। यह आसान है, और हाँ उसे पहले मीडिया को पॉप्युलेट करने की आवश्यकता होगी। – vol7ron

उत्तर

2

सबसे पहले, अंगूठे का एक डिज़ाइन नियम है कि एक टेबल मॉडल या तो एक इकाई प्रकार या इकाई प्रकारों के बीच संबंध है लेकिन दोनों नहीं। इसलिए, मैं तीन टेबल, 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 की कमी का उल्लेख कर सकते का समर्थन नहीं करता!

  • बनाएँ 'सहायक' संग्रहीत procs, जोड़ने में संशोधन और Ideas और उनके संबंधित IdeasMedia रिश्तों को दूर करने के:

    व्यक्तिगत रूप से, मैं इस प्रकार एसक्यूएल सर्वर में इस संभाल होगा।

  • उपयोगकर्ताओं को procs का उपयोग करने के लिए मजबूर करने के लिए तालिकाओं से अपडेट विशेषाधिकार निकालें।
  • संभावित रूप से Media और Idea इकाइयों को हटाते समय परिदृश्यों को संभालने के लिए ट्रिगर्स का उपयोग करें। 1..N संबंध और बदले:

निश्चित रूप से, यह (फिर से प्रक्रियात्मक) कार्यान्वयन दूर आदर्श सेट-आधारित दृष्टिकोण है, जो शायद यही कारण है सबसे एसक्यूएल कोडर एक 1 के लिए एक आवश्यकता को नजरअंदाज कर देते हैं से निकाल दिया जाता डिजाइनर का मानना ​​है कि 1: 0..एन !!

+0

अरे आजकल आपके वास्तव में महान उत्तर के लिए धन्यवाद !!! आपका जवाब बहुत व्यापक है और मेरी समस्या के समाधान को प्राप्त करने के लिए विभिन्न दृष्टिकोणों का वर्णन करता है। मैं वास्तव में उसकी सराहना करता हूँ। यहां तक ​​कि सभी समाधान बहुत बदसूरत हैं। मैंने इसे अपने व्यापार तर्क में संभालने का फैसला किया है। और व्याकरण सुधार के लिए thx;) – MUG4N

1

आप एक FK (विदेशी कुंजी) बनाने PK (प्राथमिक कुंजी) मीडिया में। साथ ही एफके में NOT NULL बाधा लागू करें।

आप पहले से ही तालिका में डेटा है, तो see here


इसे समझने के लिए:

Media    Idea 
-----    ---- 
id | type   id | description  | media_id 
----+-----   ----+-------------------+---------- 
1 | TV    90 | advertise  | 2 
2 | Magazine  90 | advertise  | 1 
3 | Mail   91 | superbowl party | 1 
        91 | superbowl party | 3 

मैं यह नहीं कह रहा हूँ इस महान डिजाइन है, और मैं निश्चित रूप से नहीं पता है कि अपने टेबल भंडारित कर रहे हैं (मेरे खराब उदाहरण से संकेतित), लेकिन विचार लिंक करने के लिए w/oa मीडिया प्रविष्टि मौजूद नहीं हो सकता है। आगे और पीछे कोई लिंक नहीं है, आप 1: एन, एन: एन नहीं पूछ रहे हैं, जिसे आप चाहें।

तालिका के नामों के बारे में सोचते समय, ऐसा लगता है कि आपका विचार पीछे की तरफ है। मुझे लगता है कि आपके पास 1 होगा: मीडिया से एन: अन्य तरीकों के बजाय विचार।


CREATE TABLE idea (
    id  integer 
    , media_id integer NOT NULL REFERENCES media 
) 

--or-- 

CREATE TABLE idea (
    id   integer 
    , media_id NOT NULL 
    , FOREIGN KEY (media_id) REFERENCES media 
); 

नोट: ताकि आप एक तिहाई तालिका संयोजन के मैच के लिए की आवश्यकता होगी यह, सामान्यीकृत नहीं है।

+1

तो दो तालिकाओं में एक दूसरे के लिए विदेशी कुंजी है? यह अजीब तरह का होगा? और यह Aleks G. – David

+0

द्वारा निर्दिष्ट 'चिकन और अंडा' समस्या से भी पीड़ित है इसका मतलब है पार संदर्भ ... मैंने क्रॉस संदर्भों के बारे में बुरी चीजें सुनी हैं। क्या यह एक आम सबसे अच्छा अभ्यास है? या इस स्थिति के लिए कुछ सर्वोत्तम अभ्यास हैं? – MUG4N

+0

@ डेविड आपका क्या मतलब है, आप एक दूसरे के लिए एफके क्यों करेंगे, आइडिया से मीडिया – vol7ron

संबंधित मुद्दे