2009-07-17 22 views
5

Actualmente estoy trabajando en la creación de un sistema de mensajería similar a Facebook. Más específicamente, los mensajes privados en Facebook-- se completan con una bandeja de entrada, mensajes enviados, "No leídos" y "Leer".Diseño de base de datos para mensajería en Facebook

¿Alguien está familiarizado con una estructura de base de datos similar a la que Facebook utiliza actualmente para su sistema de mensajería?

Gracias!

Respuesta

0

Creo que Facebook está utilizando un sistema completamente personalizado que no usa una "base de datos" tradicional en absoluto. Dicho esto, este tipo hizo ingeniería inversa lo que se vería como un esquema: http://blogs.x2line.com/al/archive/2007/06/02/3124.aspx

Resulta que están usando algo llamado Casandra. También puede ir al google code project directly (el enlace está desactivado). En resumen, usan algo como BigTable de Google y no MySQL.

EDITAR: Consulte la publicación de Josh Smith anterior para una corrección en esta publicación.

+0

¿cómo podemos implementar esto en MySQL? –

4

Aquí es algo que le puede resultar útil para empezar:

de inicio con 2 tablas, una que contendrá el mensaje real, y uno que va a utilizar para realizar un seguimiento de la relación entre los mensajes

Eso podría ser algo como esto:

private_messages tbl: 
id 
date_sent 
title 
content 
status ENUM ('unread', 'read') DEFAULT 'unread' 

private_message_relation tbl: 
id 
message_id 
sender_id 
receiver_id 

entonces puede que desee añadir restricciones a los ID de la TBL relación con fines de integridad de datos.

+0

¿Qué sucede si alguien marca el comentario cuando ve la línea de asunto, pero no ha leído el mensaje? ¿O qué pasa si él/ella lo lee y luego lo marca? En mi humilde opinión, "leer" y "marcado" deben ser booleanos independientes. –

+0

Creo que esto puede depender de su implementación. Lo edité y lo eliminé del campo de estado para que todo siga siendo simple. Sin embargo, creo que esto aún puede funcionar si no permite que los usuarios marquen un mensaje hasta que no se abra, o si considera que si un mensaje está marcado, ha sido rojo. – Sylvain

+0

si el usuario A borra los mensajes, quiero que el usuario B aún tenga una copia del mismo. ¿Cómo puedo hacer eso con esto? –

3

Como corrección al comentario de Joe, Facebook usa Cassandra para potenciar la búsqueda en la bandeja de entrada, no la mensajería. Y esa "ingeniería inversa" es de las clases de objetos de la plataforma de Facebook, lo que no creo que proporcione un aspecto muy representativo del diseño de la base de datos.

+1

Totalmente de acuerdo. – dcolumbus

0

El siguiente enfoque debería ser capaz de resolverlo. Esta es una buena base tanto para el chat como para la mensajería, mientras que con el chat puede sondear mensajes recientes del lado del cliente y obtener una interfaz de usuario intuitiva.

Message { 
    MessageId, 
    SenderId, -- Foreign key User.UserId 
    DateSent, 
    Subject, 
    Content, 
    Attachment, -- can be null or default to a 0 
    ... 
} 

UserMessage { 
    Id, 
    MessageId, -- Foreign key Message.MessagId 
    RecepientId, -- Foreign key User.UserId 
    DateRead -- can default to year 1900 if you do not want to deal with nulls 
} 

User { 
    UserId 
    UserName 
    ... 
} 

Queries  

Read = UserMessage where DateRead > year 1900 (or not equal to null) 
Inbox = UserMessage where RecepientId = Me.UserId 
Sent = Message where SenderId = Me.UserId 
Conversation = Group by Subject 
Attachment = (Simple = Path to attachment file. || Better = DocumentId ... see below) 

Attachment 

Document { 
    int DocumentId, 
    int DocTypeId, 
    virtual DocumentType DocumentType, 
    string FileName, 
    int UserId, 
    string mimeType, 
    float fileSize, 
    string storagePath, 
    int OrganizationId, 
    string fileHash, 
    string ipAddress, 
    DateTime DateCreated = DateTime.Now; 
} 
Cuestiones relacionadas