我曾考虑过创建一个Vertices表和一个Edges表,但是在内存中建立图并遍历子图需要大量查找吗?我想避免过多的数据库读取。还有其他方法可以保持图形吗?
旁注:我听说过Neo4j,但实际上我的问题是如何在概念上在标准数据库中表示图形。我对像mongodb这样的NoSQL解决方案持开放态度。
最佳答案
不幸的是,答案是:您的考虑完全正确。您必须将Nodes(顶点)存储在一张表中,并且Edges引用FromNode和ToNode才能将图形数据结构转换为关系数据结构。而且您是对的,最终会导致大量查找,因为您无法将其划分为子图,因此可能会立即对其进行查询。您必须从Node到Edge遍历到Node到Edge到Node ...等等(递归,当SQL使用Set时)。
要点是...
关系,面向图,面向对象,基于文档是满足不同要求的不同类型的数据结构。就是这样,为什么要出现这么多不同的NoSQL数据库(其中大多数是简单的文档存储),因为以关系方式组织大数据根本没有意义。
替代方案1-面向图的数据库
但是,还有面向图形的NoSQL数据库,这些数据库使图形数据模型成为了像OrientDB这样的一流公民,我现在正在玩这个游戏。关于它的好处是,尽管它将数据作为图形持久化,但仍可以以关系式甚至面向对象或面向文档的方式使用(即通过使用普通的旧SQL查询)。不过,Traversing the graph是确保从中获取数据的最佳方法。
替代方案2-使用内存中的图形
对于快速路由,像Graphhopper这样的路由框架会在内存中建立完整的Graph(十亿个节点)。由于Graphhopper使用其GraphStore的MemoryMapped实现,因此即使在仅需要MB内存的Android设备上也可以使用。完整的图形在启动时从数据库读取到内存中,然后在那里进行路由,因此您无需查找数据库。