Facebook可以根据共同朋友的数量订购用户(例如在搜索中)。 另一个例子是朋友发现者。订单或多或少是相同的。
我的问题是:他们如何跟踪共同的朋友数量,因为你有朋友的朋友?他们如何在如此短的时间内订购朋友?
如果我们假设每个用户都有100个朋友,那么在最坏的情况下,这意味着每个人在这样的索引中每个用户必须有n ^ 2 = 10'000个条目。
必须有一些索引技术,但我真的很想知道他们是如何在数据库级别那样做的。
答案 0 :(得分:1)
Facebook将用户和关系存储在图形数据库中(参见https://developers.facebook.com/docs/opengraph/)。我不知道这是否是他们的主要内部数据存储解决方案(据我所知他们使用的是Apache Cassandra,这是NoSQL但是面向列的类似于Google的BigTable),但至少他们可以访问所有用户的图表在脸书上。图表允许有趣的traversal techniques,这些数据比传统的SQL查询更强大,更高效。
使用最短路径算法,很容易找到所有朋友的朋友:见How to calculate mutual friends with neo4j?
以下是Emil Eifrem(Neo4j的创作者之一)关于Facebook开放图谱的一篇有趣的博文:http://blogs.neotechnology.com/emil/2010/04/on-the-facebook-open-graph-and-graph-databases.html
答案 1 :(得分:1)
他们很可能预先计算结果并将其存储在分布式KV数据库中。 以下是 digg如何做类似事情的解释:http://nosqleast.com/2009/slides/sarkissian-cassandra.pdf
简而言之。对于每对用户,他们存储他们共同朋友的数量。每次用户添加新朋友时,他们都会增加所有相应对的共同朋友数量(注意如何在DB写入上完成所有工作,而不是读取读取)。你消耗了大量内存,但读取速度非常快。
答案 2 :(得分:0)
他们可以这样做,因为他们拥有这些数据并且可以直接访问它,而我们的开发人员通过他们的API进行管理,这有限制(在大多数情况下也应如此)。他们分配了一组人员,以确保在适当的位置对数据进行索引,存储,分页和缓存,以使用户体验原样。
答案 3 :(得分:0)
我没有看到n ^ 2索引,我很害怕...让我们说表友谊每个用户有100个条目,有100个朋友 - 像这样:
user_id friend_id
1 2
1 3
2 1
2 ...
然后我会选择这样的计数+将结果存储到我的个人资料中的缓存变量...
with my_friends_view (friend_id) as (
select friend_id
from friendship
where user_id = @my_user_id
)
select user_id "my_friend_id", count(*) "mutual_friends_count"
from friendship
where user_id in my_friends_view
and friend_id in my_friends_view