我不确定这个问题更适合在这里还是dba.stackexchange.com,如果需要的话请告诉我,我可以移动它。
我正在从头开始启动一个全新的项目,并研究使用图形数据库(在这种情况下可能是neo4j)的适当性。但是,预计该系统将具有适用于图形数据库的数据(例如HR层次结构),以及最好放在RDBMS中的数据(例如订单、发票、产品等)。
我的问题涉及跨越这两个数据库连接的最佳方法。这里有一个简化的例子,我们在图形数据库中有一个销售公司的HR层次结构,在RDBMS中有产品和订单:
层次结构(图形数据库)
你可以使用两个查询——一个用于从图表中提取所有销售员,第二个用于从关系型数据库管理系统中提取这些销售员的所有订单:
(伪代码)
这个方法能够运行,但在大规模情况下效率较低,且不够优雅。我想直接连接关系型数据库。有没有实现类似功能的方法?
(伪代码)
我正在从头开始启动一个全新的项目,并研究使用图形数据库(在这种情况下可能是neo4j)的适当性。但是,预计该系统将具有适用于图形数据库的数据(例如HR层次结构),以及最好放在RDBMS中的数据(例如订单、发票、产品等)。
我的问题涉及跨越这两个数据库连接的最佳方法。这里有一个简化的例子,我们在图形数据库中有一个销售公司的HR层次结构,在RDBMS中有产品和订单:
层次结构(图形数据库)
订单/产品(关系型数据库管理系统)
假设我们想找到所有低于“state1”级别的销售员可以获得佣金的订单。你可以使用两个查询——一个用于从图表中提取所有销售员,第二个用于从关系型数据库管理系统中提取这些销售员的所有订单:
(伪代码)
MATCH (closers:employee)-[member_of]->(:group)<-[parent_of]-(parent:group)
WHERE parent.name = 'state 1'
RETURN closers;
然后将这些结果导入到另一个查询中:
(伪代码)
SELECT * FROM orders WHERE salesEmployeeId IN ( <resultId1>, <resultId2>, ... <resultIdN> );
这个方法能够运行,但在大规模情况下效率较低,且不够优雅。我想直接连接关系型数据库。有没有实现类似功能的方法?
(伪代码)
MATCH (closers:employee)-[member_of]->(:group)<-[parent_of]-(parent:group)
WHERE parent.name = 'state 1'
JOIN rdbms.orders ON orders.salesEmployeeId = closers.id
RETURN orders;
编辑:有人指出,这个问题中的订单部分可以很容易地在图形数据库中实现,因此根本不需要关系型数据库。我已经考虑过这个选项,但目前我仍在努力弄清楚图形数据库是否整体适合。我更感兴趣的是更大、更一般的问题:“如果两个系统中都有东西,那么有没有一个好的/快速的/优雅的方法来用一个查询完成这个任务?”