这是用于映射元数据的项目。还有更多的节点,但是这个特定的节点成了团队中的一场辩论。图形数据库建模:多条边比单边具有更好的属性?
哪个模型会产生最佳的查询性能?或者没关系?
选项1
权限元数据是显式的作为节点之间的边缘。
选项2
权限元数据是所述边缘的特性的内部。
选项3
???
这是用于映射元数据的项目。还有更多的节点,但是这个特定的节点成了团队中的一场辩论。图形数据库建模:多条边比单边具有更好的属性?
哪个模型会产生最佳的查询性能?或者没关系?
选项1
权限元数据是显式的作为节点之间的边缘。
选项2
权限元数据是所述边缘的特性的内部。
选项3
???
让我ArangoDB这里发表评论,是它的开发者之一。
还有第三个可能性,即具有对不同的访问方法的单个顶点集合和多个边缘集合。然后你会“正式”得到3个共享相同顶点集的图。
我希望这是更好的性能,因为每次访问类型将只需要处理一个单一类型的边缘和接入的是快。
显然这一切都取决于您的查询。我的陈述适用于诸如“一个人可以更新的所有实体是什么?”之类的查询。或“谁可以选择这个实体?”。
我能想象你的标准查询即是多“这个人可以删除实体?”或“此人对该实体拥有哪些访问权限?”。
这两个问题可能对于所提出的任何方法都不是有效的,因为就我所见,所有这些问题都需要进行搜索,无论是在Person的输出边缘还是在Entity的输入边缘。
将在这里需要的是一种“顶点中心指数”的,那就是可用于设定一个给定的顶点外出或进入边缘的指数。例如,如果你使用你的选项2(或者实际上是1,这并不重要),并且在所有的边上有一个排序的索引,这个索引首先被Person和Entity排序。然后,它是一个时间复杂度为O(log(#edges))的查找,以查找从给定Person到给定实体的边(可能是singleton)集合。
我们在ArangoDB目前正在忙于添加此功能,该功能将出现在下两个版本中的一个中。
我只能在这里Neo4j的说话:
我不知道它会多大关系,但绝对标杆!关系和属性都存储为链接列表,所以它仍然需要遍历它们。但是如果你在Person
和Entity
节点之间有更多的关系,那么把它们放在属性中就会变得更有吸引力。
我建议检查出的免费O'Reilly出版Graph Databases了解更多有关的Neo4j的内部。但基准将始终是黄金标准。
做了答案之一回答你的问题?你介意把它标记为已解决吗?如果没有,缺少什么? – dothebart
我标记Max's作为答案。我们做了基准测试,并且据我所知,这一切都取决于您尝试回答的模型和问题。 我们结束了使用这两种类型,无论哪个证明更容易编写。我们明天将展示一个小概念证明。 :-) – Ricardo