2009-07-17 2 views
5

Ich arbeite derzeit an einem Messaging-System ähnlich Facebook zu erstellen. Genauer gesagt, die privaten Nachrichten auf Facebook - komplett mit einem Posteingang, gesendete Nachrichten, "Ungelesen" und "Lesen".Datenbank Design für Messaging in Facebook

Kennt jemand eine ähnliche Datenbankstruktur wie Facebook für sein Messaging-System?

Danke!

Antwort

0

Ich glaube, Facebook verwendet ein vollständig benutzerdefiniertes System, das keine traditionelle "Datenbank" verwendet. Das heißt, dieser Typ hat Reverse Engineering, wie ein Schema aussehen würde: http://blogs.x2line.com/al/archive/2007/06/02/3124.aspx

Es stellt sich heraus, dass sie etwas namens Casandra verwenden. Sie können auch die google code project directly gehen (Link ist für mich). Kurz gesagt, sie benutzen etwas wie BigTable von Google und nicht MySQL.

EDIT: Siehe Josh Smith Beitrag oben für eine Korrektur auf diesen Beitrag.

+0

Wie können wir dies in MySQL implementieren? –

4

ist hier etwas, das Sie nützlich finden könnten aus zu starten:

beginnen mit 2 Tischen, eine, die die eigentliche Nachricht enthält, und werden Sie den Überblick über die Beziehung zwischen den Nachrichten

zu halten verwenden, um diesen so etwas wie dies sein könnte:

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 

Dann Zwänge auf die IDs der Beziehung TBL für die Datenintegrität Zwecke hinzuzufügen, die Sie möchten.

+0

Was passiert, wenn jemand den Kommentar markiert, wenn er die Betreffzeile sieht, aber die Nachricht nicht gelesen hat? Oder was ist, wenn er/sie es liest, dann kennzeichnet es? IMHO, "lesen" und "markiert" sollte unabhängig booleans sein. –

+0

Ich glaube, das hängt von Ihrer Implementierung ab. Ich habe es bearbeitet und aus dem Statusfeld entfernt, um die Dinge einfach zu halten. Ich glaube jedoch, dass dies weiterhin funktionieren kann, wenn Sie nicht zulassen, dass Benutzer eine Nachricht markieren, bis sie nicht geöffnet wird, oder wenn Sie bedenken, dass eine Nachricht markiert ist, wenn sie als rot markiert wurde. – Sylvain

+0

Wenn Benutzer A die Nachrichten löscht, möchte der Benutzer B noch eine Kopie davon haben. wie kann ich das damit machen? –

3

Als Korrektur zu Joes Kommentar verwendet Facebook Cassandra, um Posteingangssuche, nicht Messaging zu betreiben. Und dieses "Reverse Engineering" gehört zu den Objektklassen der Facebook-Plattform, was meines Erachtens keinen sehr repräsentativen Blick auf das Datenbankdesign wirft.

+1

stimme voll und ganz zu. – dcolumbus

0

Der folgende Ansatz sollte in der Lage sein, Sie aussortieren. Dies ist eine gute Grundlage sowohl für den Chat als auch für das Messaging, wo Sie mit dem Chat aktuelle Nachrichten von der Client-Seite abfragen und auf eine intuitive Benutzeroberfläche tippen können.

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; 
}