Database design Facebook中消息传递的数据库设计

Database design Facebook中消息传递的数据库设计,database-design,facebook,Database Design,Facebook,我目前正在创建一个类似于Facebook的消息系统。更具体地说,Facebook上的私人信息——包括收件箱、发送的信息、“未读”和“已读” 有人熟悉Facebook目前用于其消息系统的类似数据库结构吗 谢谢 我相信Facebook使用的是完全定制的系统,根本不使用传统的“数据库”。这就是说,这家伙对模式进行了反向工程: 事实证明他们使用的是一种叫做。你也可以去(我的链接已关闭)。它的缺点是,他们使用类似于谷歌的BigTable的东西,而不是MySQL 编辑:请参阅上面的Josh Smith的帖子

我目前正在创建一个类似于Facebook的消息系统。更具体地说,Facebook上的私人信息——包括收件箱、发送的信息、“未读”和“已读”

有人熟悉Facebook目前用于其消息系统的类似数据库结构吗


谢谢

我相信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中实现这一点?