Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Membandingkan dua desain db untuk pesan internal

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pilih semua proyek yang memiliki tag yang cocok

  2. GALAT 1044 (42000):Akses ditolak untuk pengguna ''@'localhost' ke database 'db'

  3. MySQL LIKE membatasi

  4. Mysql - Cara keluar/keluar dari prosedur tersimpan

  5. pt-table-sync, Masalah Aneh tentang Hostname