私は現在、Facebookに似たメッセージングシステムの作成に取り組んでいます。具体的には、Facebook上の非公開メッセージ(受信トレイ、送信済みメッセージ、未読、および閲覧)があります。Facebookでのメッセージングのデータベース設計
Facebookのメッセージングシステムに現在使用しているのと同様のデータベース構造に精通している人はいますか?
ありがとうございます!
私は現在、Facebookに似たメッセージングシステムの作成に取り組んでいます。具体的には、Facebook上の非公開メッセージ(受信トレイ、送信済みメッセージ、未読、および閲覧)があります。Facebookでのメッセージングのデータベース設計
Facebookのメッセージングシステムに現在使用しているのと同様のデータベース構造に精通している人はいますか?
ありがとうございます!
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:ここでは
はあなたが始めるために役立つかもしれない何かであります
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に制約を追加することができます。
誰かがその件名を見たときにコメントにフラグを立てても、そのメッセージを読んでいない場合はどうなりますか?または、彼/彼女がそれを読んで、それにフラグを立てればどうなるでしょうか? IMHO、 "read"と "flagged"は独立したブール値でなければなりません。 –
これはあなたの実装に依存すると私は信じています。ステータスフィールドから編集して削除して、物事をシンプルに保ちました。しかし、開かれていないときにユーザーがメッセージにフラグを付けさせないようにするか、メッセージにフラグが立てば赤色になっていると考えれば、これは仕事が残っていると思う。 – Sylvain
ユーザAがメッセージを削除した場合、ユーザBには依然としてそのメッセージのコピーが必要です。私はこれでどうすればいいですか? –
Joeのコメントを修正して、FacebookはCassandraを使用してメッセージングではなく受信トレイの検索を強化しています。そして、「リバース・エンジニアリング」は、Facebookプラットフォームのオブジェクト・クラスであり、私はデータベース設計をまったく代表するものではないと思います。
完全に同意します。 – dcolumbus
以下のアプローチであなたを並べ替えることができます。これは、チャットでは、クライアント側からの最近のメッセージをポーリングして、直感的な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;
}
これをMySQLでどのように実装できますか? –