एक और तरीका है ( FOREIGN KEY
रिश्तों में Nulls और बिना साइकिल के) "पसंदीदा बच्चों" को संग्रहीत करने के लिए एक तीसरी तालिका है। अधिकांश DBMS में, आपको एक अतिरिक्त UNIQUE
बाधा की आवश्यकता होगी TableB
।
@ एरन यह पहचानने के लिए तेज़ था कि ऊपर दिया गया नामकरण सम्मेलन बोझिल है और इससे त्रुटियां हो सकती हैं। यदि आप Id
अपनी सभी मेजों पर कॉलम नहीं रखते हैं और यदि कॉलम (जो जुड़ गए हैं) तो कई तालिकाओं में समान नाम होते हैं, तो यह आमतौर पर बेहतर होता है (और आपको सन्न रखेगा) । इसलिए, यहाँ एक नामकरण है:
Parent
ParentID INT NOT NULL PRIMARY KEY
Child
ChildID INT NOT NULL PRIMARY KEY
ParentID INT NOT NULL FOREIGN KEY REFERENCES Parent (ParentID)
UNIQUE (ParentID, ChildID)
FavoriteChild
ParentID INT NOT NULL PRIMARY KEY
ChildID INT NOT NULL
FOREIGN KEY (ParentID, ChildID)
REFERENCES Child (ParentID, ChildID)
SQL- सर्वर में (जो आप उपयोग कर रहे हैं), आपके पास आपके द्वारा IsFavorite
उल्लेखित बिट कॉलम का विकल्प भी है । माता-पिता के प्रति अद्वितीय पसंदीदा बच्चे को फ़िल्टर किए गए अनन्य सूचकांक के माध्यम से पूरा किया जा सकता है:
Parent
ParentID INT NOT NULL PRIMARY KEY
Child
ChildID INT NOT NULL PRIMARY KEY
ParentID INT NOT NULL FOREIGN KEY REFERENCES Parent (ParentID)
IsFavorite BIT NOT NULL
CREATE UNIQUE INDEX is_FavoriteChild
ON Child (ParentID)
WHERE IsFavorite = 1 ;
और मुख्य कारण यह है कि आपका विकल्प 1 अनुशंसित नहीं है, कम से कम SQL-Server में नहीं है, यह है कि विदेशी कुंजी संदर्भों में परिपत्र पथ के पैटर्न में कुछ समस्याएं हैं।
एक काफी पुराना लेख पढ़ें: SQL बाइ डिजाइन: सर्कुलर संदर्भ
दो तालिका से पंक्तियाँ सम्मिलित या हटाते समय, आप "चिकन-एंड-एग" समस्या में भाग लेंगे। किसी अड़चन का उल्लंघन किए बिना मुझे कौन सी तालिका पहले सम्मिलित करनी चाहिए?
इसे हल करने के लिए, आपको कम से कम एक कॉलम को अशक्त करना होगा। (ठीक है, तकनीकी रूप से आप के लिए, यदि आप सभी कॉलम हो सकता है की जरूरत नहीं है के रूप में NOT NULL
, लेकिन केवल डीबीएमएस, Postgres और Oracle की तरह, कि deferrable की कमी को लागू किया है देखें @ एक ऐसी ही सवाल में इरविन के जवाब में:। SQLAlchemy में परिसर विदेशी कुंजी बाधा पर कैसे यह Postgres में किया जा सकता है)। फिर भी, यह सेटअप पतली बर्फ पर स्केटिंग करने जैसा लगता है।
एसओ (लेकिन MySQL के लिए) एसक्यूएल में भी लगभग एक समान प्रश्न की जाँच करें , क्या दो तालिकाओं के लिए एक-दूसरे को संदर्भित करना ठीक है? जहां मेरा जवाब बहुत ज्यादा एक ही है। MySQL के पास हालांकि कोई आंशिक अनुक्रमणिका नहीं है, इसलिए एकमात्र व्यवहार्य विकल्प अशक्त FK और अतिरिक्त तालिका समाधान हैं।