sql >> Base de Datos >  >> RDS >> Mysql

Comparación de dos diseños de base de datos para mensajería interna

Fortalezas de la primera

El primer esquema obedece a mejores reglas de normalización, por lo que probablemente sea mejor en la mayoría de los casos.

Tener un thread_id , que es básicamente una clave natural, que no es un FK a otra tabla, probablemente esté buscando problemas. Será muy difícil hacer cumplir que es único cuando tú quieres que lo sea, y lo mismo cuando tú quieres que lo sea. Por esta razón, recomendaría el primer esquema sugerido.

Fortalezas del segundo

Su segundo esquema permite modificar el asunto para cada mensaje en el hilo. Si esta es una característica que desea, no puede usar la primera opción, como lo ha escrito (pero vea a continuación).

Otras opciones

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

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

En lugar de tener un thread_id concepto, puedes tener un parent concepto. Luego, cada respuesta apuntará al registro del mensaje original. Esto permite enhebrar, sin una tabla de 'hilos'. Otra posible ventaja de esto es que permite árboles de rosca también. En pocas palabras, puede representar relaciones mucho más complicadas entre mensajes y respuestas de esta manera. Si no le importa eso, entonces esto no será una bonificación para su aplicación.

Si no le importan las ventajas de subprocesamiento que acabo de mencionar, probablemente recomendaría un híbrido de sus dos esquemas:

MessageThread(models.Model):
    - id

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

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

Esto es similar al primer esquema, excepto que moví la columna 'asunto' del MessageThread al Message table, para permitir que el tema cambie a medida que avanza el hilo ... Simplemente estoy usando la tabla MessageThread para actuar como una restricción en la identificación del hilo utilizada en Message (que supera las limitaciones que mencioné al comienzo de mi respuesta). Es posible que también tenga metadatos adicionales que desee incluir en la tabla MessageThread, pero eso se lo dejo a usted y a su aplicación.