Дизайн базы данных для обмена сообщениями в Facebook - PullRequest
5 голосов
/ 17 июля 2009

В настоящее время я работаю над созданием системы обмена сообщениями, похожей на Facebook. Точнее говоря, личные сообщения на Facebook - в комплекте с папками «Входящие», «Отправленные», «Непрочитанные» и «Чтение».

Кто-нибудь знаком со структурой базы данных, подобной той, которую Facebook использует в настоящее время для своей системы обмена сообщениями?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 17 июля 2009

Вот что вам может пригодиться для начала:

Начните с 2 таблиц, одна из которых будет содержать фактическое сообщение, а другая будет использоваться для отслеживания связи между сообщениями

Это может быть что-то вроде этого:

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 для обеспечения целостности данных.

3 голосов
/ 28 июня 2010

В качестве исправления к комментарию Джо, Facebook использует Cassandra для включения поиска по входящим сообщениям, а не обмена сообщениями.И это «реверс-инжиниринг» относится к классам объектов платформы Facebook, которые, я думаю, не дают очень репрезентативного взгляда на дизайн базы данных.

0 голосов
/ 26 сентября 2015

Подход ниже должен быть в состоянии разобраться с вами. Это хорошая основа как для чата, так и для обмена сообщениями, где с помощью чата вы можете опрашивать последние сообщения со стороны клиента и добавлять интуитивно понятный интерфейс.

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;
}
0 голосов
/ 17 июля 2009

Я считаю, что Facebook использует полностью настраиваемую систему, которая вообще не использует традиционную «базу данных». Тем не менее, этот парень действительно перепроектировал, как будет выглядеть схема: http://blogs.x2line.com/al/archive/2007/06/02/3124.aspx

Оказывается, они используют то, что называется Casandra . Вы также можете перейти к проекту Google Code напрямую (ссылка недоступна для меня). Суть в том, что они используют что-то вроде BigTable от Google, а не MySQL.

РЕДАКТИРОВАТЬ: см. Пост Джоша Смита выше для исправления в этом посте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...