如何为像Facebook这样的复杂墙壁设计数据库

时间:2011-11-07 14:28:42

标签: facebook database-design facebook-wall

我正在创建一个类似Facebook的社交网络网站。 对于我的“墙”,我有许多不同类型的信息,如状态,消息,用户喜欢/不喜欢页面,用户更新了他的个人资料,...

我想知道如何设计我的数据库(与墙相关的表),以便在我获取墙上项目时尽可能提高效率(就速度而言)。

提前致谢!

编辑:我有两个想法:

  1. 有一个包含足够列的大表来处理所有可能性(user_a,user_a,message,page,is_like,is_dislike,...)。它会很快,但会有很多'NULL'值,并且会在DB中占用很多空间
  2. 拥有一个只有三列(id,user_a,user_b)的'wall_item'表,以及每种壁项目(消息,喜欢,状态等)的表格。它将被标准化,但由于获取所有信息所需的左连接数量,将花费更多时间。

2 个答案:

答案 0 :(得分:2)

我建议您有两张桌子 - 一张用于内容,另一张用于喜欢/不喜欢。拥有大量空值不是问题 - 空值不会占用空间。可能需要单独保持喜欢/不喜欢,因为它们发生了很多而且他们不满足于自己。

如果您希望系统具有可扩展性,请避免使用JOIN-s。连续执行2-3个查询比使用大量JOIN-s的大型大量查询更好。此外,如果您有大量的READ操作而没有那么多WRITE(与数字或READ相比),那么在WRITE期间执行其他操作是明智的。

例如,您可以为wall创建一个单独的表(包含用户ID和帖子ID)。当有人发表新帖子时,帖子的id会写入每个朋友的表格WALL。因此,显示墙只是从表格WALL中读取后期内容并提取内容 - 而不是在显示期间从所有用户的帖子中搜索内容。

当新人成为朋友时,你只需将他们最近发布的帖子的内容复制到彼此的墙上。祝这个项目好运!

答案 1 :(得分:0)

我认为,NOSQL用于获得性能。对于这种应用程序,任何大型表db访问都会很慢,更不用说任何连接表了。