दिलचस्प पोस्ट
मैं शुद्ध पायथन में सैंडबॉक्स पायथन कैसे कर सकता हूं? strdup () – यह सी में क्या करता है? बाश में हैश टेबल कैसे परिभाषित करें? Java में JSON ऑब्जेक्ट को पार्स करना जावा सुरक्षा: अवैध कुंजी आकार या डिफ़ॉल्ट पैरामीटर? ऑपरेटर ओवरलोडिंग के लिए बुनियादी नियम और मुहावरे क्या हैं? ADO.NET में आउटपुट पैरामीटर मान प्राप्त करें बाइंडिंग विशेषता दृश्य में डुप्लिकेट घटक आईडी का कारण बनती है एक्सटेंशन पृष्ठ DOM के बजाय वेबपेज DOM कैसे पहुंचें? मैं जावास्क्रिप्ट में स्पैन तत्व का पाठ कैसे बदल सकता हूँ त्रुटि: "आईएसएएम को संस्थापित नहीं किया जा सका" Jquery में बंद करने के लिए बाहर मेनू पर क्लिक करें यूआरएल क्वेरी पैरामीटर के साथ HTTP पोस्ट – अच्छा विचार है या नहीं? जावा VM समर्थन कितने धागे कर सकते हैं? पिछली बिना बांट दी गई रेखा को पढ़ा नहीं जा सकता

MySQL – सशर्त विदेशी कुंजी प्रतिबंध

मेरे ऐप में मैंने 'टिप्पणी' तालिका का पालन किया है:

comments -------- id INT foreign_id INT model TEXT comment_text TEXT ... 

इस तालिका का विचार मेरे ऐप के विभिन्न हिस्सों के लिए टिप्पणियों को संग्रहित करना है – यह ब्लॉग पोस्ट के लिए टिप्पणियां संभाल सकता है:

 1|34|blogpost|lorem ipsum... 

उपयोगकर्ता चित्र:

 2|12|picture|lorem ipsum... 

और इसी तरह।

अब, क्या इस तरह के डेटा पर विदेशी कुंजी बाध्यता को लागू करने का एक तरीका है?

यानी ऐसा कुछ टिप्पणी तालिका में है:

 FOREIGN KEY (`foreign_id`) REFERENCES blogposts (`id`) //but only when model='blogpost' 

वेब के समाधान से एकत्रित समाधान "MySQL – सशर्त विदेशी कुंजी प्रतिबंध"

आप एक ऐसा डिजाइन करने का प्रयास कर रहे हैं जिसे पॉलीमॉर्फिक एसोसिएशन कहा जाता है यही है, विदेशी कुंजी किसी भी संबंधित तालिकाओं में से किसी में पंक्तियों को संदर्भित कर सकती है

लेकिन एक विदेशी कुंजी बाधा को एक तालिका का बिल्कुल संदर्भ करना चाहिए। आप अपनी Comments तालिका के दूसरे कॉलम में मूल्य के आधार पर अलग-अलग तालिकाओं को संदर्भित करने वाली विदेशी कुंजी की घोषणा नहीं कर सकते। यह संबंधपरक डेटाबेस डिजाइन के कई नियमों का उल्लंघन करेगा

एक बेहतर समाधान "असाधारण" बनाने के लिए है जो टिप्पणियों द्वारा संदर्भित है।

 CREATE TABLE Commentable ( id SERIAL PRIMARY KEY ); CREATE TABLE Comments ( comment_id SERIAL PRIMARY KEY, foreign_id INT NOT NULL, ... FOREIGN KEY (foreign_id) REFERENCES Commentable(id) ); 

आपके प्रत्येक सामग्री प्रकार को इस सुपरटेबल के एक उपप्रकार के रूप में माना जाएगा। यह अंतरफलक के ऑब्जेक्ट-ओरिएंटेड अवधारणा के अनुरूप है।

 CREATE TABLE BlogPosts ( blogpost_id INT PRIMARY KEY, -- notice this is not auto-generated ... FOREIGN KEY (blogpost_id) REFERENCES Commentable(id) ); CREATE TABLE UserPictures ( userpicture_id INT PRIMARY KEY, -- notice this is not auto-generated ... FOREIGN KEY (userpicture_id) REFERENCES Commentable(id) ); 

इससे पहले कि आप UserPictures या UserPictures में एक पंक्ति UserPictures , आपको एक नया छद्म आईडी उत्पन्न करने के लिए Commentable करने के लिए एक नई पंक्ति डालना होगा। तब आप उस जेनरेट आईडी का उपयोग कर सकते हैं क्योंकि आप संबंधित उपप्रकार तालिका में सामग्री डालें।

एक बार जब आप ऐसा करते हैं, तो आप संदर्भित अखंडता बाधाओं पर भरोसा कर सकते हैं।