Kekuatan yang pertama
Skema pertama mematuhi aturan normalisasi yang lebih baik, dan mungkin lebih baik dalam banyak kasus.
Memiliki thread_id
, yang pada dasarnya adalah kunci alami, yang bukan FK ke tabel lain mungkin meminta masalah. Akan sangat sulit untuk menegakkan bahwa itu unik ketika Anda menginginkannya, dan sama ketika Anda menginginkannya. Untuk alasan ini, saya akan mendorong skema yang disarankan pertama.
Kekuatan detik
Skema kedua Anda memungkinkan subjek diubah untuk setiap pesan di utas. Jika ini adalah fitur yang Anda inginkan, Anda tidak dapat menggunakan opsi pertama, seperti yang telah Anda tulis (tetapi lihat di bawah).
Opsi lain
Message
- id
- parent (fk to Message.id)
- subject
- content
- timestamp
- sender (fk)
MessageRecipient
- message_id (fk)
- recipient (fk)
- status (read, unread, deleted)
Alih-alih memiliki thread_id
konsep, Anda dapat memiliki parent
konsep. Kemudian setiap balasan akan mengarah ke catatan pesan asli. Ini memungkinkan threading, tanpa tabel 'utas'. Keuntungan lain yang mungkin dari ini, adalah memungkinkan menghubungkan pohon demikian juga. Sederhananya, Anda dapat mewakili hubungan yang jauh lebih rumit antara pesan dan balasan dengan cara ini. Jika Anda tidak peduli tentang itu, maka ini tidak akan menjadi bonus untuk aplikasi Anda.
Jika Anda tidak peduli dengan keuntungan threading yang baru saja saya sebutkan, saya mungkin akan merekomendasikan hibrida dari dua skema Anda:
MessageThread(models.Model):
- id
Message(models.Model):
- thread (pk)
- subject
- content
- timestamp
- sender
MessageRecipient
- message_id (pk)
- recipient (pk)
- status (read, unread, deleted)
Ini mirip dengan skema pertama, kecuali bahwa saya memindahkan kolom 'subjek' dari MessageThread
ke Message
tabel, untuk memungkinkan subjek berubah saat utas berlangsung ... Saya hanya menggunakan tabel MessageThread untuk bertindak sebagai batasan pada ID utas yang digunakan dalam Pesan (yang mengatasi batasan yang saya sebutkan di awal jawaban saya). Anda mungkin memiliki meta data tambahan yang ingin Anda sertakan dalam tabel MessageThread juga, tetapi saya akan menyerahkannya kepada Anda dan aplikasi Anda.