类Facebook通讯系统的数据库规范化

时间:2011-10-23 20:21:30

标签: mysql database email normalization messaging

有几个关于消息传递系统的讨论,但主要与电子邮件结构有关。如何成为规范化数据库中成员消息传递的最有效方式?

我正在考虑创建一个包含五列的消息表:

ID (PRIMARY KEY)
First_Person (FK user_id)
Second_Person (FK user_id)
Message
date

我担心的是阅读这张大桌子。

查找某人的所有消息(例如user_id 876)

SELECT * FROM messages WHERE First_Person='876' OR Second_Person='876'

和两个人之间的沟通

SELECT * FROM messages WHERE (First_Person='876' OR Second_Person='876') 
AND (First_Person='1500' OR Second_Person='1500') ORDER DESC BY date

由于这种消息传递就像聊天,对于成千上万的成员来说,这个表可以增长到数十亿行(而不是数百万)。那么,在这么大的表中搜索消息是否有效呢?

1 个答案:

答案 0 :(得分:0)

你是对的,这么大的桌子不可用。如果您需要一个真实的消息保持系统更好地查看NoSQL解决方案(如HBase,Cassandra,MongoDB等),您将不得不忘记关于关系数据库的任何知识。

使用MySQL,如果将表拆分成非常小的部分,你仍然可以做一些可扩展的事情。使一个表保留最多1k用户的消息(除非两个用户来自同一个表,否则您需要两次写入所有消息)。另外,在一个数据库中保留不超过1k的表,当达到此限制时自动创建另一个表。拥有多个数据库(甚至在一台物理服务器上)可以使DBA在当前服务器过载时轻松将每个数据库传输到新服务器。要获取某个用户的消息,您的代码必须从您将拥有的地图中获取所需的数据库/表。