Database 如何在数据库中对此[网络,帖子中的详细信息]进行建模以提高效率和易用性?

Database 如何在数据库中对此[网络,帖子中的详细信息]进行建模以提高效率和易用性?,database,data-modeling,Database,Data Modeling,在linkedin,当你访问某人的个人资料时,你可以看到你是如何与他们建立联系的。我相信linkedin显示了高达3级的连接,如果不是更多的话,比如 shabda->Foo用户、酒吧用户、baz用户->Joel的连接->Joel 如何在数据库中表示这一点 如果我是模特 User Id PK Name Char Connection User1 FK User2 FK 使用者 Id PK 名称字符 联系 用户1 FK 用户2 FK 然后,为了找到网络,三个层次的深度,我需要获得所

在linkedin,当你访问某人的个人资料时,你可以看到你是如何与他们建立联系的。我相信linkedin显示了高达3级的连接,如果不是更多的话,比如

shabda->Foo用户、酒吧用户、baz用户->Joel的连接->Joel

如何在数据库中表示这一点

如果我是模特

User Id PK Name Char Connection User1 FK User2 FK 使用者 Id PK 名称字符 联系 用户1 FK 用户2 FK 然后,为了找到网络,三个层次的深度,我需要获得所有我的连接、他们的连接和他们的连接,然后查看当前用户是否在那里。对于任何大小的DB来说,这显然是非常低效的,而且使用起来可能也很笨重

因为,在链接中,我可以看到这个网络,在我访问的任何个人资料中,我也不认为这是预先计算的


我想到的另一件事可能是最好不要存储在关系数据库中,但是存储和检索它的最佳方式是什么呢?

我的建议是使用图形数据库。目前似乎只有一个实现可用,那就是。它是用Java编写的,但是绑定到Ruby和Scala(Python正在进行中)

不幸的是,如果您不懂Java,您可能在任何其他平台上都找不到类似的东西。然而,如果您确实了解Java(或者至少愿意学习),这是值得的。(从技术上讲,由于Ruby/Python绑定,您甚至不需要学习Java。)Neo4j的构建正是为了满足您的需要。在关系数据库中实现这一点会遇到很多麻烦,因为您只需几行Java代码就可以完成同样的任务,而且效率也会更高


如果这不是一个选项,我仍然建议查看其他数据库类型,例如。关系数据库不是为这类事情而构建的,尝试在RDBMS中实现这一点要比切换到另一种数据库并学习它更痛苦。

我不明白为什么使用关系数据库来实现这一点会有任何问题。问题中定义的表格是一个很好的开端。通过适当的优化,您将能够保持良好的性能。我个人认为,你需要一些严肃的东西来证明放弃这种多功能的主流产品是合理的。无论如何,您可能需要在项目中使用RBDMS,而且在许多价格范围内(甚至免费)都有无法比拟的合法选择。您将获得高质量的文档,支持将可用,并且您将在工作池中拥有大量训练有素的开发人员

关于这种自我关系模型(用户加入到其他用户中),我建议研究递归查询。这将阻止您执行单个查询的级联以查找3个级别的关系。考虑下面的SQLServer方法,用于用CTE执行递归查询。

它允许您指定使用MAXRECURSION提示的深度


接下来,您需要开始思考优化的方法。这从使用适当的索引和维护等设置表的标准最佳实践开始,最后不可避免地结束。这是只有在你已经尝试过所有其他方法后才会做的事情之一,但如果你知道自己在做什么,并使用良好的实践,那么你的绩效提升将非常显著。互联网上有很多资源可以帮助您了解非规范化,只是。

好问题,我认为这将使很多人受益+谢谢,我也是这么想的。几年前,我曾在Java中工作,希望它们没有完全生锈,并且可以被很好地使用。老实说,我以前从未使用过Java,我发现Neo4j非常直截了当。所以你会没事的。:)您将在wiki上找到有关Neo4j语言绑定的信息:。如果适合您的应用程序,您还可以在Ruby或Scala(wiki中有链接)中构建特定于域的RESTful API。为什么?因为使用RDBMS会获得极低的性能。尝试超越3个层次的关系深度。除非您的用户愿意等待几秒钟,等待它加载(并且您的数据库服务器可以处理),否则这是不可能发生的。Neo4j是从地面开始建造的,并且(据我所知)在几秒钟内就可以达到100000层的深度。RDBMS可以做到这一点吗?