कुछ बहुत अच्छे डिज़ाइनर बिना किसी प्रतिकूल परिणाम के विदेशी कुंजियों में NULLs का उपयोग करते हैं। मैं खुद उस तरफ झुक जाता हूं। एक अशक्त FK एक वैकल्पिक संबंध का प्रतिनिधित्व करता है। ऐसे उदाहरणों में जहां इकाई का कोई संबंध नहीं है, FK में एक NULL होता है। अंतरिक्ष उपरि न्यूनतम है। जब जॉइन (इक्विजॉइन, अधिक सटीक) दो तालिकाओं में किया जाता है, तो FK में NULL वाले इंस्टेंस शामिल होने से बाहर हो जाएंगे, और यह उचित है।
इतना कहने के बाद, मैं आपको एक चौथा तरीका सुझाने जा रहा हूँ। इसमें कुल 4 टेबल, खाते, विजेट, प्रकार और कस्टम_टाइप शामिल हैं। Custom_types तालिका नीचे उल्लिखित साझा-प्राथमिक-कुंजी नामक तकनीक का उपयोग करती है।
CREATE TABLE accounts (
account_id INT UNSIGNED AUTO_INCREMENT NOT NULL,
# Other Columns...,
PRIMARY KEY (account_id)
);
CREATE TABLE widgets (
widget_id INT UNSIGNED AUTO_INCREMENT NOT NULL,
account_id INT UNSIGNED NOT NULL,
type_id INT UNSIGNED NOT NULL,
PRIMARY KEY (widget_id),
FOREIGN KEY (account_id) REFERENCES accounts(account_id) ON DELETE CASCADE,
FOREIGN KEY (type_id) REFERENCES types(type_id)
);
CREATE TABLE types (
type_id INT UNSIGNED AUTO_INCREMENT NOT NULL,
account_id INT UNSIGNED NOT NULL,
name VARCHAR(100) NOT NULL,
PRIMARY KEY (type_id),
FOREIGN KEY (account_id) REFERENCES accounts(account_id)
CREATE TABLE custom_types (
type_id INT NOT NULL,
account_id INT UNSIGNED NOT NULL,
PRIMARY KEY (type_id),
FOREIGN KEY (type_id) REFERENCES types(type_id),
FOREIGN KEY (account_id) REFERENCES accounts(account_id)
);
Custom_types में type_id कॉलम एक साझा प्राथमिक कुंजी है। ध्यान दें कि इसे प्राथमिक कुंजी और विदेशी कुंजी दोनों के रूप में घोषित किया गया है, और यह ऑटोनंबर का उपयोग नहीं करता है। यह संबंधित प्रविष्टि के लिए प्राथमिक कुंजी की एक प्रति है। कस्टम प्रकार तालिका में सभी डेटा होते हैं जो कस्टम प्रकारों में मौजूद होते हैं लेकिन प्रीसेट प्रकारों में अनुपस्थित होते हैं।
प्रीसेट प्रकारों के लिए, एक प्रविष्टि प्रकारों में की जाती है, लेकिन custom_types में कोई प्रविष्टि नहीं की जाती है। Custom_types के लिए, पहले प्रकारों में एक प्रविष्टि की जाती है, और फिर type_id के परिणामी मान को account_id के साथ custom_types में कॉपी किया जाता है।
यदि आप INNER JOIN प्रकार और custom_types हैं, तो प्रीसेट प्रकार शामिल होने से बाहर हो जाते हैं। यदि आप एक ही जॉइन में कस्टम और प्रीसेट दोनों प्रकार चाहते हैं, तो आपको उस प्रभाव को प्राप्त करने के लिए लेफ्ट जॉइन या राइट जॉइन का उपयोग करना होगा। ध्यान दें कि बाएं या दाएं जॉइन के परिणाम में कुछ एनयूएलएल होंगे, भले ही वे एनयूएलएल डेटाबेस में संग्रहीत न हों।
इस shared-primary-key पर क्लिक करने से आपको साझा प्राथमिक कुंजी तकनीक का अधिक विस्तृत विवरण देगा।