假设我们有一个带有小型社交图谱的网站,人们(比如大约 100 万用户)可以“喜欢”某些东西、互相关注、评论彼此的帖子以及......(通常的情况)。
在 .NET 中,我们有两个选择:
- 使用 EF(当前为 6.1)和 MSSQL(v2012 或更高版本)实现社交图谱(困难的方法)
- 使用 Neo4j(当前为 2.1.4)和 Neo4jClient(据我所知,这是最适合 .NET 用户的驱动程序)
考虑到上述场景以及 Neo4j 没有 .NET 的 native 驱动程序,并且当前版本的 Neo4jClient (1.0.0.657) 使用 REST api 连接到数据库引擎,对于问题,哪一个会更快例如“谁喜欢像我一样的东西”或“一个人会喜欢什么(基于其关注的人)”以及其他一些有关社交图谱的常见问题?
最佳答案
您还没有指定那么多信息;你的问题可能会引起很多意见,但我会尽力公平地对待这个问题。 (免责声明:我来自 Neo4j 方面,但我已经处理过你提到的大多数其他事情)
我想将你的问题分成三个要素:
- 图还是关系? (MySQL 与 Neo4J)
- 驱动程序/工程问题(Neo4jClient/REST 与 EF/MySQL)
- 建模实用性(“艰难地”实现社交图与 Neo4j 中的实现)
图表还是关系?
您应该阅读another answer I posted关于图数据库和图数据库查询性能的通用参数。我不会重述所有这些(因为它已经在 SO 上),但这里是执行摘要:图形数据库在需要遍历一堆边的路径关联查询方面非常好且快速。这些操作对应于关系世界中的事物,在关系世界中,您将一大堆表连接在一起,或者连接深度是可变的。在这些情况下,图表将比关系更好(性能方面)。如果您想对用户进行批量扫描或单个连接,那么您可能最好使用关系型(同样,请参阅其他答案以获取更多详细信息)。因此,根据这个标准,我推断您实际上只想一次遍历一条边 - 例如“向我显示鲍勃喜欢的所有内容”,并且您不需要进行更深层次的查询,例如“向我显示与鲍勃相距 3-4 度的每个人”。
驱动程序/工程问题
就速度而言,众所周知,java API 比 Neo4j 的 REST API 更快。 REST API 的性能是可变的,并且取决于许多其他因素,例如数据库是否托管在同一台计算机上,或者它的“网络距离”有多远。使用 REST 时,您总是会产生额外的开销,这些开销会伴随 HTTP 和序列化/反序列化 JSON 等内容,而如果您使用 java API,则不会有这些开销。因此,在所有其他条件相同的情况下(免责声明:它们从来都不是;)REST API 通常会比 EF 等慢。
建模实用性
在这里,neo4j 将会以很大优势获胜。使用 MySQL,您将拥有永远存在的 object-relational impedance mismatch ; neo4j 减少(但没有消除)这些阻抗不匹配问题。在建模方面,neo4j 是无模式的,这有很多优点和缺点。您可能可以使用 Neo4j 更快地拼凑出一个工作模型,因为您的领域从根本上来说是摄影领域的。
关于c# - 针对 C# 开发人员的 Neo4j 和 MSSQL 实用性能比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25971208/