2012-12-12 38 views
21

मैं कई से अधिक रिश्तों को मॉडलिंग कर रहा हूं जहां रिश्तों को केवल एक तरफ से अधिकांश समय तक पहुंचाया जाता है। यह एक पदानुक्रम की तरह है, जिसे ऊपर-नीचे तक पहुंचाया गया है और दूसरी तरफ नहीं।विदेशी टेबल सरणी बनाम जंक्शन टेबल?

सर्वेक्षण है और कई प्रश्न है के अंतर्गत आता है और कई जवाब करने के लिए अंतर्गत आता है।

दोनों रिश्ते कई से अधिक होने चाहिए क्योंकि विभिन्न प्रश्नों में एक ही प्रश्न का फिर से उपयोग किया जा सकता है और कई सवालों में एक ही जवाब दिया जा सकता है। यह एक आवश्यकता है।

मानक एम 2 एम कार्यान्वयन दो जंक्शन टेबल, surveys_questions और questions_answers का उपयोग करेगा। इसके बजाय, मैं सर्वेक्षण में question_ids और प्रश्न में answer_ids स्टोर करने के लिए PostgreSQL के पूर्णांक सरणी का उपयोग करने के बारे में सोच रहा हूं।

हम विदेशी कुंजी सरणी से मेल खाने वाली सभी पंक्तियों से पूछने के लिए किसी भी ऑपरेटर का उपयोग कर सकते हैं।

हम SQL के उपयोग से अपने प्रश्नों और प्रश्नों के उत्तर के साथ सभी सर्वेक्षणों के लिए कैसे पूछेंगे?

हम विदेशी कुंजी सरणी के साथ वापस पंक्तियों के क्रम से कैसे मिलान कर सकते हैं? अर्थात। question_ids = [1,2,3] का उपयोग आदेश 1, 2, 3 के साथ प्रश्न पंक्तियों को वापस करने की गारंटी है।

यह जंक्शन तालिकाओं की तुलना में प्रदर्शन के अनुसार प्रदर्शन करता है (उचित इंडेक्स मानते हैं, जो भी हो सकता है)?

क्या आप इसका सुझाव देंगे? क्या एम 2 एम मॉडलिंग के बारे में कुछ संसाधन हैं?

अद्यतन

PostgreSQL 9.3 करने के लिए सरणी विदेशी चाबी के लिए रेफेरेंन्शिअल सत्यनिष्ठा को जोड़ने के लिए एक प्रस्ताव था, लेकिन यह शामिल नहीं था: http://blog.2ndquadrant.com/postgresql-9-3-development-array-element-foreign-keys/

अतः विदेशी कुंजी सरणी PostgreSQL JOIN with array type with array elements order, how to implement? का उपयोग कर व्यवस्था बनाए रखने के बारे में प्रश्न

+0

आप कई लोगों को कहते हैं, लेकिन यह कई लोगों की तरह लगता है; कई लोगों का मतलब यह होगा कि प्रत्येक सर्वेक्षण कई प्रश्नों से संबंधित है और प्रत्येक प्रश्न कई सर्वेक्षणों से संबंधित है, लेकिन यह थोड़ा अजीब लगता है, निश्चित रूप से, जिस तरह से आपने इसे वाक्यांश दिया है, 'कई' हैं, आमतौर पर कई लोगों के समानार्थी होते हैं (कई से -मनी आमतौर पर 'हैस-एंड-से-से-कई' कहा जाता है) – SingleNegationElimination

+0

@TokenMacGuy: भ्रम के लिए खेद है। प्रश्न पूरे सर्वेक्षण में जवाब देने योग्य हैं और कई सारे रिश्ते बनाने के सवालों के जवाब हैं। मैं एचएबीटीएम के साथ कई रिश्तों को बदल दूंगा। – randomguy

उत्तर

7

जंक्शन तालिका दृष्टिकोण का उपयोग करें। सरणी विधि गैर-मानक पर्याप्त है कि आपको प्रश्न पूछना होगा कि यह कितना काम करेगा, जबकि दूसरा पूरी तरह से मानक है।

+4

जंक्शन सारणी हालांकि सरणी से काफी धीमी हो सकती है। https://gist.github.com/joevandyk/031cf5812bd656887623 –

+0

हां, कभी-कभी सरणी विधि से प्रदर्शन प्रदर्शन होता है। इस बात पर एक बड़ा सवाल है कि क्या यह निश्चित रूप से सभी स्थितियों के लिए बनाएगा, और प्राथमिक समस्याओं में से एक यह है कि एक नए लिंक को जोड़ने/हटाने के लिए सम्मिलन/हटाना के बजाय संभावित लंबी पंक्ति (उदाहरण में कूपन) में संशोधन की आवश्यकता होती है एक पंक्ति की, और कूपन तालिका पर एक ताला। –

+0

सहमत! यदि आप प्रत्येक सम्मिलन पर कूपन तालिका को संशोधित नहीं करना चाहते थे, तो इसके बजाय आपके पास coupons_products_array तालिका (coupon_id, product_ids []) हो सकती है। लेकिन वह मूर्खतापूर्ण हो रहा है। –