बंद करें - आप शायद निम्नलिखित चाहते हैं:
add_index :person_products, [:person_id, :product_id], :unique => true
add_index :person_products, :product_id
:unique => true
इसकी सख्त आवश्यकता नहीं है और यह इस बात पर निर्भर करता है कि किसी व्यक्ति को किसी उत्पाद से कई बार संबद्ध करना उचित है या नहीं। मैं कहूंगा कि यदि आप निश्चित नहीं हैं, तो आप शायद करें :unique
चाहते हैं झंडा।
अनुक्रमणिका संरचना का कारण यह है कि सभी आधुनिक डेटाबेस पहली अनुक्रमणिका का उपयोग करके person_id और product_id दोनों पर प्रश्नों को निष्पादित कर सकते हैं किसी क्वेरी में निर्दिष्ट क्रम की परवाह किए बिना . उदा.
SELECT foo FROM bar WHERE person_id = 1 AND product_id = 2
SELECT foo FROM bar WHERE product_id = 2 AND person_id = 1
उन्हें समान माना जाता है और डेटाबेस पहले इंडेक्स का उपयोग करने के लिए पर्याप्त स्मार्ट है।
इसी तरह, केवल person_id
. का उपयोग करने वाली क्वेरीज़ पहली अनुक्रमणिका का उपयोग करके भी चलाया जा सकता है। मल्टी-कॉलम बी-ट्री इंडेक्स कम कॉलम का उपयोग कर सकते हैं, बशर्ते कि वे मूल घोषणा के बाईं ओर निर्दिष्ट हों।
केवल product_id
. का उपयोग करने वाली क्वेरी के लिए , इसे पहली अनुक्रमणिका के विरुद्ध निष्पादित नहीं किया जा सकता है (क्योंकि उस अनुक्रमणिका को person_id के साथ सबसे बाईं स्थिति में परिभाषित किया गया है)। इसलिए आपको केवल उस फ़ील्ड पर लुकअप सक्षम करने के लिए एक अलग अनुक्रमणिका की आवश्यकता है।
मल्टी-कॉलम बी-ट्री इंडेक्स प्रॉपर्टी भी अधिक संख्या में कॉलम वाले इंडेक्स तक फैली हुई है। अगर आपके पास (person_id, product_id, favorite_color, shirt_size)
पर एक इंडेक्स था , आप person_id
. का उपयोग करके क्वेरी चलाने के लिए उस अनुक्रमणिका का उपयोग कर सकते हैं , (person_id, product_id)
, आदि, जब तक आदेश परिभाषा से मेल खाता है।