2010-04-20 3 views
11

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

प्रोफ़ाइल तालिका

user_id 
first_name 
last_name 

संदेश तालिका

message_id 
message_body 
time_stamp 

user_message_ref तालिका

user_id (FK) 
message_id (FK) 
is_sender (boolean) 
ऊपर सूचीबद्ध स्कीमा के साथ

, मैं किसी भी संदेश के लिए क्वेरी कर सकते हैं कि " बॉब "चाहे वह प्राप्तकर्ता या प्रेषक हो, भले ही हो।

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

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

संदेश

{ 
    "_id" : <objectID>, 
    "users" : ["bob", "amy"], 
    "user_msgs" : 
     [ 
      { 
       "is_sender" : "bob", 
       "msg_body" : "Hi Amy, how are you?!", 
       "timestamp" : <generated by Mongo> 
      } 
      { 
       "is_sender" : "amy", 
       "msg_body" : "Bob, long time no see, how is the family?!", 
       "timestamp" : <generated by Mongo> 
      } 
     ] 
} 

इस तरह से मैं संदेशों के लिए क्वेरी कर सकते हैं कि शामिल "बॉब," और "user_msgs" सरणी के माध्यम से लूप। मैं यह बताने में सक्षम हूं कि प्रेषक कौन है और टाइमस्टैम्प द्वारा क्रमबद्ध करें।

+0

यह अच्छी डिजाइन की तरह दिखता है। लेकिन मैं एक समस्या से फंस गया हूँ। मैं बातचीत धागे को लागू करना चाहता हूं। इसलिए, जब कोई उपयोगकर्ता अपना संदेश खोलता है तो उसे प्रत्येक वार्तालाप थ्रेड के लिए हर अंतिम संदेश देखना चाहिए (भेजा या प्राप्त कोई फर्क नहीं पड़ता)। तो बॉब को एमी और क्रिस के साथ और एन के साथ अंतिम आदान-प्रदान संदेश दिखाई देगा ... (उदाहरण के लिए यह लिंक्डइन पर इस तरह से काम करता है)। लेकिन मुझे नहीं पता कि यह कैसे पूछें। तो वर्तमान स्कीमा के साथ: बॉब के साथ प्रत्येक 'ब्लॉग पोस्ट' के लिए मुझे एम्बेडेड सरणी से केवल एक अंतिम संदेश प्राप्त करने की आवश्यकता है। कोई विचार? – maret

उत्तर

2

इसे समझ लिया। मूल पोस्ट में उपरोक्त मेरी व्याख्या देखें।

+0

क्या आपको कुछ प्रकार की अधिसूचनाओं के लिए 'is_read' संपत्ति याद आई थी? यदि नहीं, क्या स्कीमा? –

1

आपको दो संग्रह (उपयोगकर्ता और संदेश) के बीच किसी प्रकार के लिंक की आवश्यकता होगी।

व्यक्तिगत रूप से, मैं इसे सरल रखने के लिए और प्रेषक और प्राप्तकर्ता, कुछ इस तरह की आईडी ट्रैक करने के लिए दो अतिरिक्त क्षेत्रों जोड़ना होगा:

{ 
    _id: /* whatever_id */, 
    message_body: "This is the message", 
    date_sent: 2010-04-20T10:35, 
    sender_id: /*id_of_sender*/, 
    recipient_id: /* id_of_recipient */ 
} 

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

एक और तरीका प्रभावी ढंग से एक ही काम करने के लिए हो सकता है, लेकिन औपचारिक DBRef को प्रेषक और प्राप्तकर्ता के लिए केवल अपनी आईडी डालने की बजाय उपयोग करना है। यह संभवतः साथ ही काम करेगा लेकिन मैं इसके साथ जाऊंगा पिछले समाधान सिर्फ इसलिए कि यह पूछना आसान और संभवतः आसान है।

दोनों समाधानों को उपयुक्त उपयोगकर्ता दस्तावेज़ों को पकड़ने के लिए डीबी के लिए एक और राउंड-ट्रिप करने की आवश्यकता होगी (उदाहरण के लिए "से" और "से" नाम प्रदर्शित करने के लिए)।


संपादित करें:
ऐसा लगता है मैं गलत समझा है कि आप क्या हासिल करने की कोशिश कर रहे हैं - मुझे नहीं पता था फेसबुक मैसेजिंग सूत्रण के किसी भी अवधारणा शामिल किया। हालांकि, ऊपर प्रस्तुत किया गया समाधान ध्वनि दिखता है। निजी तौर पर, मैं उनके नामों (एलिस & बॉब) के बजाय उपयोगकर्ताओं के लिए आईडी में चिपक जाता हूं, लेकिन यह इसके अलावा काफी काम करने योग्य दिखता है।

+0

यह एक दुःस्वप्न "थ्रेडिंग" करेगा। किसी भी तरह से मैं इसे एक लास फेसबुक के एक वार्तालाप प्रारूप में दिखाने में सक्षम नहीं होगा। – luckytaxi

+0

हम्म, मैं फेसबुक के संदेश से परिचित नहीं हूं। मैंने अभी माना है कि प्रत्येक संदेश अपनी इकाई थी, मुझे नहीं पता था कि इसमें थ्रेडिंग की अवधारणा थी। क्षमा करें अगर मैंने गलत समझा है। –

+0

अरे कोई समस्या नहीं, मैंने पहले आपके विचार के बारे में सोचा और अगर मैं एक और ट्विटर बना रहा तो यह समझ में आ जाएगा। मगर आपकी सलाह के लिए धन्यवाद! – luckytaxi

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