Forças do primeiro
O primeiro esquema obedece a melhores regras de normalização e, portanto, provavelmente é melhor na maioria dos casos.
Ter um
thread_id
, que é basicamente uma chave natural, que não é um FK para outra tabela provavelmente está pedindo problemas. Será muito difícil impor que é único quando você quer que seja, e o mesmo quando você quer que seja. Por esta razão, eu encorajaria o primeiro esquema sugerido. Forças do segundo
Seu segundo esquema permite que o assunto seja alterado para cada mensagem no encadeamento. Se este é um recurso que você deseja, você não pode usar a primeira opção, como você a escreveu (mas veja abaixo).
Outras opções
Message
- id
- parent (fk to Message.id)
- subject
- content
- timestamp
- sender (fk)
MessageRecipient
- message_id (fk)
- recipient (fk)
- status (read, unread, deleted)
Em vez de ter um
thread_id
conceito, você pode ter um parent
conceito. Em seguida, cada resposta apontará para o registro da mensagem original. Isso permite o encadeamento, sem uma tabela 'thread'. Outra possível vantagem disso é que permite árvores de threads também. Simplificando, você pode representar relacionamentos muito mais complicados entre mensagens e respostas dessa maneira. Se você não se importa com isso, isso não será um bônus para sua inscrição. Se você não se importa com as vantagens de encadeamento que acabei de mencionar, provavelmente recomendaria um híbrido de seus dois esquemas:
MessageThread(models.Model):
- id
Message(models.Model):
- thread (pk)
- subject
- content
- timestamp
- sender
MessageRecipient
- message_id (pk)
- recipient (pk)
- status (read, unread, deleted)
Isso é semelhante ao primeiro esquema, exceto que eu movi a coluna 'assunto' do
MessageThread
para a Message
table, para permitir que o assunto mude conforme o thread progride... Estou simplesmente usando a tabela MessageThread para atuar como uma restrição no ID do thread usado em Message (o que supera as limitações que mencionei no início da minha resposta). Você também pode ter metadados adicionais que deseja incluir na tabela MessageThread, mas deixarei isso para você e seu aplicativo.