Đ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.
Có 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.