database - sp_send_dbmail - Almacenamiento de mensajes de correo electrónico en una base de datos
perfil de correo sql server (9)
Es posible que desee comprobar la arquitectura y el esquema DB de "Archiveopteryx".
¿Qué tipo de esquema de base de datos usaría para almacenar mensajes de correo electrónico, con tanta información de encabezado como sea posible o práctico, en una base de datos?
Supongamos que se han introducido en un script del MTA y se han analizado en los encabezados / cuerpo / archivos adjuntos correspondientes.
¿Almacenaría el cuerpo del mensaje entero en la tabla de la base de datos, o dividiría alguna parte MIME? ¿Qué hay de los archivos adjuntos?
Depende de lo que vas a hacer con eso. Si vas a tener que realizar búsquedas frecuentes contra ciertos fragmentos del mismo, querrás dividirlo de manera que tenga sentido para tu caso de uso. Si es solo para algo como el almacenamiento de correo electrónico para el cumplimiento de la ley Sarbanes-Oxley, probablemente estarás bien almacenando todo (encabezados, partes, etc.) como un campo de texto grande.
Es posible que desee utilizar un esquema donde el cuerpo del mensaje y los registros adjuntos se puedan compartir entre varios destinatarios en el mensaje. No es raro ver servidores de correo electrónico donde el 50% del almacenamiento en disco es utilizado por correos electrónicos duplicados.
Un simple hash del cuerpo / archivo adjunto sería suficiente para ver si ese registro ya estaba en la base de datos. Sin embargo, aún necesitaría mantener encabezados separados.
No es trivial analizar un correo electrónico, así que considere almacenar el correo electrónico como un blob y luego analizarlo en los elementos que necesite más adelante.
/Alano
Si ya está dividido, y puede estar seguro de que la rutina para dividir los datos es sólida, entonces dividiría la tabla lo más detallada posible. Siempre puede analizarlo de nuevo en su nivel medio. Si el espacio no es un problema, siempre puedes almacenarlo dos veces. Uno, dividir en los campos pertinentes, y otro campo que tiene todo como una gota, si volver a armarlo es difícil.
Sugerencia: cree una tabla bien definida para almacenar el correo electrónico con una columna para cada parte relevante de un mensaje: remitente, encabezado, asunto, cuerpo. Va a ser mucho más simple más adelante si desea consultar, por ejemplo, por campo de asunto. En la misma tabla, puede definir un campo para mantener la ruta de un archivo adjunto y almacenar el archivo adjunto en el sistema de archivos, en lugar de almacenarlo en campos de blobs.
Todo depende de lo que quieras hacer con los datos, pero, en general, me gustaría almacenar todos los datos y también asegurarme de que la semántica interpretada por el MUA se conserva en el archivo db, por ejemplo: - Todos los encabezados que se analizan debe tener su propia columna - Una columna debe contener los encabezados completos - Los archivos adjuntos (incluido el cuerpo, las partes múltiples) deben estar en una tabla de muchos a uno con la tabla de correo electrónico.
Probablemente desee al menos almacenar archivos adjuntos por separado para optimizar el almacenamiento. Es asombroso ver el tamaño y la cantidad de archivos adjuntos (videos, etc.) que la mayoría de los usuarios adjunta sin vacilar a los correos electrónicos.
En el caso de los correos electrónicos salientes, es posible que tenga varios correos electrónicos que envíen el mismo archivo adjunto. Es mucho más eficiente almacenar una copia única del archivo adjunto al que hacen referencia todos los correos electrónicos que lo comparten.
Otra razón para almacenar archivos adjuntos por separado es que le da algunas opciones de archivo más adelante. Si el espacio de almacenamiento se convierte en un problema, siempre puede volver atrás y eliminar archivos adjuntos de gran tamaño anteriores a una fecha determinada para compactar la base de datos.
Un paso importante en el diseño del esquema de la base de datos es averiguar qué tipos de entidad desea modelar. Para esta aplicación, las entidades podrían ser:
- Mensajes
- Correos electrónicos
- Hilos de conversación (quizás: si desea hacer un enhebrado eficiente)
- Adjuntos (quizás: como se sugiere en otras respuestas)
- ...
Una vez que conoce las entidades, puede identificar relaciones entre entidades, que pueden representarse mediante tablas:
- Los mensajes tienen una relación muchos-muchos con los mensajes (encabezados
In-Reply-To
yReferences
). - Los mensajes tienen muchas relaciones con las direcciones de correo electrónico (
From
,To
,Cc
, etc.). - Los mensajes tienen una relación muchos con hilos.
- Los mensajes tienen una relación muchos con los archivos adjuntos.
- ...