Facebook“喜欢”数据结构

时间:2011-09-20 15:09:41

标签: facebook database-design facebook-like

我一直想知道facebook如何管理您可以“喜欢”的所有不同内容的数据库设计。如果只有一件事需要,这很简单,只是你喜欢的外键和你是谁的外键。

但是必须有数以百计的不同表格,你可以在Facebook上“喜欢”。他们如何存储喜欢的东西?

4 个答案:

答案 0 :(得分:25)

如果要在关系数据库中表示此类结构,则需要使用通常称为表继承的层次结构。在表继承中,您有一个表定义类型的表,然后是表,其主键也是返回父项的外键。

使用Facebook示例,您可能会遇到以下情况:

User
------------
UserId (PK)

Item
-------------
ItemId (PK)
ItemType (discriminator column)
OwnerId (FK to User)

Status
------------
ItemId (PK, FK to Item)
StatusText 

RelationshipUpdate
------------------
ItemId (PK, FK to Item)
RelationshipStatus
RelationTo (FK to User)

Like
------------
OwnerId (FK to User)
ItemId (FK to Item)
Compound PK of OwnerId, ItemId

在兴趣完整性方面,值得注意的是Facebook并没有将RDBMS用于此类事情。他们为这种存储选择了NoSQL解决方案。但是,这是在RDBMS中存储这种松散耦合信息的一种方法。

答案 1 :(得分:2)

Facebook没有传统的外键等,因为它们不会在大多数数据存储中使用关系数据库。简单来说,他们并没有因此而削减它。

但是他们使用了几个NoSQL类型的数据存储。 “Like”很可能是基于服务的,可能是在整个基础架构中以SOA风格设置的。这样,“喜欢”基本上可归因于他们希望与之相关联的任何内容。所有这一切,具有巨大的可扩展性和没有紧密耦合的关系问题来处理。 Facebook在其运营量上无法负担得起的东西。

他们也可以使用AOP(面向方面​​编程)样式处理机制将“Like”“附加”到页面呈现时可能需要的任何内容,但我认为它是通过JavaScript进行异步处理的概念SOA样式的Web服务或其他交付机制。

无论哪种方式,我都很乐意从架构的角度来看听他们如何进行这种设置。考虑到它们的体积,即使是简单的“喜欢”按钮也会成为技术的重要实现。

答案 2 :(得分:0)

您可以拥有一个包含Id,ForeignId和Type的表。类型可以是照片,状态,事件等等... ForeignId将是表格类型中记录的ID。这使评论和喜欢成为可能。你只需要一个表用于所有喜欢,一个用于所有评论和我描述的那个。

示例:

Items
Id  | Foreign Id  | Type
----+-------------+--------
  1 |         322 | Photo
  4 |         346 | Status

Likes
Id  | User Id     | Item Id
----+-------------+--------
  1 |         111 | 1

此处,Id 111的用户喜欢带有Id 322的照片。


注意:我假设您使用的是RDBMS,但请参阅Adron的回答。 Facebook确实使用RDBMS来获取大部分数据。

答案 3 :(得分:-4)

我非常确定Facebook不存储“喜欢”信息,因为其他人建议使用RDBMS。有数百万用户和可能数千个用户,我们正在寻找数千行加入此处,这会影响性能。

这里最好的方法是将所有“喜欢”附加在一行中。例如,具有text_atatype的user_like_id列的表。然后追加所有喜欢这篇文章的id。在这种情况下,您只查询一行,并获得所有内容。这比加入表格和获取计数要快得多。

编辑:我最近没有来过这个网站,我刚刚发现这个答案已被低估了。好吧,这是一个example post with like count and their avatars。这是我的设计,我刚刚实现了我正在谈论的内容。

这里的两个组件是1.)XREF表和2.)JSON对象。

喜欢的内容仍然存储在XREF表中。但与此同时,数据附加在JSON对象上并存储在post表的文本列中。

为什么我在文本列上将喜欢的信息存储为JSON?因此,没有必要为喜欢的人进行数据库查找/连接。如果有人不同于帖子,则JSON对象刚刚更新。

现在我不知道为什么这个答案会被一些用户贬低。这个答案提供快速的数据检索。这接近于NoSQL方法,这是FB如何访问数据。在这种情况下,不需要额外的连接/查找来获取喜欢的信息。

这是持有喜欢的表格。它只是用户和项目表之间的简单XREF映射。

enter image description here