Mysql
 sql >> Database >  >> RDS >> Mysql

Confronto di due progetti db per la messaggistica interna

I punti di forza del primo

Il primo schema obbedisce a regole di normalizzazione migliori e quindi è probabilmente migliore nella maggior parte dei casi.

Avere un thread_id , che è fondamentalmente una chiave naturale, che non è un FK su un altro tavolo probabilmente sta cercando problemi. Sarà molto difficile far rispettare che è unico quando vuoi che lo sia, e lo stesso quando vuoi che lo sia. Per questo motivo, incoraggerei il primo schema suggerito.

Forze del secondo

Il tuo secondo schema consente di modificare l'oggetto per ogni messaggio nel thread. Se questa è una funzionalità che desideri, non puoi utilizzare la prima opzione, come l'hai scritta (ma vedi sotto).

Altre opzioni

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

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

Invece di avere un thread_id concept, puoi invece avere un parent concetto. Quindi ogni risposta punterà al record del messaggio originale. Ciò consente il threading, senza una tabella "thread". Un altro possibile vantaggio di questo è che consente alberi di thread anche. In poche parole, puoi rappresentare relazioni molto più complicate tra messaggi e risposte in questo modo. Se non ti interessa, questo non sarà un bonus per la tua domanda.

Se non ti interessano i vantaggi del threading che ho appena menzionato, probabilmente consiglierei un ibrido dei tuoi due schemi:

MessageThread(models.Model):
    - id

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

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

Questo è simile al primo schema, tranne per il fatto che ho spostato la colonna "oggetto" da MessageThread al Message tabella, per consentire all'oggetto di cambiare man mano che il thread avanza ... Sto semplicemente usando la tabella MessageThread per fungere da vincolo sull'ID thread utilizzato in Message (che supera le limitazioni che ho menzionato all'inizio della mia risposta). Potresti avere ulteriori metadati che desideri includere anche nella tabella MessageThread, ma lo lascerò a te e alla tua applicazione.