Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

So sánh hai thiết kế db cho nhắn tin nội bộ

Điểm mạnh của lần đầu tiên

Lược đồ đầu tiên tuân theo các quy tắc chuẩn hóa tốt hơn và vì vậy có lẽ tốt hơn trong hầu hết các trường hợp.

thread_id , về cơ bản là một khóa tự nhiên, đó không phải là FK cho một bảng khác có thể gây ra rắc rối. Sẽ rất khó để thực thi rằng nó là duy nhất khi bạn muốn, và giống khi bạn muốn. Vì lý do này, tôi khuyến khích sử dụng lược đồ được đề xuất đầu tiên.

Điểm mạnh của phần thứ hai

Lược đồ thứ hai của bạn cho phép thay đổi chủ đề cho mỗi thư trong chuỗi. Nếu đây là một tính năng bạn muốn, bạn không thể sử dụng tùy chọn đầu tiên, như bạn đã viết (nhưng hãy xem bên dưới).

Các tùy chọn khác

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

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

Thay vì có thread_id khái niệm, bạn có thể intead có một parent ý tưởng. Sau đó, mọi câu trả lời sẽ trỏ đến bản ghi của thư gốc. Điều này cho phép phân luồng, không cần bảng 'luồng'. Một lợi thế có thể có khác của điều này, là nó cho phép cây chủ đề cũng. Nói một cách đơn giản, bạn có thể biểu diễn các mối quan hệ phức tạp hơn nhiều giữa các tin nhắn và thư trả lời theo cách này. Nếu bạn không quan tâm đến điều đó, thì đây sẽ không phải là phần thưởng cho đơn đăng ký của bạn.

Nếu bạn không quan tâm đến các ưu điểm của luồng mà tôi vừa đề cập, có lẽ tôi sẽ đề xuất kết hợp hai lược đồ của bạn:

MessageThread(models.Model):
    - id

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

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

Điều này tương tự như giản đồ đầu tiên, ngoại trừ việc tôi đã di chuyển cột 'chủ đề' từ MessageThread tới Message để cho phép chủ đề thay đổi khi luồng tiến triển ... Tôi chỉ đơn giản là đang sử dụng bảng MessageThread để hoạt động như một ràng buộc đối với ID luồng được sử dụng trong Message (khắc phục những hạn chế mà tôi đã đề cập ở đầu câu trả lời của mình). Bạn cũng có thể có dữ liệu meta bổ sung mà bạn muốn đưa vào bảng MessageThread, nhưng tôi sẽ để điều đó tùy thuộc vào bạn và ứng dụng của bạn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi hàng thành cột trong MySQL

  2. Cách xuất &nhập người dùng hiện tại (với các đặc quyền của nó!)

  3. Các phương pháp hay nhất cho cờ bit trong PHP

  4. Cách tạo và duy trì Cơ sở dữ liệu MySQL trong cPanel

  5. mysql - chọn giờ trong ngày giờ và nhóm