为一个应用程序实现两个或多个数据库是否设计糟糕/困难?
例如,假设我有 User
对象,我想将其存储到关系数据库中。这些“用户”对象彼此有关系并有用户提要(想想 Twitter/Facebook),我想存储这些关系以便能够找到 friend 的 friend ,看看我在链中有多“深”提要等。这些关系将存储在图形数据库中。
有没有更好的方法来解决这个问题,或者使用图形数据库来存储关系和关系数据库来存储数据是最好的解决方案吗?
最佳答案
免责声明:我还没有使用过企业版的 neo4j,所以它可能有一些我不知道的功能可以帮助你。
如果您可以将所有内容都保留在 neo4j 中,那是最好的,因为它可以在多个方面保持较低的复杂性,包括数据建模、保持数据同步以及保持查询简单和原子性,而不是将它们拆分到单独的数据库中。
这将有助于了解您对使用 RDBMS 的要求是什么,以及这些要求是否证明了从上面引入的复杂性。
如果您决心这样做,那么您可以在高数据冗余之间做出选择,或者使用更骨架的 neo4j 数据库,它只保留 ID、关系和最少的数据。
有了高数据冗余,在 neo4j 中镜像大部分(如果不是全部)数据,那么你就会增加保持数据库之间所有内容同步和一致的复杂性(一点也不简单)。这可以通过 neo4j 为您提供更丰富的查询,因为大多数数据都在同一个数据库中,并且将来可以更好地切断您的 rdbms 并使用 neo4j。但是任何改变两个数据库的查询都不会自动成为原子的……为此,您必须在服务器端代码中执行某种强制措施,这可能很棘手。
通过骨架方法,您的大多数 neo4j 查询将具有 ID 输入和 ID 输出。丰富的数据可能不可用,因此您将获取这些 ID 并在您的 rdbms 上根据这些 ID 为您需要的数据进行选择。任何涉及关系和期望数据返回的查询都需要使用两个数据库,这对开发人员来说可能很麻烦,但在您的服务器端代码上可能没问题。您将避免同步和可能的原子性问题,因为两个数据库之间的公共(public)数据将是最小的。
值得注意的是,有一些解决方案可以按照与您所提议的类似的模式与其他数据库集成。
GraphAware 有一个概念 graph-aided search它提供了 ElasticSearch 和 neo4j 之间的集成,尽管这主要是为了解决对丰富的可搜索性的需求。这可用于将 ElasticSearch 用作纯搜索引擎,或者它可以让您将所有数据存储在 ES 中,并根据 neo4j 中的关系数据提升或影响结果。
关于mysql - 结合图形数据库和 RDBMS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38646897/