2013-02-21 12 views
11

क्या अंतर है? अगर मेरे पास ये दो टेबल हैं:क्या माता-पिता की मेज या बाल तालिका पर एक विदेशी कुंजी बनाई जानी चाहिए?

CREATE TABLE Account (Id int NOT NULL) 

CREATE TABLE Customer (AccountId int NOT NULL) 

और मैं दोनों को जोड़ने वाली एक विदेशी कुंजी चाहता हूं, मुझे निम्नलिखित में से कौन सा करना चाहिए और क्यों?

विकल्प 1:

ALTER TABLE [dbo].[Customer] WITH CHECK 
    ADD CONSTRAINT [FK_Accounts_Customers] FOREIGN KEY([AccountId]) 
    REFERENCES [dbo].[Account] ([Id]) 

विकल्प 2:

ALTER TABLE [dbo].[Account] WITH CHECK 
    ADD CONSTRAINT [FK_Accounts_Customers] FOREIGN KEY([Id]) 
    REFERENCES [dbo].[Customer] ([Id]) 
+0

मैं आमतौर पर इसे एक टेबल पर रखता हूं जो दूसरे के बिना नहीं रह सकता (जब यह लागू होता है)। लेकिन यह आपके प्रश्नों को सरल बनाने पर निर्भर करेगा, जो भी डेटा वैचारिक दृष्टिकोण से अधिक समझ में आता है ... और उन दो whatevers विपरीत भी हो सकता है। – entonio

उत्तर

1

मैं माता-पिता के लिए बच्चे से एक विदेशी कुंजी का प्रयोग करेंगे। बताने वाला सवाल यह है कि: यदि आप किसी एक इकाई को हटाना चाहते हैं तो क्या होगा?

+0

इस मामले में, यदि मैं एक ग्राहक को हटा देता हूं, तो मैं नहीं चाहता कि यह खातों पर कैस्केड हो, लेकिन यदि मैं खाता हटा देता हूं, तो इसे ग्राहकों को कैस्केड करना चाहिए। – scottm

+1

तो खाता ग्राहक के बिना रह सकता है लेकिन ग्राहक खाते के साथ नहीं रह सकता है। इस प्रकार ग्राहक को खाते को इंगित करना चाहिए, न कि दूसरे तरीके से। -> विकल्प 1 –

+1

@scottm आपको अपनी डेलेटी प्रक्रिया में तर्क लिखना चाहिए जो कैस्केड को संभालता है। मैं एक बड़ा प्रशंसक नहीं हूं - और वास्तव में भरोसा नहीं करता - वर्तमान में SQL सर्वर में उपलब्ध CASCADE विकल्प। –

4

संदर्भ पर निर्भर करता है। क्या प्रत्येक ग्राहक के पास ग्राहक होता है? माता-पिता कौन सा है? ऐसा लगता है कि एक खाते में कई ग्राहक हैं, इस मामले में संदर्भ ग्राहक तालिका पर संबंधित है।

अब कहा गया है, कृपया संस्थाओं को CustomerID और AccountID पर कॉल करें। यह प्राथमिक तालिका पर अनावश्यक प्रतीत हो सकता है लेकिन नाम पूरे मॉडल में सुसंगत होना चाहिए।

+5

नामकरण के बारे में एक हजार प्रतिशत समझौता। आपको पीके के लिए फील्ड नाम के रूप में आईडी का उपयोग नहीं करना चाहिए - हमेशा इकाई नाम के साथ उपसर्ग करें। ओआरएम का उपयोग करते समय यह विशेष रूप से महत्वपूर्ण होता है जो परंपरागत आधारित मैपिंग का उपयोग करते हैं, अक्सर यह होता है कि वे मॉडल को देखने की अपेक्षा करते हैं। नकारात्मकता यह है कि आपको जुड़ने के दौरान अपनी वस्तुओं को अर्हता प्राप्त करना है, लेकिन 'ए)' आपको वैसे भी ऐसा करना चाहिए और 'बी)' ओआरएम के साथ आप शायद अधिक/कोई टी-एसक्यूएल – Charleh

+2

नहीं लिखेंगे यदि आप उपयोग करना चाहते थे रेल और रेल-प्रेरित ढांचे जो सच नहीं हैं। उस स्थिति में जब आईडी प्राथमिक कुंजी होती है तो यह 'id' जैसी 'id' है - यह पर्याप्त है। जब विदेशी_की के रूप में संदर्भित किया जाता है तो आप 'accounts.customer_id' ऐसा करते हैं। – konung

0

एक एफके (विदेशी कुंजी) डीबीएमएस को बताता है कि कॉलम सूची के लिए सबरो के लिए मूल्यों को कॉलम सूची के लिए सबरो के मानों के रूप में कहीं और दिखाई देना चाहिए। जब भी ऐसा होता है (और यह पहले से ही अन्य घोषणाओं से निहित नहीं है) एफके घोषित करें। यदि जोड़ में आप संदर्भ फ़ाइल में परिवर्तन पर संदर्भित तालिका पर लागू एक कैस्केड कार्रवाई चाहते हैं, तो उसे घोषित करें।

(वहाँ CASCADE है कि यह गैर FK परिस्थितियों के लिए पेश नहीं किया जा सकता है के बारे में कुछ खास नहीं। यह सिर्फ अक्सर FKS के साथ आता है, और वहाँ FKS की एक स्पष्ट ग्राफ जिसके द्वारा यथोचित उनकी बातचीत को प्रतिबंधित करने के लिए है। है)

यदि FK cycle है तो आपको ट्रिगर्स का उपयोग करने की आवश्यकता होगी। किस बाधा के आपके निर्णय को घोषणात्मक रूप से लागू किया गया है & जो ट्रिगर द्वारा (वांछित) बाधाओं के ग्राफ पर विचार करना चाहिए।

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