Database 实施类似LinkedIn的高效方法;您如何连接到;特征?

Database 实施类似LinkedIn的高效方法;您如何连接到;特征?,database,hardware,performance,graph,social-networking,Database,Hardware,Performance,Graph,Social Networking,LinkedIn有一个很酷的功能,在访问某个用户的个人资料时,LinkedIn会提示您如何通过网络连接到该用户 假设访问者和概要文件所有者是图中的两个节点,其中节点表示用户,边表示友谊,一个简单的解决方案可以是bfs,从两个节点开始,直到某个级别,并查看是否存在任何交点。交叉点将是网络链路节点 虽然这听起来不错,但问题是为了确定每个人的朋友,需要一个单独的DB查询。当网络深度超过2层时,这将是非常耗时的算法。有没有更有效的替代方案?如果没有,我们如何添加更好的硬件支持(并行计算、网格、分布式数据

LinkedIn有一个很酷的功能,在访问某个用户的个人资料时,LinkedIn会提示您如何通过网络连接到该用户

假设访问者和概要文件所有者是图中的两个节点,其中节点表示用户,边表示友谊,一个简单的解决方案可以是bfs,从两个节点开始,直到某个级别,并查看是否存在任何交点。交叉点将是网络链路节点


虽然这听起来不错,但问题是为了确定每个人的朋友,需要一个单独的DB查询。当网络深度超过2层时,这将是非常耗时的算法。有没有更有效的替代方案?如果没有,我们如何添加更好的硬件支持(并行计算、网格、分布式数据库等)以减少计算所需的时间?

如果没有某种递归存储过程(SQL Server 2005+中的CTE),随着级别的加深,您将需要多次往返。然而,一个好的缓存基础设施确实可以提高性能,因为最流行/活跃用户的连接列表将保持缓存状态。通过缓存的读/写机制将使事情变得更好(缓存更新级联到db更新,缓存读取级联到db读取)

您可以在Lorenzo Alberton的文章中看到如何做到这一点。示例代码是使用CTE为PostgreSQL编写的。然而,我怀疑使用a来实现这一点是否会有好的效果。我写了一篇文章,介绍了如何使用本机图形数据库完成与上述文章相同的工作,在本例中:。除了性能上的差异之外,图形数据库还通过提供图形API简化了任务,该API可以轻松处理用SQL编写(或使用存储过程)非常复杂的遍历。我在和中也写了一些关于图形数据库的文章。

这是一个很好的评论,因为很多人不想仅仅依靠SQL Server CTE、PROC或其他t-SQL来完成繁重的工作。将其存储在SQL Server中,然后如您所述,将其缓存一次(例如在您的C#app中),并在内存中使用它查找内容(如果仅用于一小部分数据)。我必须从您的帖子中删除该图像,因为ImageShack已将其删除,并将其替换为广告。有关更多信息,请参阅。如果可能的话,你最好重新上传。谢谢