Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

अशक्त विदेशी कुंजी और सामान्यीकरण के बारे में डीबी डिजाइन प्रश्न

कुछ बहुत अच्छे डिज़ाइनर बिना किसी प्रतिकूल परिणाम के विदेशी कुंजियों में 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 हैं, तो प्रीसेट प्रकार शामिल होने से बाहर हो जाते हैं। यदि आप एक ही जॉइन में कस्टम और प्रीसेट दोनों प्रकार चाहते हैं, तो आपको उस प्रभाव को प्राप्त करने के लिए लेफ्ट जॉइन या राइट जॉइन का उपयोग करना होगा। ध्यान दें कि बाएं या दाएं जॉइन के परिणाम में कुछ एनयूएलएल होंगे, भले ही वे एनयूएलएल डेटाबेस में संग्रहीत न हों।

इस पर क्लिक करने से आपको साझा प्राथमिक कुंजी तकनीक का अधिक विस्तृत विवरण देगा।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL क्वेरी समझ की व्याख्या करता है

  2. रिकॉर्ड के निर्माण को कैसे रोकें जहां दो फ़ील्ड का मान समान हो?

  3. MySQL कई स्तंभों का चयन करें

  4. डाकिया में Php कनेक्शन फ़ाइल त्रुटि

  5. सबटाइम () उदाहरण – MySQL