2010-07-30 7 views
20

Quiero hacer que un sistema de mensajes de correo electrónico como gmail tenga. Me gustaría tener la siguiente opción: Starred, Trash, Spam, Draft, Read, Unread. En este momento tengo la siguiente estructura en mi base de datos:Diseño de base de datos para el sistema de mensajería de correo electrónico

CREATE TABLE [MyInbox](
    [InboxID] [int] IDENTITY(1,1) NOT NULL, 
    [FromUserID] [int] NOT NULL, 
    [ToUserID] [int] NOT NULL, 
    [Created] [datetime] NOT NULL, 
    [Subject] [nvarchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
    [Body] [nvarchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
    [IsRead] [bit] NOT NULL, 
    [IsReceived] [bit] NOT NULL, 
    [IsSent] [bit] NOT NULL, 
    [IsStar] [bit] NOT NULL CONSTRAINT [DF_MyInbox_IsStarred] DEFAULT ((0)), 
    [IsTrash] [bit] NOT NULL CONSTRAINT [DF_MyInbox_IsTrashed] DEFAULT ((0)), 
    [IsDraft] [bit] NOT NULL CONSTRAINT [DF_MyInbox_Isdrafted] DEFAULT ((0)) 
) ON [PRIMARY] 

Pero tengo algunos problemas con la estructura anterior. Ahora mismo, si un usuario A envía un mensaje de ms al usuario B, estoy almacenando una fila en esta tabla. Pero si el usuario B borra ese mensaje, este se borra del mensaje A del usuario enviado. Esto es incorrecto, quiero exactamente como lo hace el sistema de correo electrónico normal. Si A borra el mensaje de su artículo enviado, entonces B no debería eliminarse de su bandeja de entrada. Estoy pensando en otro problema que supondrá que un usuario A envíe un correo electrónico a 500 usuarios a la vez, de modo que según mi diseño, tendré 500 filas con cuerpos duplicados, es decir, no una manera eficiente de almacenarlo. ¿Podrían por favor ayudarme a hacer el diseño de un sistema de mensajería?

Respuesta

29

Necesita dividir su tabla para ello.Usted podría tener siguiente esquema y estructurar

CREATE TABLE [Users] 
    (
     [UserID] INT , 
     [UserName] NVARCHAR(50) , 
     [FirstName] NVARCHAR(50) , 
     [LastName] NVARCHAR(50) 
    ) 

CREATE TABLE [Messages] 
    (
     [MessageID] INT , 
     [Subject] NVARCHAR(MAX) , 
     [Body] NVARCHAR(MAX) , 
     [Date] DATETIME, 
     [AuthorID] INT, 
    ) 

CREATE TABLE [MessagePlaceHolders] 
    (
     [PlaceHolderID] INT , 
     [PlaceHolder] NVARCHAR(255)--For example: InBox, SentItems, Draft, Trash, Spam 
    ) 

CREATE TABLE [Users_Messages_Mapped] 
    (
     [MessageID] INT , 
     [UserID] INT , 
     [PlaceHolderID] INT, 
     [IsRead] BIT , 
     [IsStarred] BIT 

    ) 

base de datos Diagrama:. alt text http://codeasp.net/Assets/Uploaded-CMS-Files/13f15882-7ed9-4e22-8e2c-20c6527522317-31-2010%2012-51-50%20AM.png

En la tabla usuarios que pueden recibir los usuarios "Mensajes" marca la tabla de mensajes. "MessagePlaceHolders" denota la tabla para marcadores de posición para mensajes. Los marcadores de posición pueden ser bandeja de entrada, artículo enviado, borrador, correo no deseado o basura. "Users_Messages_Mapped" denota la tabla de asignación para usuarios y mensajes. El "UserID" y "PlaceHolderID" son las claves foráneas. "IsRead" e "IsStarred" significan su nombre. Si no se encuentra ningún registro para un messageid en particular en la tabla "Users_Messages_Mapped", ese registro se eliminará de la tabla Messages ya que ya no lo necesitamos.

+0

¿Puede describir, cómo podemos saber en este diseño qué es de usuario y para quién se envía el mensaje? – zarpio

+0

@zarpio el ID de autor en la tabla de mensajes es ID de remitente. –

+0

¿No debería tener una clave compuesta en la tabla Users_Messages_Mapped? – user3308043

3

Creo que se necesita para descomponer el esquema un poco más. Almacene los correos electrónicos por separado y asigne las bandejas de entrada a los mensajes que contienen.

4

Si estás haciendo un trabajo orientado documento, sugiero echar un vistazo a CouchDB. Es sin esquema, lo que significa que problemas como este desaparecen.

Vamos a echar un vistazo al ejemplo: A envía un mensaje a B, y es eliminada por B.

Se podría tener una sola instancia del documento, con recipients aparece como un atributo del correo electrónico. A medida que los usuarios eliminan mensajes, puede eliminarlos de la lista de destinatarios o agregarlos a una lista de deleted_by o lo que elija.

Es un enfoque muy diferente a los datos de lo que estamos acostumbrados, pero puede ser altamente beneficioso tomar algún tiempo para considerar.

0

Un mensaje solo puede estar en una carpeta a la vez, por lo que desea una tabla de carpetas (que contenga carpetas 'Papelera', 'Bandeja de entrada', 'Archivar', etc.) y una clave externa de mensajes a carpetas. Para las etiquetas, tiene una relación de varios a muchos, por lo que necesita una tabla de etiquetas y también una tabla de enlaces (labels_de_mess). Para protagonizar, una columna de bit simple debería hacer, lo mismo para 'no leído'.

2

Si yo fuera usted me puse dos banderas uno para el emisor y el otro para el receptor si ambas banderas son verdaderas entonces el mensaje deberían suprimirse de la base de datos de otro modo tener eso en la base de datos, sino que esconderlo de borrado.

Haga lo mismo con la basura. Es posible que desee ejecutar cron o verificar manualmente si tanto el emisor como el receptor eliminan el mensaje y luego lo eliminan de la base de datos.

1

Se puede crear una mesa para MessageContacts, que la une cada mensaje a las personas que tienen en sus buzones. Cuando un usuario elimina un mensaje, se borra una fila de MessageContacts pero se conserva el mensaje original.

se puede hacer eso ... pero yo sugeriría que no lo hace. A menos que sea un ejercicio académico establecido por su tutor, seguramente es una completa pérdida de tiempo desarrollar su propio sistema de mensajería. Si es tarea, entonces deberías decirlo. Si no, entonces ve a hacer algo más útil en su lugar.

0

¿POR QUÉ ELIMINAR? Creo que no hay necesidad de eliminar nada. Solo ocúltalo, de los usuarios cuando se eliminan. Debido a que será un problema comprobar ambas partes, cuando el remitente envíe el mismo mensaje a muchos destinatarios. Luego debe verificar y marcar a todos los destinatarios. Si todo está bien, entonces elimine ... Creo que no hay necesidad de borrar nada.

1
CREATE TABLE `mails` ( 
    `message_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `message` varchar(10000) NOT NULL DEFAULT '', 
    `file` longblob, 
    `mailingdate` varchar(40) DEFAULT NULL, 
    `starred_status` int(10) unsigned NOT NULL DEFAULT '0', 
    `sender_email` varchar(200) NOT NULL DEFAULT '', 
    `reciever_email` varchar(200) NOT NULL DEFAULT '', 
    `inbox_status` int(10) unsigned NOT NULL DEFAULT '0', 
    `sent_status` int(10) unsigned NOT NULL DEFAULT '0', 
    `draft_status` int(10) unsigned NOT NULL DEFAULT '0', 
    `trash_status` int(10) unsigned NOT NULL DEFAULT '0', 
    `subject` varchar(200) DEFAULT NULL, 
    `read_status` int(10) unsigned NOT NULL DEFAULT '0', 
    `delete_status` int(10) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`message_id`) 
) 

Puede usar esta tabla para almacenar los correos y manipular las consultas de acuerdo con buzones de correo. Estoy evitando el resto de las tablas como los detalles del usuario y la tabla de detalles de inicio de sesión. Puede hacerlos de acuerdo a su necesidad.

Cuestiones relacionadas