如何在关系数据库中持久化图形数据结构? [英] How to persist a graph data structure in a relational database?

查看:34
本文介绍了如何在关系数据库中持久化图形数据结构?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我曾考虑创建一个顶点表和一个边表,但是在内存中构建图和遍历子图是否需要大量查找?我希望避免过多的数据库读取。是否有其他保存图表的方法?

附注:我听说过Neo4j,但我的问题实际上是如何在概念上表示标准数据库中的图形。不过,我对一些NoSQL解决方案(如MongoDB)持开放态度。

推荐答案

不幸的是,答案是:您的考虑在每一点上都是完全正确的。您必须将节点(顶点)存储在一个表中,并存储引用FromNode和ToNode的边,才能将图形数据结构转换为关系数据结构。你也是对的,这最终导致了大量的查找,因为你不能把它分成几个子图,这些子图可能会一次被查询。您必须从节点遍历到边缘,再遍历到边缘,再遍历节点……依此类推(当SQL使用集合时,以递归方式进行遍历)。

要点是.

关系数据结构、面向图形数据结构、面向对象数据结构、基于文档的数据结构是满足不同要求的不同类型的数据结构。这就是为什么会出现这么多不同的NoSQL数据库(大多数是简单的文档存储)的原因,因为以关系方式组织大数据是没有意义的。

面向图形的备选1-数据库

但也有面向图形的NoSQL数据库,这使得图形数据模型成为像OrientDB这样的一等公民,我目前正在研究这一点。它的优点在于,尽管它将数据持久化为图形,但它仍然可以以关系、甚至面向对象或面向文档的方式使用(即使用普通的老式SQL进行查询)。不过,Traversing the graph肯定是从中获取数据的最佳方式。

备选方案2-使用内存中的图形

谈到快速路由,像Graphhopper这样的路由框架会在内存中构建完整的Graph(数十亿个节点)。因为GraphHopper使用其GraphStore的MemoryMaps实现,所以即使在只需要一些MB内存的Android设备上也可以工作。启动时将完整的图形从数据库读取到Memor中,然后在那里进行路由,因此您无需查找数据库。

这篇关于如何在关系数据库中持久化图形数据结构?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆