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.