2010-09-06 10 views
17

मैं सिर्फ मोंगोडीबी प्रोजेक्ट शुरू कर रहा हूं और मोंगोडीबी/नोएसक्यूएल स्कीमा सीखने का मौका देता हूं। यह एक लाइव चैट ऐप होगा और स्टैक में शामिल हैं: रेल 3, रूबी 1.9.2, डेविस, मोंगोइड/मोंगोडीबी, कैरियरवेव, रेडिस, JQuery।चैट ऐप के लिए मोंगो डीबी स्कीमा पर सलाह की आवश्यकता है। एंबेडेड बनाम संबंधित दस्तावेज़

मैं लाइव चैट मतदान/संदेश कतार अलग से संभालेगा। सुनिश्चित नहीं है कि अभी तक, या तो Node.js, एपीई या कस्टम EventMachine ऐप। लेकिन मोंगो के संबंध में, मैं ऐप में अन्य सभी चीज़ों के लिए इसका उपयोग करने के बारे में सोच रहा हूं, विशेष रूप से चैट लॉग और ऐतिहासिक प्रतिलेख।

मेरा सवाल यह है कि स्कीमा को कैसे डिजाइन करना सबसे अच्छा है क्योंकि मेरा पिछला अनुभव MySQL और रिलेशनल डीबी स्कीमा के साथ रहा है। और एक उप-प्रश्न के रूप में, हमारे लिए एम्बेडेड दस्तावेज़ बनाम संबंधित दस्तावेज़ों के लिए सबसे अच्छा कब है।

एप्लिकेशन होगा:

  • से अधिक खातों के कई कमरों में जो
  • एकाधिक कमरे
  • प्रति कमरा एक से अधिक उपयोगकर्ता
  • कमरों में एक उपयोगकर्ता
  • एकाधिक में होने की अनुमति दी है की सूची उपयोगकर्ता चैट प्रति कमरा
  • प्रति कमरा और प्रति उपयोगकर्ता आधार पर खोजने योग्य चैट लॉग
  • किसी दिए गए चैट

को देखते हुए मोंगो (कम से कम पिछली बार मैं जाँच की) के लिए वैकल्पिक फ़ाइल अनुलग्नक, 4MB के एक दस्तावेज़ सीमा होती है मैं कमरे के लिए एक संग्रह होने और एम्बेडेड दस्तावेजों के रूप में सभी कमरे चैट के भंडारण नहीं लगता कि बहुत अच्छा काम करेगा।

  • कमरे के लिए एक संग्रह
    • प्रत्येक कमरे में वापस करने के लिए संबंधित है खातों के लिए

      • एक संग्रह:

        मैं क्या अब तक सोचा है से, मैं की तरह कुछ करने का सोच रहा हूँ एक खाता

      • कमरे में सभी चैट संदेशों के लिए चैट संग्रह में संबंधित दस्तावेज
      • एम्बेडेड दस्तावेज़ वर्तमान में सभी उपयोगकर्ताओं को सूचीबद्ध करता है वह कमरे
    • एक उन
      • एंबेडेड दस्तावेज़
      • सभी कमरों उपयोगकर्ता
      • एंबेडेड सभी कमरों उपयोगकर्ता के लिए अनुमति दी है लिस्टिंग दस्तावेज़ में है लिस्टिंग
    • के लिए संग्रह चैट
      • प्रत्येक चैट कमरे संग्रह में एक कमरे से संबंधित है
      • प्रत्येक चैट उपयोगकर्ता संग्रह
      • वैकल्पिक अपलोड फ़ाइल अटैचमेंट के बारे में जानकारी के साथ एम्बेडेड दस्तावेज़ में उपयोगकर्ता से संबंधित है।

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

    एक और चिंता यह है कि संबंधित दस्तावेजों का संदर्भ मैंने सुनाई गई एम्बेडेड दस्तावेजों तक पहुंचने से बहुत धीमा है।

    • मुझे एक खाता
    • मुझे एक कमरे में सभी चैट दें के लिए सभी कमरों दें (या तिथि सीमा के माध्यम से फ़िल्टर किए गए)
    • मुझे सभी चैट दें:

      मैं जैसे कई व्यापक क्वेरी बनाना चाहते किसी विशिष्ट उपयोगकर्ता से

    • किसी दिए गए कमरे में या किसी दिए गए ऑर्ग
    • आदि के लिए मुझे सभी अपलोड की गई फ़ाइलों दें

    स्कीमा को स्केल करने के तरीके को कुशलतापूर्वक कैसे व्यवस्थित करने के बारे में कोई सुझाव? सबको धन्यवाद।

  • +0

    अंत में आपने किस दिशा में चयन किया था? आपने मोंगो में संबंधित दस्तावेजों के साथ डेटा अखंडता को कैसे संभाला? क्या आपने मोंगो के साथ किसी भी तिथि अखंडता के मुद्दों को समाप्त किया और यदि ऐसा है तो आप उनके आसपास कैसे पहुंचे? –

    उत्तर

    5

    मुझे लगता है कि आप सही रास्ते पर बहुत अधिक हैं। मैं चैट लाइनों के लिए capped collection का उपयोग करता हूं, जिसमें प्रत्येक आईडी में उपयोगकर्ता आईडी, रूम आईडी, टाइमस्टैम्प और क्या कहा गया था। एक बार कैप्ड संग्रह का "अंत" पहुंचने के बाद यह डेटा समाप्त हो जाएगा, इसलिए यदि आपको ऐतिहासिक लॉग की आवश्यकता है तो आप समय-समय पर "लॉग" संग्रह में डेटा को कॉपी किए गए संग्रह से कॉपी करना चाहते हैं, लेकिन कैप्ड संग्रह विशेष रूप से लॉगिंग के लिए डिज़ाइन किए गए हैं- शैली अनुप्रयोग जहां आप दस्तावेजों को हटाने के लिए नहीं जा रहे हैं, और सम्मिलन आदेश मायने रखता है। चैट के मामले में, यह एक आदर्श मैच है।

    एकमात्र अन्य परिवर्तन जो मैं सुझाता हूं वह एक अलग संग्रह में अपलोड को बनाए रखना होगा।

    +0

    अच्छा विचार क्रिस, मैं सिर्फ कैप्ड संग्रहों को देख रहा था। –

    +0

    मुझे लगता है कि अगर मेरे पास एक कैप्ड संग्रह और नियमित लॉग संग्रह था, तो मैं दोनों संग्रहों में केवल दो बार लिख सकता था। निश्चित रूप से लेखन भार दोगुना होगा। लेकिन, क्या मुझे हाल ही के चैट के लिए एक कैप्ड संग्रह की आवश्यकता होगी यदि मेरे पास नोड.जेएस या कक्षा में अलग चैट सर्वर है? मुझे लगता है कि न केवल सभी एसिंक संदेशों को संभालेगा बल्कि मैं उनको (एक समय में या बैचों में) मोंगोडब और चैट संग्रह में लिख सकता हूं और एक कैप्ड संग्रह की आवश्यकता नहीं है। तुम क्या सोचते हो? –

    +0

    मोंगो डीबी में लेखन डिफ़ॉल्ट रूप से असीमित हैं, इसलिए मैं दो बार लिखने की चिंता नहीं करता। एक कैप्ड संग्रह का आकर्षण यह है कि यह धारणाओं के कारण * बहुत तेज़ हो सकता है। यदि आप अक्सर सम्मिलित क्रम में अंतिम पंक्तियों को खींचने जा रहे हैं, तो एक कैप्ड संग्रह समझ में आता है। –

    2

    मैं दस्तावेज़ डेटाबेस के रूप में mongodb का एक बड़ा प्रशंसक हूं। लेकिन क्या आप वाकई सही कारण के लिए मोंगोडब का उपयोग कर रहे हैं? मोंगोडब शक्तिशाली क्या है?

    यह एक व्यक्तिपरक प्रश्न है लेकिन मेरे लिए दस्तावेज़ों पर इन-प्लेस (परमाणु) अपडेट के लिए मैंगोड शक्तिशाली है। और मैं वास्तव में आप इसका उपयोग करके नहीं देख सकता। और इसके शीर्ष पर आप दस्तावेज़ आकार सीमा समस्या को भी मार रहे हैं। (अनुभव के साथ मैं आपको बता सकता हूं कि mongodb को एम्बेड करने वाली फ़ाइलें एक अच्छा विचार नहीं है)। आप डेटाबेस के शीर्ष पर लाइव चैट एप्लिकेशन भी चाहते हैं।

    आपका दस्तावेज़ स्कीमा तार्किक लगता है। लेकिन मैं इस तरह के प्रोजेक्ट के लिए मोंगोडब के साथ नहीं जाऊंगा जहां आपका आवेदन भारी आवेषण पर निर्भर करता है। मैं कॉच डीबी के लिए जाऊंगा।

    कोच डीबी के साथ आपको संलग्नक समस्या के बारे में चिंता करने की आवश्यकता नहीं होगी, आप उन्हें आसानी से एम्बेड कर सकते हैं। "_changes" आपके जीवन को लाइव चैट एप्लिकेशन/लम्बी पूलिंग/फीडिंग सर्च इंजन (यदि आप एक को कार्यान्वित करना चाहते हैं) बनाने के लिए बहुत आसान बना देंगे।

    और मैंने सोफेन में open source showcase project देखा। इसमें आपके लक्ष्यों के साथ कुछ समानताएं हैं: Anologue। आपको इसे देखना चाहिए।

    पीएस: क्षमा करें यह एक छोटा विषय था लेकिन मैं खुद को पकड़ नहीं पाया।

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