2010-02-10 9 views
5

मान लें कि हमारे पास एक लोकप्रिय साइट है। हमें उपयोगकर्ताओं के बीच मेल-जैसी मैसेजिंग को लागू करने की आवश्यकता है।मेल-जैसी संदेश के लिए स्केलेबल MySQL डेटाबेस

उपयोगकर्ता (user_id)

संदेश (message_id, SENDER_ID (संदर्भ user_id), receiver_id (संदर्भ user_id), विषय, शरीर): ठेठ समाधान 2 तालिकाओं का उपयोग करने के लिए है।

इस विधि 2 महत्वपूर्ण सीमाओं

  1. सभी उपयोगकर्ताओं के सभी संदेश एक मेज यह करने के लिए अग्रणी में जमा हो जाती उच्च लोड और समग्र डेटाबेस प्रदर्शन घटा है है।
  2. जब किसी को कई उपयोगकर्ताओं को एक साथ संदेश भेजने की आवश्यकता होती है, तो संदेश कॉपी (प्राप्तकर्ता_count) बार कॉपी हो जाता है।

    उपयोगकर्ता (user_id)

    Sent_messages (sent_id, SENDER_ID (संदर्भ user_id), विषय, शरीर)

    Received_messages:

अन्य समाधान 3 टेबल का उपयोग करता है (sent_id, receiver_id (संदर्भ उपयोगकर्ता_आईडी), विषय, शरीर)

प्राप्त_मेसेज के विषय और निकाय को भेजे गए_मेसेज के संबंधित क्षेत्रों से कॉपी किया गया है।

इस विधि एक और

  • उपयोगकर्ताओं के लिए एक मेज से जानकारी को कॉपी वास्तव में भेजा हटा सकते हैं द्वारा डेटाबेस Denormalizing

    1. की ओर जाता है/उन्हें रिसीवर/प्रेषकों से निकाले बिना संदेश प्राप्त हुए।
    2. संदेश लगभग 2 गुना अधिक स्थान लेते हैं
    3. प्रत्येक तालिका लगभग 2 गुना कम लोड होती है।

      1. कौन सा माना डिजाइन में से एक उच्च लोड और scalability के लिए बेहतर है:

      तो यहाँ सवाल जाना? (मुझे लगता है कि यह दूसरा है)

    4. क्या कोई अन्य डेटाबेस डिज़ाइन है जो उच्च लोड को संभाल सकता है? यह क्या है? मर्यादाएं क्या होती हैं?

    धन्यवाद!

    पीएस मैं समझता हूं कि इन स्केलेबिलिटी मुद्दों को प्राप्त करने से पहले साइट को बहुत सफल होना है, लेकिन मैं जानना चाहता हूं कि मुझे क्या करना है।

    अद्यतन

    वर्तमान में पहले संस्करण मैं डैनियल वसालो द्वारा प्रस्तावित डिजाइन का उपयोग किया जाएगा के लिए

    ।लेकिन अगर भविष्य में सब कुछ ठीक है, तो डिजाइन दूसरे स्थान पर बदल दिया जाएगा। इसके बारे में मेरी आशंका को दूर करने के लिए उलझाने के लिए धन्यवाद।

  • उत्तर

    3

    यदि आप एकाधिक प्राप्तकर्ताओं को संदेश भेजा जाता है तो आप संदेश निकाय को कई बार कॉपी करने से बच सकते हैं।

    • उपयोगकर्ताओं (user_id)

    • संदेशों (message_id, SENDER_ID, विषय, शरीर)

    • : यहाँ एक और विकल्प है जो आप विचार कर सकते हैं है rece_messages (message_id, user_id, address_mode, हटाया गया)

    यह मॉडल हो सकता है और अधिक चहचहाना की तरह ईमेल की तरह से है, लेकिन यह कुछ लाभ के साथ आ सकते हैं।

    नियम हैं कि:

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

    इन फायदों में से कुछ हैं:

    • यह दो विकल्प मूल प्रश्न में उल्लेख किया है की तुलना में कम जगह लेता है, खासकर अगर उन आमतौर पर एकाधिक प्राप्तकर्ताओं को संदेश भेज देंगे।
    • संदेश तालिका की आसान कैशिंग, क्योंकि संदेश कभी डुप्लीकेट नहीं होते हैं।
    • संदेश प्राप्त करने वाला प्राप्तकर्ता इस उपयोगकर्ता को संदेश भेजा गया जानकारी मिटा नहीं देगा। इसे get_messages तालिका में 'हटाए गए' के ​​रूप में चिह्नित किया जाएगा।
    • और आपको सामान्यीकृत मॉडल भी मिलता है।

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

    +0

    धन्यवाद!मैंने यह डिजाइन भी माना। असल में इस प्रश्न को पोस्ट करने के बाद मैंने (मानसिक रूप से :)) पहले डिजाइन को उपयोगकर्ताओं (user_id) संदेश (message_id, sender_id, receiver_id, message_content_id) संदेश_content (message_content_id, विषय, शरीर) तो ये दोनों डिज़ाइन बेहतर से बेहतर हैं पहला एक (अंतरिक्ष में लिया गया और तालिका प्रदर्शन में)। हो सकता है कि प्रश्न कथन कुछ ऐसा होना चाहिए: क्या सभी संदेशों को एक टेबल में स्टोर करना बेहतर है, या उन्हें दो में कॉपी करना बेहतर है? प्रदर्शन पर असर कितना महत्वपूर्ण होगा? –

    1

    सामान्य डेटाबेस आकार में कोई चिंता नहीं होगी। गति बहुत अधिक महत्वपूर्ण है।

    इसलिए, मैं विकल्प दो के लिए जाने का लुत्फ उठाउंगा। जैसा कि आपने बताया है, यह चीजों को संदेशों को हटाने में आसान बनाता है, और मुझे पूरा यकीन है कि यह करने का यह एक आम तरीका है।

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