LinkedIn有这个很酷的功能,在访问某些用户的个人资料时,LinkedIn会提示您如何通过网络连接到该用户。
假设访问者和个人资料所有者是图形的两个节点,其中节点代表用户,边缘代表友谊,一个简单的解决方案可以是从两个节点开始直到特定级别的bfs并查看是否有任何交叉点。交叉点将是网络链路节点。
虽然听起来很整洁,但问题在于,为了确定每个人的朋友,需要单独的数据库查询。当网络深度超过2级时,算法将是非常耗时的。有更好的有效替代方案吗?如果没有,我们如何才能增加更好的硬件支持(并行计算,网格,分布式数据库等)以减少计算所需的时间?
答案 0 :(得分:5)
您可以在Lorenzo Alberton的文章Graphs in the database: SQL meets social networks中看到如何做到这一点。示例代码是使用CTE为PostgreSQL编写的。但是,我怀疑使用RDBMS这样做会很好。我写了一篇关于如何使用原生图数据库执行与上述文章相同内容的文章,在本例中为Neo4j:Social networks in the database: using a graph database。除了性能上的差异之外,图形数据库还通过提供图形API简化了任务,该图形API使得在SQL中(或通过使用存储过程)编写极其复杂的遍历变得容易。我在this thread的图表数据库上写了更多内容,并看到了this one。
答案 1 :(得分:1)
如果没有某种递归存储过程(SQL Server 2005+中的CTE),随着关卡的深入,你需要多次往返。但是,良好的缓存基础结构可以真正帮助提高性能,因为最热门/活跃用户的连接列表将保持缓存状态。读/写缓存机制会使事情变得更好(缓存更新级联到db更新,缓存读取级联到db读取)