नहीं, यह ठीक नहीं है। तालिकाओं के बीच परिपत्र संदर्भ गड़बड़ हैं। यह (दशक पुराना) लेख देखें: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 कॉलम नहीं)