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

SQL में, क्या दो तालिकाओं के लिए एक दूसरे को संदर्भित करना ठीक है?

नहीं, यह ठीक नहीं है। तालिकाओं के बीच परिपत्र संदर्भ गड़बड़ हैं। यह (दशक पुराना) लेख देखें:SQL By Design:The Circular Reference

कुछ DBMS इन्हें और विशेष देखभाल के साथ संभाल सकते हैं, लेकिन MySQL में समस्याएँ होंगी।

विकल्प 1

अपने डिजाइन के रूप में, दो FKs में से एक को अशक्त बनाने के लिए। यह आपको चिकन और अंडे की समस्या को हल करने की अनुमति देता है (मुझे पहले किस तालिका में सम्मिलित करना चाहिए?)।

हालांकि आपके कोड में कोई समस्या है। यह किसी उत्पाद को एक डिफ़ॉल्ट चित्र रखने की अनुमति देगा जहां वह चित्र किसी अन्य उत्पाद को संदर्भित करेगा!

ऐसी त्रुटि को अस्वीकार करने के लिए, आपकी FK बाधा होनी चाहिए:

CONSTRAINT FK_products_1 
  FOREIGN KEY (id, default_picture_id) 
  REFERENCES products_pictures (product_id, id)
  ON DELETE RESTRICT                            --- the SET NULL options would 
  ON UPDATE RESTRICT                            --- lead to other issues

इसके लिए एक UNIQUE की आवश्यकता होगी तालिका में बाधा/अनुक्रमणिका products_pictures (product_id, id) . पर उपरोक्त FK को परिभाषित करने और ठीक से काम करने के लिए।

विकल्प 2

दूसरा तरीका है Default_Picture_ID को हटाना कॉलम product बनाते हैं तालिका बनाएं और एक IsDefault BIT जोड़ें picture में कॉलम टेबल। इस समाधान के साथ समस्या यह है कि प्रति उत्पाद केवल एक तस्वीर को उस बिट पर और अन्य सभी को इसे बंद करने की अनुमति कैसे दी जाए। SQL-सर्वर में (और मुझे लगता है कि Postgres में) यह आंशिक अनुक्रमणिका के साथ किया जा सकता है:

CREATE UNIQUE INDEX is_DefaultPicture 
  ON products_pictures (Product_ID)
  WHERE IsDefault = 1 ;

लेकिन MySQL में ऐसी कोई सुविधा नहीं है।

विकल्प 3

यह दृष्टिकोण, आपको दोनों FK स्तंभों को NOT NULL . के रूप में परिभाषित करने की अनुमति देता है आस्थगित बाधाओं का उपयोग करना है। यह PostgreSQL में काम करता है और मुझे लगता है कि Oracle में है। @Erwin द्वारा इस प्रश्न और उत्तर की जाँच करें:SQLAlchemy में जटिल विदेशी कुंजी बाधा (सभी प्रमुख कॉलम खाली नहीं हैं भाग)।

MySQL में बाधाओं को स्थगित नहीं किया जा सकता है।

विकल्प 4

दृष्टिकोण (जो मुझे सबसे साफ लगता है) Default_Picture_ID . को हटाना है कॉलम और एक और टेबल जोड़ें। FK बाधाओं में कोई गोलाकार पथ नहीं होगा और सभी FK कॉलम NOT NULL होंगे इस समाधान के साथ:

product_default_picture
----------------------
product_id          NOT NULL
default_picture_id  NOT NULL
PRIMARY KEY (product_id)
FOREIGN KEY (product_id, default_picture_id)
  REFERENCES products_pictures (product_id, id)

इसके लिए एक UNIQUE की भी आवश्यकता होगी तालिका में बाधा/अनुक्रमणिका products_pictures (product_id, id) . पर समाधान 1 के रूप में।

संक्षेप में, MySQL के साथ आपके पास दो विकल्प हैं:

  • विकल्प 1 (एक अशक्त FK कॉलम) ऊपर सुधार के साथ अखंडता को सही ढंग से लागू करने के लिए

  • विकल्प 4 (कोई अशक्त FK कॉलम नहीं)



  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 क्लाइंट को MySQLdb के साथ ऑटो री-कनेक्ट कैसे सक्षम करें?

  2. क्या प्राथमिक कुंजी स्वचालित रूप से MySQL में अनुक्रमित होती है?

  3. SET NAMES का उपयोग करना है या नहीं

  4. mysql डेटा का स्वचालित या नियमित बैकअप

  5. उत्पाद समीक्षा - MySQL के लिए तारकीय मरम्मत