2009-07-17 8 views
5

私は現在、Facebookに似たメッセージングシステムの作成に取り組んでいます。具体的には、Facebook上の非公開メッセージ(受信トレイ、送信済みメッセージ、未読、および閲覧)があります。Facebookでのメッセージングのデータベース設計

Facebookのメッセージングシステムに現在使用しているのと同様のデータベース構造に精通している人はいますか?

ありがとうございます!

答えて

0

Facebookは従来の「データベース」をまったく使用しない完全なカスタムシステムを使用していると私は信じています。つまり、この男は、スキーマがどのようになるかをリバースエンジニアリングしました:http://blogs.x2line.com/al/archive/2007/06/02/3124.aspx

Casandraという名前が使われていることがわかりました。 google code project directlyにも行くことができます(私にとってはリンクがダウンしています)。それは、GoogleのBigTableのようなものを使っているのであり、MySQLを使っていないということです。

編集:この記事の修正については、上記のJosh Smithの記事を参照してください。 2つのテーブル、実際のメッセージが含まれています1と

スタート、そしてあなたがそのメッセージ

との間の関係を追跡するために使用する1:ここでは

+0

これをMySQLでどのように実装できますか? –

4

はあなたが始めるために役立つかもしれない何かであります

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 

次に、データの整合性のために、関係tblのIDに制約を追加することができます。

+0

誰かがその件名を見たときにコメントにフラグを立てても、そのメッセージを読んでいない場合はどうなりますか?または、彼/彼女がそれを読んで、それにフラグを立てればどうなるでしょうか? IMHO、 "read"と "flagged"は独立したブール値でなければなりません。 –

+0

これはあなたの実装に依存すると私は信じています。ステータスフィールドから編集して削除して、物事をシンプルに保ちました。しかし、開かれていないときにユーザーがメッセージにフラグを付けさせないようにするか、メッセージにフラグが立てば赤色になっていると考えれば、これは仕事が残っていると思う。 – Sylvain

+0

ユーザAがメッセージを削除した場合、ユーザBには依然としてそのメッセージのコピーが必要です。私はこれでどうすればいいですか? –

3

Joeのコメントを修正して、FacebookはCassandraを使用してメッセージングではなく受信トレイの検索を強化しています。そして、「リバース・エンジニアリング」は、Facebookプラットフォームのオブジェクト・クラスであり、私はデータベース設計をまったく代表するものではないと思います。

+1

完全に同意します。 – dcolumbus

0

以下のアプローチであなたを並べ替えることができます。これは、チャットでは、クライアント側からの最近のメッセージをポーリングして、直感的なUIで叩くことができる、チャットとメッセージングの両方に適しています。

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