दो आंशिक अनुक्रमणिका बनाएं :
CREATE UNIQUE INDEX favo_3col_uni_idx ON favorites (user_id, menu_id, recipe_id)
WHERE menu_id IS NOT NULL;
CREATE UNIQUE INDEX favo_2col_uni_idx ON favorites (user_id, recipe_id)
WHERE menu_id IS NULL;
इस तरह, (user_id, recipe_id)
. का केवल एक संयोजन हो सकता है जहां menu_id IS NULL
. है , वांछित बाधा को प्रभावी ढंग से लागू करना।
संभावित कमियां:
- आपके पास
(user_id, menu_id, recipe_id)
को संदर्भित करने वाली विदेशी कुंजी नहीं हो सकती है . (ऐसा लगता नहीं है कि आप तीन कॉलम चौड़ा एक FK संदर्भ चाहते हैं - इसके बजाय PK कॉलम का उपयोग करें!) - आप
CLUSTER
को आधार नहीं बना सकते आंशिक अनुक्रमणिका पर। - बिना मिलान वाली क्वेरी
WHERE
स्थिति आंशिक अनुक्रमणिका का उपयोग नहीं कर सकती है।
अगर आपको पूर्ण . की आवश्यकता है अनुक्रमणिका, आप वैकल्पिक रूप से WHERE
. को छोड़ सकते हैं favo_3col_uni_idx
. से शर्त और आपकी आवश्यकताएं अभी भी लागू हैं।
अनुक्रमणिका, जिसमें अब पूरी तालिका शामिल है, दूसरी तालिका के साथ ओवरलैप हो जाती है और बड़ी हो जाती है। विशिष्ट प्रश्नों और NULL
. के प्रतिशत के आधार पर मान, यह उपयोगी हो भी सकता है और नहीं भी। चरम स्थितियों में यह तीनों इंडेक्स (दो आंशिक वाले और कुल मिलाकर शीर्ष पर) को बनाए रखने में भी मदद कर सकता है।
यह एकल अशक्त स्तंभ . के लिए एक अच्छा समाधान है , शायद दो के लिए। लेकिन यह अधिक के लिए जल्दी से हाथ से निकल जाता है क्योंकि आपको अशक्त स्तंभों के प्रत्येक संयोजन के लिए एक अलग आंशिक सूचकांक की आवश्यकता होती है, इसलिए संख्या द्विपद रूप से बढ़ती है। अनेक अशक्त स्तंभों . के लिए , इसके बजाय देखें:
- मेरी UNIQUE बाधा ट्रिगर क्यों नहीं होती?
इसके अलावा:मैं सलाह देता हूं कि PostgreSQL में मिश्रित केस आइडेंटिफायर का उपयोग न करें।