2012-11-06 21 views
5

डेटाबेस में तालिका बनाने/बदलने के लिए सामान्य रूप से डेटाबेस बनाते हैं, मैं माइग्रेशन का उपयोग करता हूं (मैन्युअल रूप से rake db:migrate चलाता हूं) और फिर मेरे कोड में मैं ActiveRecord का उपयोग करता हूं। यह बहुत अच्छा है क्योंकि मुझे डीबी में डेटा के प्रतिनिधित्व और किसी विशिष्ट प्रकार के डीबी (एसक्लसेवर, पीजी या अन्य) के बारे में चिंता करने की ज़रूरत नहीं है।रेल डीबी गतिशील रूप से

लेकिन अब एक ग्राहक अपने आप को "चीजें" बनाने में सक्षम होना चाहता है, कहता है, वह कंप्यूटर बेचना शुरू कर देता है, इसलिए वह एक इंटरफ़ेस बनाना चाहता है जहां वह गतिशील रूप से ऑब्जेक्ट "कंप्यूटर" जैसे गुणों को " नाम, रैम, एचडी, ... "। इन सभी क्षेत्रों के साथ डीबी में एक अलग टेबल बनाने के लिए यह काफी स्वाभाविक प्रतीत होता है। लेकिन मैं RoR में ऐसा कैसे कर सकता हूं और इन सभी अच्छी चीजों को ActiveRecord के बारे में कैसे रख सकता हूं?

कृपया सुझाव दें।

उत्तर

2

हमेशा की तरह बिल्कुल विपरीत करना है:

  • वस्तु प्रकार के लिए एक मेज
  • प्रत्येक ऑब्जेक्ट प्रकार
  • के लिए फ़ील्ड नाम के लिए एक मेज है सभी के साथ एक बहुत बड़ी मेज किया है किसी भी प्रकार के प्रत्येक ऑब्जेक्ट के लिए कस्टम गुण

इसे ईएवी (एंटीटी-एट्रिब्यूट-वैल्यू मॉडल, http://en.wikipedia.org/wiki/Entity-attribute-value_model देखें) कहा जाता है। और यह बहुत बुरा है।

वैकल्पिक रूप से, आप बड़ी ईएवी तालिका (http://api.rubyonrails.org/classes/ActiveRecord/Store.html देखें) के बजाय store टेक्स्ट कॉलम का उपयोग कर सकते हैं, इसलिए आपको उन कठिन विशेषता पुनर्प्राप्तियों को बनाने की ज़रूरत नहीं है, जो ईएवी के विशिष्ट हैं। आपको अभी भी "ऑब्जेक्ट प्रकार" परिभाषाओं को स्टोर करने की आवश्यकता है, इसलिए अपेक्षित फ़ील्ड इत्यादि फॉर्म और टेबल बनाने के दौरान उपलब्ध हैं।

इस दृष्टिकोण के साथ समस्या यह है कि आप उन विशेषताओं पर क्वेरी (कहां/शामिल/चयन) करने में सक्षम नहीं हैं क्योंकि वे कॉलम नहीं हैं। कि करने के लिए समाधान की एक संख्या हैं:

  • उन विशेषताओं के छानने मत करो (हुंह ...)
  • (faceted खोज
  • ऐसा करने में सक्षम है कि एक बाहरी खोज सर्वर है @Amar के रूप में सही कहता है) एक दस्तावेज़ डेटाबेस
  • पोस्टग्रेएसक्यूएल का उपयोग करें और एक सरल धारावाहिक कॉलम के बजाय hstore का उपयोग करें।
+0

@rewritten से सहमत थे, और अगर आप चाहते हैं और उदाहरण "लोकोमोटिव सीएमएस" पर एक नजर है (http://locomotivecms.com/), वे लगभग वही काम करते हैं जो आप यहां करने की कोशिश कर रहे हैं :) – sameera207

+0

@ sameera207 उदाहरण लिंक के लिए धन्यवाद (जो मोंगो को डेटाबेस के रूप में उपयोग कर रहा है)। यदि आप एक दिलचस्प ईएवी कार्यान्वयन देखना चाहते हैं, तो स्प्रीकॉमर्स की जांच करें: https://github.com/spree/spree – rewritten

+0

धन्यवाद बदनाम रूप से एक नज़र डालेगा;) – sameera207

1

नोएसQL डेटाबेस (दस्तावेज़ डेटाबेस मोंगोब, कॉच डीबी) इसके लिए सबसे अच्छा फिट या रेडिस का उपयोग कर सकता है। मेरे विचारों के अनुसार आप Vertical Table concept का उपयोग कर सकते हैं MySQL के लिए रेल 2.x Demo of application चलाने की कोशिश करें। आप मोंगोद के साथ प्रयास कर सकते हैं, जांचें कि इसकी आवश्यकता है या नहीं।

+0

पता नहीं है कि वे आपको क्यों दिया -1 :) thnx के लिए एक जवाब – xaxa

संबंधित मुद्दे