पहले की ताकत
पहला स्कीमा बेहतर सामान्यीकरण नियमों का पालन करता है, और इसलिए शायद ज्यादातर मामलों में बेहतर होता है।
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 तालिका में भी शामिल करना चाहते हैं, लेकिन मैं इसे आपके और आपके आवेदन पर छोड़ दूंगा।