Database design Facebook中消息传递的数据库设计
我目前正在创建一个类似于Facebook的消息系统。更具体地说,Facebook上的私人信息——包括收件箱、发送的信息、“未读”和“已读” 有人熟悉Facebook目前用于其消息系统的类似数据库结构吗Database design Facebook中消息传递的数据库设计,database-design,facebook,Database Design,Facebook,我目前正在创建一个类似于Facebook的消息系统。更具体地说,Facebook上的私人信息——包括收件箱、发送的信息、“未读”和“已读” 有人熟悉Facebook目前用于其消息系统的类似数据库结构吗 谢谢 我相信Facebook使用的是完全定制的系统,根本不使用传统的“数据库”。这就是说,这家伙对模式进行了反向工程: 事实证明他们使用的是一种叫做。你也可以去(我的链接已关闭)。它的缺点是,他们使用类似于谷歌的BigTable的东西,而不是MySQL 编辑:请参阅上面的Josh Smith的帖子
谢谢 我相信Facebook使用的是完全定制的系统,根本不使用传统的“数据库”。这就是说,这家伙对模式进行了反向工程: 事实证明他们使用的是一种叫做。你也可以去(我的链接已关闭)。它的缺点是,他们使用类似于谷歌的BigTable的东西,而不是MySQL
编辑:请参阅上面的Josh Smith的帖子,了解对这篇文章的更正。以下是一些你可能会觉得有用的东西: 从两个表开始,一个包含实际消息,另一个用于跟踪消息之间的关系 可能是这样的:
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添加约束。作为对Joe评论的更正,Facebook使用Cassandra来支持收件箱搜索,而不是消息传递。“逆向工程”是Facebook平台的对象类之一,我认为这根本不能代表数据库设计。下面的方法应该可以帮你解决问题。这是聊天和消息传递的良好基础,通过聊天,您可以从客户端轮询最近的消息,并在直观的用户界面上运行
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;
}
如果有人在看到主题行时标记评论,但尚未阅读消息,该怎么办?或者如果他/她读了它,然后标记它呢?IMHO,“read”和“flagged”应该是独立的布尔值。我相信这可能取决于您的实现。我编辑了它并将其从状态字段中删除,以使事情保持简单。但是,如果您不让用户在未打开消息之前标记消息,或者如果您认为如果有消息被标记,则它会被冻结。如果用户A删除消息,我希望用户B仍然有它的副本。我该如何处理这个问题呢?如果我只使用一个表,其中包含字段->id、发送者id、接收者id、消息、状态、日期。不一样吗。我认为连接表的速度会慢一些,在同一个表中构造结构会更好。我们如何在MySQL中实现这一点?