2013-02-23 78 views
8

इसलिए मैं वास्तव में जिस तरह से इस ERD यह दर्शाया गया है इस स्कीमा + संबंध बनाने करना चाहिए। यहाँ मैं केवल तालिकाओं है कि मैं के साथ समस्याओं कर रहा हूँ दिखाने:बनाना PostgreSQL तालिकाओं + संबंध - रिश्तों के साथ समस्याओं - आमने-सामने की

I am supposed to have ONE TO ONE but I get ONE TO MANY

तो मैं यह एक करने के लिए एक बनाने के लिए कोशिश कर रहा हूँ, लेकिन किसी कारण से, कोई फर्क नहीं पड़ता कि मैं क्या बदलने के लिए, मैं एक कई लोगों के लिए जो कुछ भी मिलता है पर तालिका में विदेशी कुंजी है।

यह इन दो तालिकाओं के लिए अपने एसक्यूएल है।

 CREATE TABLE lab4.factory(

      factory_id  INTEGER   UNIQUE, 
      address   VARCHAR(100) NOT NULL, 
      PRIMARY KEY (factory_id) 

     ); 

     CREATE TABLE lab4.employee(

      employee_id  INTEGER   UNIQUE, 
      employee_name VARCHAR(100) NOT NULL, 
      factory_id  INTEGER   REFERENCES  lab4.factory(factory_id), 
      PRIMARY KEY (employee_id) 

     ); 

यहां मुझे वही चीज़ मिलती है। मुझे एक रिश्ते नहीं मिल रहा है, लेकिन कई लोगों में से एक है। चालान रेखा एक कमजोर इकाई है।

it needs to be ONE TO ONE

और यहाँ दूसरी छवि के लिए अपने कोड है।

 CREATE TABLE lab4.product(

      product_id  INTEGER  PRIMARY KEY, 
      product_name INTEGER  NOT NULL 

     ); 


     CREATE TABLE lab4.invoiceLine(

      line_number  INTEGER  NOT NULL, 
      quantity  INTEGER  NOT NULL, 
      curr_price  INTEGER  NOT NULL, 
      inv_no   INTEGER  REFERENCES  invoice, 
      product_id  INTEGER  REFERENCES  lab4.product(product_id), 
      PRIMARY KEY (inv_no, line_number) 

     ); 

मैं किसी भी मदद की सराहना करता हूं। धन्यवाद।

+1

आप 1: 1 रिलेशनशिप मॉडल करने की अपेक्षा कैसे करते हैं? विदेशी कुंजी कॉलम पर 'अद्वितीय' बाधा के साथ? एक पारस्परिक deferrable विदेशी कुंजी बाधा के साथ? –

+0

@ क्रेग्रिंजर, काश मैं आपके प्रश्न का उत्तर देने के लिए ज्ञान आधार था, लेकिन मैं अपनी पहली डीबी कक्षा में बस कुछ व्याख्यान हूं। मेरे प्रश्न निम्नलिखित हैं: मैं एक से एक रिश्ते को कैसे बना सकता हूं? किसी कारण से, हमने मुख्य रूप से कई लोगों के बारे में बात की और कई –

उत्तर

22

एक-से-एक अच्छी तरह से मानक SQL में एक प्रथम श्रेणी संबंध प्रकार के रूप में प्रतिनिधित्व नहीं है। एक से अधिक लोगों की तरह, जो एक कनेक्टर टेबल और दो से कई रिश्तों का उपयोग करके हासिल किया जाता है, एसक्यूएल में कोई भी "एक से एक" सत्य नहीं है।

  • (शैली "कई लोगों के लिए एक") एक साधारण विदेशी कुंजी बाधा बनाएं और फिर चर्चा करते हुए FK स्तंभ पर एक UNIQUE बाधा जोड़ें:

    पास कुछ विकल्प होते हैं। इसका अर्थ यह है कि रेफरिंग कॉलम में संदर्भित मानों में से एक से अधिक दिखाई नहीं दे सकता है, जिससे इसे एक-से-एक वैकल्पिक बना दिया जा सकता है। यह एक काफी सरल और काफी क्षमाशील दृष्टिकोण है जो अच्छी तरह से काम करता है।

  • एक सामान्य FK रिश्ता है कि मॉडल सकता है 1 का उपयोग करें: मी, और अपने अनुप्रयोग यह केवल कभी 1 है सुनिश्चित करते हैं: 1 व्यवहार में। मैं इस अनुशंसा नहीं करते हैं, वहाँ FK अद्वितीय सूचकांक जोड़ने के लिए केवल एक छोटा सा लिखने प्रदर्शन नकारात्मक पक्ष है और यह डेटा मान्यता सुनिश्चित, एप्लिकेशन कीड़े मिल जाए, और किसी और जो बाद में स्कीमा को संशोधित करने की जरूरत है भ्रामक से बचने में मदद करता है।

  • पारस्परिक विदेशी कुंजी बनाएँ - संभव अपने डेटाबेस deferrable विदेशी कुंजी की कमी का समर्थन करता है केवल यदि। यह कोड के लिए थोड़ा अधिक जटिल है, लेकिन आपको एक-से-एक अनिवार्य संबंधों को लागू करने की अनुमति देता है। प्रत्येक इकाई के पास एक अद्वितीय कॉलम में दूसरों के पीके के लिए एक विदेशी कुंजी संदर्भ होता है। एक या दोनों बाधाओं को DEFERRABLE और INITIALLY DEFERRED होना चाहिए या SET CONSTRAINTS कॉल के साथ उपयोग किया जाना चाहिए, क्योंकि आपको परिपत्र निर्भरता सेट अप करने के लिए बाधाओं में से किसी एक को रोकना होगा। यह एक काफी उन्नत तकनीक है जो अनुप्रयोगों के विशाल बहुमत के लिए आवश्यक नहीं है।

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

+0

पर मेरे मामले में, फैक्ट्री_आईडी को अनन्य होना होगा क्योंकि मुझे कर्मचारी तालिका द्वारा संदर्भित किया जा रहा है? –

+0

@GeorgiAngelov हां, 'lab4.employee.factory_id' * रेफरिंग साइड * को' अद्वितीय 'चिह्नित किया जा सकता है। इसके बारे में सोचें: अनन्य एक एफके कॉलम निर्दिष्ट पीके कॉलम के प्रत्येक मान में से एक पर हो सकता है। जब आप उस नाम का उपयोग एक से अधिक स्थानों पर करते हैं तो बस 'फैक्ट्री_आईडी' कहकर एक हवाई अड्डे पर "क्वांटस प्लेन पर जाएं" कहने की तरह है - * कौन सा विमान? * ध्यान दें कि यह एक रिश्ते बनाता है जो संदर्भित तरफ * वैकल्पिक * है ; * अधिकतर * एक कर्मचारी कारखाने का प्रबंधन कर सकता है, लेकिन किसी भी कारखाने में प्रबंधक होने की कोई आवश्यकता नहीं है। –

+0

धन्यवाद। यह वास्तव में चीजों को स्पष्ट करता है। तुम्हारी सहायता सराहनीय है। –