Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Comparando dois designs de banco de dados para mensagens internas

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.