结合图形数据库和 RDBMS

Combining a Graph Database and an RDBMS

为一个应用程序实现两个或多个数据库是否设计糟糕/困难?

例如,假设我有 User 个对象,我想将其存储到关系数据库中。这些 'User' 对象彼此有关系并有用户订阅(想想 Twitter / Facebook),我想存储这些关系以便能够找到朋友的朋友,看看 "deep" 我怎么样进入提要链等。这些关系将存储在图形数据库中。

有没有更好的方法来解决这个问题,或者使用图形数据库来存储关系和关系数据库来存储数据是最好的解决方案吗?

免责声明:我还没有使用过企业版的 neo4j,所以它可能有一些我不知道的功能可以帮助你。

如果您可以将所有内容都保留在 neo4j 中,那是最好的,因为它在多个方面保持较低的复杂性,包括数据建模、保持数据同步以及保持查询简单和原子性,而不是将它们拆分到单独的数据库中。

了解您对使用 RDBMS 的要求是什么,以及这些要求是否证明从上面引入的复杂性是合理的。

如果您决心这样做,那么您可以在高数据冗余之间做出选择,或者选择只保留 ID、关系和最少数据的更骨架的 neo4j 数据库。

在高数据冗余的情况下,在 neo4j 中镜像大部分(如果不是全部)数据,那么你会增加保持数据库之间所有内容同步和一致的复杂性(一点也不简单)。这可以通过 neo4j 为您提供更丰富的查询,因为大多数数据都在同一个数据库中,并且将来可以更好地切断您的 rdbms 并使用 neo4j。但是任何改变两个数据库的查询都不会自动成为原子的...你必须为此在服务器端代码中执行某种强制执行,这可能很棘手。

通过骨架方法,您的大多数 neo4j 查询将具有 ID 输入和 ID 输出。丰富的数据可能不可用,因此您将使用这些 ID 并在您的 rdbms 上对这些 ID 执行 select 以获取您需要的数据。任何涉及关系和期望数据返回的查询都需要使用两个数据库,这对开发人员来说可能很麻烦,但在您的服务器端代码上可能没问题。您将避免同步问题,也可能避免原子性问题,因为两个数据库之间的公共数据将是最小的。

值得注意的是,有一些解决方案可以按照与您所提议的类似的模式与其他数据库集成。

GraphAware 有一个 graph-aided search 的概念,它提供了 ElasticSearch 和 neo4j 之间的集成,尽管这主要是为了解决对丰富的可搜索性的需求。这可用于将 ElasticSearch 用作纯搜索引擎,或者它可以让您将所有数据存储在 ES 中并根据 neo4j 中的关系数据提升或影响结果。

聚会有点晚了。一般不建议在一个项目中同时使用两个数据库。就像@InverseFalcon 在上面的回答中指出的那样,这样的架构会有很多问题。

据我了解,可以使用分布式图数据库,它不仅可以很好地处理关系,还可以解决大量数据的存储问题。

如果您希望结合关系数据模型和图形数据模型。您可以使用 SQL Server 2017+ 版本,其中添加了图形功能。图形关系已集成到 Transact-SQL 中,并获得使用 SQL Server 作为基础数据库管理系统的好处。

如文档中所述:

Graph extensions are fully integrated in SQL Server engine. Use the same storage engine, metadata, query processor, etc. to store and query graph data. Query across graph and relational data in a single query. Combining graph capabilities with other SQL Server technologies like columnstore, HA, R services, etc. SQL graph database also supports all the security and compliance features available with SQL Server.

参考资料

我不同意所有那些说你不应该在一个项目中使用两种不同类型的数据库的人。我已经构建系统 30 多年了,在我有机会参与的所有企业系统中,我们总是为项目的每个部分使用最好的工具。将 object/graph 数据库与关系数据库和文档数据库组合到同一个项目中是很常见的。我们将在 object/graph 数据库中支持高速 link 分析,然后跳出关系数据库获取元数据,然后跳入文档数据库获取原始源信息。或者,您可以反转整个过程,从文档搜索开始,然后进行高速 link 分析。

在许多情况下,这是一个被迫使用 EB 级遗留关系数据的问题,但需要添加具有高速 link 分析等新功能。我们没有尝试将所有关系数据移植到 object/graph 数据库,而是只转移了我们需要的信息。

不要将方钉强行插入圆孔中。为项目的每个部分使用最好的工具。