图数据库建模:多边比具有属性的单边更好?
Graph database modeling: multiple edges are better than single edges with properties?
这是一个将映射元数据的项目。还有更多的节点,但这个特定的节点成为团队中的争论。
哪种模型会产生最佳查询性能?还是无所谓?
选项 1
权限元数据作为节点之间的边是明确的。
选项 2
权限元数据在边缘的属性中。
选项 3
???
这里只能为Neo4j说话:
我不知道这有多大关系,但绝对是基准!关系和属性都存储为链表,因此仍然需要遍历它们。但是,如果您在 Person
和 Entity
节点之间有更多关系,那么将它们放在属性中开始变得更有吸引力。
我建议查看免费的 O'Reilly 书籍 Graph Databases 以了解有关 Neo4j 内部结构的更多信息。但基准永远是黄金标准。
让我在这里评论 ArangoDB,作为它的开发者之一。
还有第三种可能,即针对不同的访问方式,单顶点集合多边集合。然后你会 "officially" 有 3 个图共享相同的顶点集。
我希望这在性能上更好,因为每种访问类型只需要处理一种类型的边,并且访问会很快。
显然这完全取决于您的查询。我的陈述适用于 "what are all the Entities a Person can update?" 或 "who can select this Entity?".
等查询
我可以想象您的标准查询更 "Can this person delete that Entity?" 或 "Which access rights does this person have for that Entity?"。
这两个问题对于建议的任何方法都可能效率不高,因为据我所知,所有这些都需要搜索,无论是在 Person 的传出边缘还是在 Person 的传入边缘实体。
这里需要的是一种"vertex centric indices",即可用于给定顶点的出边或入边集的索引。例如,如果您将使用您的选项 2(或者实际上是 1,这并不重要),并且在所有边上都有一个排序索引,该索引首先按 Person 然后按 Entity 排序。然后是时间复杂度为 O(log(#edges)) 的查找,以查找从给定 Person 到给定 Entity 的(可能是单例的)边集。
我们 ArangoDB 目前正忙于添加此功能,它将出现在接下来的两个版本之一中。
这是一个将映射元数据的项目。还有更多的节点,但这个特定的节点成为团队中的争论。
哪种模型会产生最佳查询性能?还是无所谓?
选项 1
权限元数据作为节点之间的边是明确的。
选项 2
权限元数据在边缘的属性中。
选项 3
???
这里只能为Neo4j说话:
我不知道这有多大关系,但绝对是基准!关系和属性都存储为链表,因此仍然需要遍历它们。但是,如果您在 Person
和 Entity
节点之间有更多关系,那么将它们放在属性中开始变得更有吸引力。
我建议查看免费的 O'Reilly 书籍 Graph Databases 以了解有关 Neo4j 内部结构的更多信息。但基准永远是黄金标准。
让我在这里评论 ArangoDB,作为它的开发者之一。
还有第三种可能,即针对不同的访问方式,单顶点集合多边集合。然后你会 "officially" 有 3 个图共享相同的顶点集。
我希望这在性能上更好,因为每种访问类型只需要处理一种类型的边,并且访问会很快。
显然这完全取决于您的查询。我的陈述适用于 "what are all the Entities a Person can update?" 或 "who can select this Entity?".
等查询我可以想象您的标准查询更 "Can this person delete that Entity?" 或 "Which access rights does this person have for that Entity?"。
这两个问题对于建议的任何方法都可能效率不高,因为据我所知,所有这些都需要搜索,无论是在 Person 的传出边缘还是在 Person 的传入边缘实体。
这里需要的是一种"vertex centric indices",即可用于给定顶点的出边或入边集的索引。例如,如果您将使用您的选项 2(或者实际上是 1,这并不重要),并且在所有边上都有一个排序索引,该索引首先按 Person 然后按 Entity 排序。然后是时间复杂度为 O(log(#edges)) 的查找,以查找从给定 Person 到给定 Entity 的(可能是单例的)边集。
我们 ArangoDB 目前正忙于添加此功能,它将出现在接下来的两个版本之一中。