CosmosDB图形顶点和边的分区键

时间:2017-06-27 03:52:43

标签: graph-databases azure-cosmosdb

我正在创建一个图表并且最初使用的分区键似乎是给定数据集的唯一逻辑分区键。但是,顶点和边的数量最终对于单个分区而言太大。我没有创建分区集合,但只创建了一个10GB集合。我把它从空间中跑出来填满了,因为我不知道我会有多少个顶点和边缘。数据是一组具有不同子类别的类别(以及这些子类的子类别,直到任意深度)。数据是类别ID和名称以及该类别适用的市场。分区键目前是市场。在给定的市场中,有一堆类别/ subcat / subcat / ...耗尽了该给定市场的10GB分区。

如果我拥有的是一个唯一的类别ID,一个类别名称和一个市场(作为一个顶点),然后一个parentOf边缘将一个父类别连接到它的子节点,那么还有什么是有意义的分区键?如果我有一个id为1的父类别(顶点),一个美国'的市场,它有100个子类别,每个子类别都有自己的id和parentOf连接的相应100个边缘都具有相同的市场' US',那么我对除市场以外的分区键的唯一选择是类别ID。问题是,如果这些孩子(和边缘)的孩子和孩子在其他分区中,查找和遍历的效率如何?

如何使用这样的场景构建一个非常大的图形?

给定一个任意类别id,找到所有子节点然后向下走以找到这些边缘层次结构中的所有子节点的表现是什么样的?

边缘的分区键属性需要是什么?与父顶点相同的分区键或与子顶点相同的分区键?

我在考虑这个错误吗?

1 个答案:

答案 0 :(得分:1)

我对任何非平凡图表实现的建议是创建一个超级通用属性,所有文档都必须包含这些属性,例如(字面上)partitionKey。然后,您可以在该字段中使用market的值,这是有意义的,还有其他内容可以支持不同的查询模式。

要理解的重要一点是跨多个分区的查询会很慢。因此,您应该尽可能地定制分区键以支持读写之间的最佳平衡。

问问自己“我最常需要对这些数据进行哪些查询?”然后相应地调整各个文档的partitionKey。

对于边缘,当使用Gremlin在两个顶点之间添加边时,Cosmos会自动将边文档放在与顶点相同的分区中。