Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Vergleich zweier DB-Designs für internes Messaging

Stärken des Ersten

Das erste Schema gehorcht besseren Normalisierungsregeln und ist daher wahrscheinlich in den meisten Fällen besser.

Eine thread_id haben , was im Grunde ein natürlicher Schlüssel ist, der kein FK zu einem anderen Tisch ist, fordert wahrscheinlich Ärger. Es wird sehr schwierig sein, durchzusetzen, dass es einzigartig ist, wenn Sie es haben möchten, und dasselbe, wenn Sie es möchten. Aus diesem Grund würde ich das erste vorgeschlagene Schema empfehlen.

Stärken des Zweiten

Ihr zweites Schema ermöglicht das Ändern des Betreffs für jede Nachricht im Thread. Wenn dies eine Funktion ist, die Sie möchten, können Sie die erste Option nicht verwenden, wie Sie es geschrieben haben (aber siehe unten).

Andere Optionen

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

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

Anstelle einer thread_id Konzept, können Sie stattdessen einen parent haben Konzept. Dann verweist jede Antwort auf den Datensatz der ursprünglichen Nachricht. Dies ermöglicht Threading ohne eine 'Thread'-Tabelle. Ein weiterer möglicher Vorteil davon ist, dass es Thread-Bäume zulässt auch. Einfach ausgedrückt, können Sie auf diese Weise viel kompliziertere Beziehungen zwischen Nachrichten und Antworten darstellen. Wenn dir das egal ist, dann ist das kein Bonus für deine Bewerbung.

Wenn Sie sich nicht für die Threading-Vorteile interessieren, die ich gerade erwähnt habe, würde ich wahrscheinlich eine Mischung aus Ihren beiden Schemas empfehlen:

MessageThread(models.Model):
    - id

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

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

Dies ähnelt dem ersten Schema, außer dass ich die Spalte „Betreff“ aus dem MessageThread verschoben habe zur Message Tabelle, damit sich das Thema im Verlauf des Threads ändern kann ... Ich verwende einfach die MessageThread-Tabelle, um als Einschränkung für die in Message verwendete Thread-ID zu fungieren (was die Einschränkungen überwindet, die ich zu Beginn meiner Antwort erwähnt habe). Möglicherweise möchten Sie auch zusätzliche Metadaten in die MessageThread-Tabelle aufnehmen, aber das überlasse ich Ihnen und Ihrer Anwendung.