2009-07-17 4 views
5

Attualmente sto lavorando alla creazione di un sistema di messaggistica simile a Facebook. In particolare, i messaggi privati ​​su Facebook, completi di una casella di posta, messaggi inviati, "non letti" e "letti".Progettazione database per i messaggi in Facebook

Qualcuno ha familiarità con una struttura di database simile a quella che Facebook utilizza attualmente per il proprio sistema di messaggistica?

Grazie!

risposta

0

Credo che Facebook stia utilizzando un sistema completamente personalizzato che non utilizza affatto un "Database" tradizionale. Detto questo, questo tizio ha decodificato come sarebbe uno schema: http://blogs.x2line.com/al/archive/2007/06/02/3124.aspx

Si scopre che stanno usando qualcosa chiamato Casandra. Puoi andare anche allo google code project directly (il link è giù per me). In poche parole, usano qualcosa come il BigTable di Google e non MySQL.

MODIFICA: Vedere il post di Josh Smith in alto per una correzione su questo post.

+0

come possiamo implementarlo in MySQL? –

4

Qui è qualcosa che potrebbe risultare utile per cominciare:

Inizia con 2 tavoli, uno che conterrà il messaggio vero e proprio, e uno che verrà utilizzato per tenere traccia delle relazioni tra i messaggi

Quello potrebbe essere qualcosa di simile:

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 

quindi si consiglia di aggiungere vincoli per gli id ​​della TBL relazione a scopi di integrità dei dati.

+0

Cosa succede se qualcuno contrassegna il commento quando vede la riga dell'oggetto, ma non ha letto il messaggio? O cosa succede se lui/lei lo legge, quindi lo contrassegna? IMHO, "read" e "flaggato" dovrebbero essere booleani indipendenti. –

+0

Credo che ciò possa dipendere dall'implementazione. Ho modificato e rimosso dal campo di stato per rendere le cose semplici. Tuttavia, credo che questo possa funzionare se non si consente agli utenti di contrassegnare un messaggio finché non è aperto, o se si considera che se un messaggio è contrassegnato, è stato rosso. – Sylvain

+0

se l'utente A cancella i messaggi voglio che l'utente B abbia ancora una copia di esso. come posso farlo con questo? –

3

Come una correzione al commento di Joe, Facebook utilizza Cassandra per alimentare la ricerca in arrivo, non i messaggi. E quel "reverse engineering" è delle classi di oggetti della piattaforma Facebook, che non penso affatto dare un aspetto molto rappresentativo al design del database.

+1

Completamente d'accordo. – dcolumbus

0

L'approccio seguente dovrebbe essere in grado di risolvere l'utente. Questa è una buona base sia per la chat che per i messaggi, dove con la chat è possibile eseguire il polling dei messaggi recenti dal lato client e eseguire uno slap su un'interfaccia utente 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; 
}