लघु संस्करण
मुझे एक मौजूदा कई-से-कई सम्मिलित होने के लिए प्रत्येक जोड़ी में एक निश्चित संख्या में अतिरिक्त गुणों को जोड़ना होगा। नीचे दिए गए आरेखों के लिए, विकल्प 1-4 में से कौन सा सबसे अच्छा तरीका है, फायदे और नुकसान के मामले में, बेस केस का विस्तार करके इसे पूरा करने के लिए? या, वहाँ एक बेहतर विकल्प मैं यहाँ पर विचार नहीं किया है?
लंबा संस्करण
मेरे पास वर्तमान में एक इंटरमीडिएट जॉइन टेबल के माध्यम से कई-से-कई संबंधों में दो तालिकाओं हैं। अब मुझे उन संपत्तियों के अतिरिक्त लिंक जोड़ने की आवश्यकता है जो मौजूदा वस्तुओं की जोड़ी से संबंधित हैं। मेरे पास प्रत्येक जोड़ी के लिए इन गुणों की एक निश्चित संख्या है, हालांकि संपत्ति तालिका में एक प्रविष्टि कई जोड़े (या यहां तक कि एक जोड़ी के लिए कई बार उपयोग की जा सकती है) पर लागू हो सकती है। मैं यह करने के लिए सबसे अच्छा तरीका निर्धारित करने की कोशिश कर रहा हूं, और स्थिति के बारे में सोचने के तरीके को छांटने में परेशानी हो रही है। शब्दशः ऐसा लगता है जैसे मैं इसका वर्णन निम्न में से किसी एक के रूप में कर सकता हूँ:
- एक जोड़ी अतिरिक्त संपत्तियों की निश्चित संख्या के एक सेट से जुड़ी
- एक जोड़ा कई अतिरिक्त गुणों से जुड़ा हुआ है
- गुणों के एक सेट से जुड़ी कई (दो) वस्तुएं
- कई वस्तुओं को कई गुणों से जोड़ा जाता है
उदाहरण
मेरे पास दो ऑब्जेक्ट प्रकार हैं, एक्स और वाई, प्रत्येक में अद्वितीय आईडी, और objx_objy
कॉलम के साथ एक लिंकिंग टेबल x_id
और y_id
, जो एक साथ लिंक के लिए प्राथमिक कुंजी बनाते हैं। प्रत्येक X कई Ys से संबंधित हो सकता है, और इसके विपरीत। यह मेरे मौजूदा कई-से-कई संबंधों के लिए सेटअप है।
मुख्य मामला
अब इसके अतिरिक्त मेरे पास एक अन्य तालिका में परिभाषित गुणों का एक समूह है, और एक शर्त है जिसके तहत किसी दिए गए (एक्स, वाई) जोड़े के पास संपत्ति पी होनी चाहिए। शर्तों की संख्या निर्धारित है, और सभी जोड़ों के लिए समान है। वे मूल रूप से कहते हैं "स्थिति C1 में, जोड़ी (X1, Y1) के पास संपत्ति P1 है", "स्थिति C2 में, जोड़ी (X1, Y1) के पास संपत्ति P2 है", और इसी तरह, प्रत्येक जोड़ी के लिए तीन स्थितियों / शर्तों के लिए। तालिका।
विकल्प 1
मेरे वर्तमान स्थिति में वास्तव में तीन तरह की स्थितियों देखते हैं, और इसलिए एक संभावना स्तंभ जोड़ने का है मैं, कि वृद्धि की उम्मीद करने का कोई कारण नहीं है c1_p_id
, c2_p_id
और c3_p_id
करने के लिए featx_featy
, किसी दिए गए के लिए निर्दिष्ट करने x_id
और y_id
जो संपत्ति, p_id
तीन मामलों में से प्रत्येक में उपयोग करने के लिए ।
यह मेरे लिए एक महान विचार की तरह प्रतीत नहीं होता है, क्योंकि यह एसक्यूएल को एक विशेषता पर लागू सभी गुणों का चयन करने के लिए जटिल करता है, और अधिक परिस्थितियों के लिए आसानी से स्केल नहीं करता है। हालांकि, यह प्रति (एक्स, वाई) जोड़ी की एक निश्चित संख्या की आवश्यकता को लागू करता है। वास्तव में, यह यहां एकमात्र विकल्प है जो ऐसा करता है।
विकल्प 2
एक शर्त तालिका बनाएँ cond
, और शामिल होने की मेज की प्राथमिक कुंजी के लिए शर्त आईडी जोड़ें।
एक नकारात्मक पक्ष यह है कि यह प्रत्येक जोड़ी के लिए शर्तों की संख्या निर्दिष्ट नहीं करता है। एक और यह है कि जब मैं केवल प्रारंभिक संबंध पर विचार कर रहा हूं, जैसे कि कुछ
SELECT objx.*, objy.* FROM objx
INNER JOIN objx_objy ON objx_objy.x_id = objx.id
INNER JOIN objy ON objy.id = objx_objy.y_id
फिर मुझे DISTINCT
डुप्लिकेट प्रविष्टियों से बचने के लिए एक खंड जोड़ना होगा । ऐसा लगता है कि प्रत्येक जोड़ी को केवल एक बार मौजूद होना चाहिए।
विकल्प 3
ज्वाइन टेबल में एक नई 'पेयर आईडी' बनाएं, और फिर पहले वाले और प्रॉपर्टीज और कंडीशन के बीच एक दूसरी लिंक टेबल रखें।
ऐसा लगता है कि प्रत्येक जोड़ी के लिए निश्चित संख्या में शर्तों को लागू करने की कमी के अलावा, कुछ नुकसान भी हैं। हालांकि यह एक नई आईडी बनाने के लिए समझ में आता है जो मौजूदा आईडी के अलावा और कुछ नहीं की पहचान करता है?
विकल्प 4 (3 बी)
मूल रूप से विकल्प 3 के समान है, लेकिन अतिरिक्त आईडी फ़ील्ड के निर्माण के बिना। यह दोनों मूल आईडी को नई जॉइन टेबल में डालकर पूरा किया जाता है, इसलिए इसमें इसके बजाय फ़ील्ड x_id
और y_id
फ़ील्ड शामिल हैं xy_id
।
इस रूप में एक अतिरिक्त लाभ यह है कि यह मौजूदा तालिकाओं में बदलाव नहीं करता है (हालांकि वे अभी तक उत्पादन में नहीं हैं)। हालाँकि, यह मूल रूप से एक पूरी तालिका को कई बार दोहराता है (या वैसे भी, वैसे भी) ऐसा लगता है कि आदर्श भी नहीं है।
सारांश
मेरी भावना यह है कि विकल्प 3 और 4 समान हैं कि मैं किसी एक के साथ जा सकता हूं। मैं शायद अब तक होता अगर संपत्तियों की एक छोटी, निश्चित संख्या की आवश्यकता के लिए नहीं, जो विकल्प 1 बनाता है और अधिक उचित लगता है, अन्यथा यह होगा। कुछ बहुत ही सीमित परीक्षण के आधार पर, DISTINCT
मेरे प्रश्नों का एक खंड जोड़ने से इस स्थिति में प्रदर्शन प्रभावित नहीं होता है, लेकिन मुझे यकीन नहीं है कि विकल्प 2 स्थिति के साथ-साथ दूसरों को भी दर्शाता है, क्योंकि अंतर्निहित दोहराव के कारण होता है लिंक तालिका की कई पंक्तियों में समान (X, Y) जोड़े।
क्या इन विकल्पों में से एक मेरा सबसे अच्छा तरीका है, या क्या कोई अन्य संरचना है जिस पर मुझे विचार करना चाहिए?
DISTINCT
खंड, मैं # 2 के अंत में एक है, जो लिंक की तरह एक प्रश्न के बारे में सोच रहा था x
और y
के माध्यम से xyc
, लेकिन का उल्लेख नहीं करता c
है, तो मैं कर दिया है ... तो (x_id, y_id, c_id)
विवश UNIQUE
पंक्तियों के साथ (1,1,1)
और (1,1,2)
फिर, SELECT x.id, y.id FROM x JOIN xyc JOIN y
, मैं वापस मिल जाएगा दो समान पंक्तियाँ, (1,1)
और (1,1)
।