сильные стороны первого
Первая схема подчиняется лучшим правилам нормализации, и поэтому, вероятно, лучше в большинстве случаев.
Наличие thread_id
, который является в основном естественным ключом, который не является 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
. Тогда каждый ответ будет указывать на запись исходного сообщения. Это позволяет создавать потоки без таблицы «thread». Еще одним возможным преимуществом этого является то, что он также позволяет деревья потоков . Проще говоря, вы можете представить гораздо более сложные отношения между сообщениями и ответами таким образом. Если вас это не волнует, это не будет бонусом для вашего приложения.
Если вы не заботитесь о преимуществах многопоточности, о которых я только что упомянул, я бы порекомендовал гибрид двух ваших схем:
MessageThread(models.Model):
- id
Message(models.Model):
- thread (pk)
- subject
- content
- timestamp
- sender
MessageRecipient
- message_id (pk)
- recipient (pk)
- status (read, unread, deleted)
Это похоже на первую схему, за исключением того, что я переместил столбец 'subject' из таблицы MessageThread
в Message
, чтобы позволить субъекту изменяться по мере продвижения потока ... Я просто использую Таблица MessageThread, действующая как ограничение идентификатора потока, используемого в сообщении (которое преодолевает ограничения, о которых я упоминал в начале моего ответа). У вас могут быть дополнительные метаданные, которые вы также хотите включить в таблицу MessageThread, но я оставлю это на ваше усмотрение.