2011-05-29 12 views
6

मैं एक ही तरह के डीबी (MySQL + MongoDB) को एक ही रेल ऐप का समर्थन करने के लिए बेहतर तरीका (उर्फ आर्किटेक्चर) ढूंढ रहा हूं।रेल: एनओएसक्यूएल और एसक्यूएल डेटाबेस मिश्रण

मैं एक मुख्य रेल पर, 3.1 एप्लिकेशन अटकलें गया था रेल बढ़ते 3.1 प्रत्येक डीबी एक अलग तरह जोड़ने इंजन ...

... या एक मुख्य रेल 3.0.x प्रत्येक के लिए एक सिनात्रा endpoint मार्ग ऐप्स को MySQL/MongoDB istance ...

क्या आपको लगता है कि यह संभव है ..., कोई विचार या सुझाव?

मुझे यहां कुछ अन्य समान प्रश्न हैं, लेकिन मुझे लगता है कि "बढ़ते ऐप्स" रेल 3.1/रैक/सिनात्रा में तेजी से आगे बढ़ रहे हैं और हमें सभी को हमारे प्रतिमानों को समायोजित करने की आवश्यकता है।

अग्रिम धन्यवाद लुका जी Soave

उत्तर

10

पूरी तरह से दो ऐप्स नहीं चल रहा सिर्फ डेटाबेस के दो प्रकार के लिए द्वारा बातों पर-को मुश्किल करने के लिए कोई ज़रूरत नहीं है। ऐसा लगता है कि आपको DataMapper की आवश्यकता है। यह वही करेगा जो आपको बॉक्स से बाहर करने की ज़रूरत है। रेल के साथ एकीकृत करने के लिए डीएम-रेल मणि प्राप्त करें।

ActiveRecord के विपरीत, डेटामैपर में, आपको अपने अंतर्निहित डेटा स्टोर के बारे में सभी विवरण प्रदान करना होगा: इसमें कौन से फ़ील्ड हैं, वे आपके मॉडल में विशेषताओं को कैसे मैप करते हैं, तालिका नाम क्या हैं (यदि डेटाबेस में हैं), क्या बैकएंड इत्यादि आदि का उपयोग करता है

दस्तावेज़ीकरण पढ़ें ... आपको एक विचार देने के लिए कोड का एक बाल्टी लोड है।

प्रत्येक मॉडल केवल एक सादे पुरानी रूबी वस्तु है। वर्ग परिभाषा सिर्फ DataMapper::Resource में घुलमिल, जो आप DataMapper कार्यक्षमता के सभी तक पहुँच देता है:

class User 
    include DataMapper::Resource 

    property :id,   Serial 
    property :username,  String 
    property :password_hash, String 
    property :created_at, DateTime 
end 

आप फिर भी नियंत्रण का एक बहुत कुछ है। उदाहरण के लिए, मैं निर्दिष्ट कर सकता हूं कि यह मॉडल मेरे डिफ़ॉल्ट डेटा स्टोर (भंडार) में स्टोर नहीं है और यह किसी अन्य कॉन्फ़िगर किए गए डेटा स्टोर में संग्रहीत है (जो आपको पसंद है, तो कोई नोएसक्यूएल स्टोर हो सकता है)।

class User 
    include DataMapper::Resource 

    storage_names[:some_other_repo] = 'whatever' 

    # ... SNIP ... 
end 

अधिकतर डीएम स्टेरॉयड पर ActiveRecord की तरह व्यवहार करता है। आप रिकॉर्ड खोजने (सिवाय आप मूल फ़ील्ड नाम का उपयोग करने के अपने मॉडल उन्हें दूर सार की आवश्यकता नहीं है) की तरह सभी मूल बातें मिलता है,:

new_users = User.all(:created_at.gte => 1.week.ago) 

आप सत्यापन मिलता है, आप पर्यवेक्षकों मिलता है, आप कुल हैंडलिंग मिलता है ... फिर अन्य सामानों का एक गुच्छा प्राप्त करें, जैसे सामरिक उत्सुक-लोडिंग (एन + 1 क्वेरी समस्या हल करती है), बड़े टेक्स्ट/ब्लॉब फ़ील्ड की आलसी लोडिंग, एकाधिक रिपोजिटरी समर्थन। मेरी राय में क्वेरी तर्क एआर की तुलना में काफी अच्छा है। बस दस्तावेज़ों का एक पठन है। वे मानव-अनुकूल हैं। सिर्फ एक एपीआई संदर्भ नहीं।

नकारात्मक क्या है? खैर, कई रत्न इस बात पर ध्यान नहीं देते हैं कि आप ActiveRecord का उपयोग नहीं कर रहे हैं, इसलिए जब आपको किसी चीज़ के लिए मणि की आवश्यकता होती है तो कुछ और करने की खोज होती है। यह समय के साथ बेहतर हो जाएगा, हालांकि रेल से 3.x पहले रेलवे के साथ डीएम को एकीकृत करने से पहले इतना आसान नहीं था।

+0

... क्या आप अधिक विशिष्ट हो सकते हैं? मेरा मतलब है, मैं वास्तव में आरामदायक हूं, जबकि मैन्गॉयड, जो रेल के दृष्टिकोण से समान होता है। वैसे भी हमें एक ही ऐप का जवाब देते हुए, एक MySQL डीबी भी प्रबंधित करने की आवश्यकता है। अग्रिम में धन्यवाद। –

+0

मेरा अपडेट देखें, और दस्तावेज़ीकरण पढ़ें ... यह सब वहाँ है। एकाधिक डेटाबेस/नो-एसक्यूएल/जो भी-आप-जैसा समर्थन बनाया गया है। – d11wtq

+0

यहां डेटामैपर के लिए मोंगोडीबी एडाप्टर है: https://github.com/solnic/dm-mongo-adapter – d11wtq

4

मैं आपके प्रश्न को पूरी तरह से समझ नहीं पा रहा हूं।,

  1. कि समस्या क्या आप अभी सामना कर रहे हैं एक ही अनुप्रयोग में मोंगो और MySQL का उपयोग कर रहा है, और
  2. की तरह क्या कई रेल अलग डीबीएस के साथ काम एप्लिकेशन जाने के लिए कारण।

हालांकि रूबी & रेल में कुछ विशेषज्ञ नहीं हैं (कुछ महीने पहले उठाए गए), मुझे यहां कुछ जोड़ना पसंद है।

मैं वर्तमान में बैंग एंड में दोनों मोंगो और माईएसक्यूएल का उपयोग कर रेल ऐप का निर्माण कर रहा हूं। Mongoid & ActiveRecord ड्राइवर हैं। अन्य सभी प्रकार के डेटा (भू-स्थानिक मुख्य रूप से) के लिए लेनदेन और मोंगो के लिए MySQL। यह सिर्फ सीधे आगे है। आप मोंगोइड और एक्टिव्रेकॉर्ड से विरासत में प्राप्त विभिन्न मॉडल बना सकते हैं।

class Item 
    include Mongoid::Document 
    field :name, :type => String 
    field :category, :type => String 
end 

और

class User < ActiveRecord::Base 
end 

और तुम दोनों जिस तरह से एक ही तरह से क्वेरी कर सकता है

Item.where(:category => 'car').skip(0).limit(10) 
User.where(:name => 'ram') 
(छोड़कर जटिल एसक्यूएल मिलती है, यह भी mongoid कुछ अतिरिक्त प्रश्नों के भू स्थानिक प्रकार के लिए पैटर्न में जानना चाहते है)

इसकी एक हवा। लेकिन कुछ महत्वपूर्ण मुद्दे हैं जिन्हें आपको

  1. मोंगोइड मॉडल से पहले अपने सक्रिय रिकॉर्ड मॉडल बनाएं। एक बार मोंगोइड सक्रिय हो जाता है (रेल जी गोंडॉयड पर: config - mongoid.yml जोड़ा गया) सभी मचान, और पीढ़ी मोंगो डीबी की ओर काम करती है। अन्यथा जब भी आप Activerecord मॉडल
  2. बनाने से पहले mongoid.yml को हटाने की आवश्यकता है और एक रिलेशनल तरीके से mongoid का उपयोग न करें। मुझे पता है कि mongoid realtions को परिभाषित करने के लिए कई विकल्प प्रदान करता है। Belongs_to संबंधों की तरह बच्चों के दस्तावेजों में refernece आईडी स्टोर करता है। यह मोन्गो डीबीआरफ के काफी विपरीत है। सक्रिय रिकॉर्ड महसूस के पक्ष में मोंगो मुहावरे छोड़ते समय यह बहुत भ्रमित है। तो इसकी प्रकृति प्रकृति से चिपकने का प्रयास करें। जब भी आवश्यक हो एम्बेड करें और डीबीआरएफ का प्रयोग करें। (अगर कोई गलत हो तो मुझे भ्रमित कर सकता है)

अभी भी Mongoid एक अच्छा काम है। यह पूरी तरह से सुविधाओं के साथ भरा हुआ है।

+0

हां, ऐसा लगता है कि यह वास्तव में काम करता है ..., कुछ अंतर्निहित चरणों के साथ निम्नलिखित है: मैंने पिछले, पूरी तरह से कार्यात्मक रेल 3.0.7 ऐप से शुरू किया है, जो पहले मोंगोइड के साथ बंडल किया गया था। 1) मणि 'mysql2' (या अन्य एडाप्टर जैसे sqlite3) को Gemfile और रन बंडल 2) जोड़ें "सक्रिय_रेकॉर्ड/रेलटी" की आवश्यकता है और कॉन्फ़िगर/एप्लिकेशन में "रेल/test_unit/Railtie" की आवश्यकता है।आरबी 3) कॉन्फ़िगर/डेटाबेस.आईएमएल (con fi g/mongodb.ym के साथ एक साथ रहना) –

+0

... विभिन्न डीबीएस से निपटने वाले एकाधिक रेल ऐप (इंजन या सिनात्रा एंडपॉइंट्स) जाने का मेरा कारण था: (1) बेहतर रखरखाव के लिए encapsulation/उन्नयन, (2) अन्य ऐप्स में अंततः पुन: उपयोग करने के लिए मॉड्यूलरिटी, (3) पठनीयता और इसी तरह। बेशक यह सादगी बनाम है लेकिन यह आखिरी जीत लगता है! –

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