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

MySQL डेटाबेस डिजाइन। 1to1 तालिकाओं में पंक्तियाँ सम्मिलित करना।

मैं इसका उत्तर दूंगा क्योंकि मुझे लगता है कि यह एक डिज़ाइन दोष है।

सबसे पहले, अगर दो टेबल सही हैं 1:1 संबंध, आपके पास सिर्फ एक टेबल क्यों नहीं है?

दूसरा, अगर यह सही नहीं है 1:1 संबंध लेकिन एक सुपरटेप-उपप्रकार समस्या, आपको इस परिपत्र विदेशी कुंजी की भी आवश्यकता नहीं है। मान लें table1 है Employee और table2 है Customer . बेशक अधिकांश ग्राहक कर्मचारी नहीं हैं (और इसके विपरीत)। लेकिन कभी-कभी ग्राहक कर्मचारी भी हो सकता है। इसे 3 टेबल से हल किया जा सकता है:

Person
------
id
PRIMARY KEY: id

Employee
--------
personid
lastname
firstname
... other data
PRIMARY KEY: personid
FOREIGN KEY: personid
    REFERENCES Person(id)

Customer
--------
personid
creditCardNumber
... other data
PRIMARY KEY: personid
FOREIGN KEY: personid
    REFERENCES Person(id)

परिदृश्य में आप वर्णन करते हैं कि आपके पास दो टेबल हैं Parent और Child 1:N . होना रिश्ता। फिर, आप किसी भी तरह हर माता-पिता के लिए सबसे अच्छा प्रदर्शन करने वाले (एक परिभाषित गणना के आधार पर) बच्चे को संग्रहीत करना चाहते हैं।

क्या यह काम करेगा?:

Parent
------
id
PRIMARY KEY: id

Child
-----
id
parentid
... other data
PRIMARY KEY: id
FOREIGN KEY: parentid
    REFERENCES Parent(id)
UNIQUE KEY: (id, parentid)             --- needed for the FK below

BestChild
---------
parentid
childid
... other data
PRIMARY KEY: parentid
FOREIGN KEY: (childid, parentid)
    REFERENCES Child(id, parentid)

इस तरह, आप वांछित संदर्भात्मक अखंडता को लागू करते हैं (प्रत्येक बेस्टचाइल्ड एक बच्चा है, प्रत्येक माता-पिता के पास केवल एक बेस्टचाइल्ड है) और संदर्भों में कोई गोलाकार पथ नहीं है। सर्वश्रेष्ठ बच्चे का संदर्भ अतिरिक्त तालिका में संग्रहीत किया जाता है, न कि Parent . में मेज़।

आप इसमें शामिल होकर हर माता-पिता के लिए बेस्टचाइल्ड पा सकते हैं:

Parent
  JOIN BestChild
    ON Parent.id = BestChild.parentid
  JOIN Child
    ON BestChild.childid = Child.id

इसके अतिरिक्त, यदि आप कई प्रदर्शन परीक्षणों (विभिन्न प्रकार के परीक्षणों, या विभिन्न तिथियों में परीक्षणों के लिए) के लिए सर्वश्रेष्ठ बच्चों को संग्रहीत करना चाहते हैं, तो आप एक test जोड़ सकते हैं फ़ील्ड, और प्राथमिक कुंजी को (test, parentid) . में बदलें :

BestChild
---------
testid
parentid
childid
... other data
PRIMARY KEY: (testid, parentid)
FOREIGN KEY: (childid, parentid)
    REFERENCES Child(id, parentid)
FOREIGN KEY: testid
    REFERENCES Test(id)


  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. php/mysql में दो तालिकाओं से एक रिकॉर्ड हटाएं

  3. पासवर्ड रीसेट बैकएंड कार्यक्षमता

  4. WHERE क्लॉज में mysql SUM () का उपयोग करें

  5. PHP - SQL क्वेरी के आसपास सिंगल कोट्स या डबल कोट्स?