Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

आंतरिक मैसेजिंग के लिए दो डीबी डिज़ाइनों की तुलना करना

पहले की ताकत

पहला स्कीमा बेहतर सामान्यीकरण नियमों का पालन करता है, और इसलिए शायद ज्यादातर मामलों में बेहतर होता है।

thread_id Having होना , जो मूल रूप से एक प्राकृतिक कुंजी है, जो कि किसी अन्य तालिका के लिए FK नहीं है, शायद परेशानी पूछ रहा है। यह लागू करना बहुत मुश्किल होगा कि जब आप इसे चाहते हैं तो यह अद्वितीय होता है, और जब आप इसे चाहते हैं तो वही होता है। इस कारण से, मैं पहले सुझाए गए स्कीमा को प्रोत्साहित करूंगा।

दूसरे की ताकत

आपका दूसरा स्कीमा विषय को थ्रेड में प्रत्येक संदेश के लिए परिवर्तित करने की अनुमति देता है। यदि यह एक ऐसी सुविधा है जिसे आप चाहते हैं, तो आप पहले विकल्प का उपयोग नहीं कर सकते, जैसा कि आपने इसे लिखा है (लेकिन नीचे देखें)।

अन्य विकल्प

Message
    - id
    - parent (fk to Message.id)
    - subject
    - content
    - timestamp
    - sender (fk)

MessageRecipient
    - message_id (fk)
    - recipient (fk)
    - status (read, unread, deleted)

thread_id होने के बजाय अवधारणा, आपके पास एक parent हो सकता है संकल्पना। फिर प्रत्येक उत्तर मूल संदेश के रिकॉर्ड की ओर इशारा करेगा। यह थ्रेडिंग की अनुमति देता है, बिना 'थ्रेड' टेबल के। इसका एक अन्य संभावित लाभ यह है कि यह थ्रेड ट्री . की अनुमति देता है भी। सीधे शब्दों में कहें, तो आप संदेशों और उत्तरों के बीच इस तरह से अधिक जटिल संबंधों का प्रतिनिधित्व कर सकते हैं। यदि आप इसकी परवाह नहीं करते हैं, तो यह आपके आवेदन के लिए बोनस नहीं होगा।

यदि आप मेरे द्वारा बताए गए थ्रेडिंग लाभों के बारे में परवाह नहीं करते हैं, तो मैं शायद आपके दो स्कीमाओं के एक संकर की सिफारिश करूंगा:

MessageThread(models.Model):
    - id

Message(models.Model):
    - thread (pk)
    - subject
    - content
    - timestamp
    - sender

MessageRecipient
    - message_id (pk)
    - recipient (pk)
    - status (read, unread, deleted)

यह पहली स्कीमा के समान है, सिवाय इसके कि मैंने MessageThread से 'विषय' कॉलम को स्थानांतरित कर दिया है Message . को तालिका, विषय को थ्रेड की प्रगति के रूप में बदलने की अनुमति देने के लिए ... मैं बस MessageThread तालिका का उपयोग संदेश में प्रयुक्त थ्रेड आईडी पर एक बाधा के रूप में कार्य करने के लिए कर रहा हूं (जो मेरे उत्तर की शुरुआत में उल्लिखित सीमाओं को पार करता है)। आपके पास अतिरिक्त मेटा डेटा हो सकता है जिसे आप MessageThread तालिका में भी शामिल करना चाहते हैं, लेकिन मैं इसे आपके और आपके आवेदन पर छोड़ दूंगा।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL प्रतिकृति त्रुटि 2003

  2. विंडोज़ और लिनक्स में जीएमटी का उपयोग करने के लिए MySQL कैसे सेट करें

  3. हाइबरनेट hbm2ddl.auto डिफ़ॉल्ट मान

  4. सम्मिलित नहीं चला सकते और उसी क्वेरी में LAST_INSERT_ID () का चयन करें?

  5. MySQL 8.0 डेटा फोल्डर को कैसे बदलें। क्या मैं वनड्राइव फ़ोल्डर का उपयोग कर सकता हूं?