neo4j - 图形数据库和关系型数据库一起使用?

8
这是一个关于最佳实践的问题。虽然有很多不同的解决方案,但我想知道你们如何解决这个问题。请假设性能对系统至关重要,也就是要求具有可扩展性。
最近我发现了图形数据库的奇妙之处。所以我构想了一个理论情景:一家公司想管理其客户关系,并且为此他们将使用Neo4j,这非常棒,可以很好地管理客户、不同员工及其关系。但是,该公司现在想要创建一个基于Web的界面,需要进行身份验证,并且Neo4j数据库中的任何人都应该能够登录到系统中,以查看他们如何与公司数据库中的其他人相关联,因此每个用户必须有一个与其名称相关联的密码/电子邮件/ID。
那么我的问题是,在这种情况下,是将password_hash/password_salt/id/email存储在MySQL数据库中,然后根据节点在MySQL数据库中进行查找,还是将password_hash/password_salt/id/email存储在节点内部的哈希表中更好?
此外,每个商店都有数千种产品,它们可以存储在图形数据库中,也可以将产品存储在MySQL数据库中,然后在那里查找产品并进行更改,因为产品彼此之间没有关系,所以没有必要将它们存储在图形数据库中,因此它们应该不被存储在那里以提高性能吗?
因此,我的问题归结为:对于大型项目来说,是最好同时使用类似MySQL这样的关系型数据库和图形数据库吗?如果不是,那么在什么情况下您会开始使用这两个数据库系统呢?
对于我对数据库术语的缺乏,请提前谅解。
3个回答

13

图形数据库主要用于维护关系。如果应用程序使用了图形数据库并不意味着应用程序需要将所有内容都存储在图形数据库中。

每个对图形的节点请求都在内存中处理,如果您的节点中有不必要的属性,它将变得臃肿,并可能使事情变慢并占用更多内存。我通常根据非常简单的规则决定什么需要放在图形中,什么需要放在数据库中。

高级属性(定义节点之间关系和其他重要属性)放在图形中,而附加信息放在关系型数据库中。

例如,在Facebook中,FBID、姓名等可以放在图形中,因为它们定义了一个节点与另一个节点之间的关系。但是,当用户单击某人的Facebook ID时,他/她会看到其他用户的出生日期、年龄、大学等。所有这些信息可以放在关系型数据库中。

注:关系型数据库还有另一个优点,即可用于快速分析。我知道使用图形也可以做到这一点,但我不确定它是否像关系型数据库那样可扩展和易于使用。

这种方法的缺点是: 您需要维护两个数据库。


3
除非你有一个经过验证的双数据库解决方案,否则我会认为减少移动部件将使你更加敏捷,更能快速改变事物。如果以后你发现一个难以处理的用例,那么请权衡引入第二个存储的成本/收益。双数据库架构并不罕见,但会带来额外的开销。
针对安全性问题,没有理由认为Neo4j或任何其他合理的NOSQL解决方案不能做到这一点:http://spring.neo4j.org/docs#tutorial_security

1
“两个数据库的体系结构并不罕见”,这正是我所期望听到的。我正在考虑未来系统的可扩展性,这非常重要。谢谢! - mur

1

如果有一些数据不适合存储在图形数据库(如neo4j/orientDB)中,或者有些数据最好存储在图形数据库而不是关系型数据库中,那么你应该同时使用两种类型的数据库。强制将数据存储在一个平台上可能会导致性能/可扩展性方面的问题。


@mursalat - 如今在技术发挥更大作用的地方,经常使用多个数据库。如果规模对您来说是一个严重问题,那么您应该选择最好的工具/选择,即使这意味着使用超过一个或两个数据库。 - ali haider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接