如何为Facebook这样的复杂墙设计DB

如何为Facebook这样的复杂墙设计DB,facebook,database-design,facebook-wall,Facebook,Database Design,Facebook Wall,我正在创建一个类似Facebook的社交网站。 对于我的“墙”,我有很多不同类型的信息,比如状态、消息、用户喜欢/不喜欢页面、用户更新了个人资料 我想知道如何设计我的DB(与墙相关的表),以便在获取墙项目时尽可能提高效率(在速度方面) 提前谢谢 编辑:我有两个想法: 有一个大表,表中有足够的列来处理所有可能的情况(user_a、user_a、message、page、is_like、is_loke等)。它会很快,但会有许多“NULL”值,并且会占用数据库中的大量空间 有一个仅包含三列(id、us

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

我想知道如何设计我的DB(与墙相关的表),以便在获取墙项目时尽可能提高效率(在速度方面)

提前谢谢

编辑:我有两个想法:

  • 有一个大表,表中有足够的列来处理所有可能的情况(user_a、user_a、message、page、is_like、is_loke等)。它会很快,但会有许多“NULL”值,并且会占用数据库中的大量空间
  • 有一个仅包含三列(id、user_a、user_b)的“wall_item”表,以及一个针对每种墙项目(消息、喜欢、状态等)的表。它将被规范化,但将需要更多的时间,因为获取所有信息所需的左连接数

  • 我建议您有两个表-一个用于内容,另一个用于喜欢/不喜欢。有很多空值不是问题-空值不会占用空间。可能需要将喜欢/不喜欢分开,因为它们经常发生,而且它们自己也不满足

    如果您希望您的系统具有可伸缩性,那么请避免使用JOIN-s。一行执行2-3个查询比一个包含大量JOIN-s的大型查询更好。此外,如果您有大量的读取操作,但写入的次数不多(与数字或读取相比),则明智的做法是在写入期间执行其他操作

    例如,您可以为wall设置一个单独的表(包含用户id和帖子id)。当有人写了一篇新文章时,每个朋友的帖子id都会写在桌子的墙上。所以显示墙只是从表墙读取帖子ID并提取内容,而不是在显示期间从所有用户的帖子中搜索内容


    当新朋友成为朋友时,你只需将他们最近帖子的id复制到彼此的墙上。祝项目顺利

    我认为,NOSQL是用来提高性能的。对于此类应用程序,任何大型表数据库访问都会很慢,更不用说任何联接表了。

    您能告诉我为什么否决我的问题吗?我不知道怎么了。。。让我知道,我会很高兴修复它;)