DocumentDB:如何更好地为更新构建数据结构



例如,我有这样的文档集合:

{
hotField1 : 0,
hotField2 : "",
coldField1 : 0,
...
coldFieldN : ""
}

在这个范围内,冷属性被写一次,有时被访问,热属性被写,然后经常被访问\更新(但在不同的用例中,它不是同一个子文档或同一对象的一部分)。文档数量相当巨大(1M及以上),热数据的大小至少是冷数据的十倍。

由于部分更新仍然是最需要但尚未实现的功能,更新hotField1的唯一方法是:

  1. 请求完整文档
  2. 更改hotField1或hotField2
  3. 回写整个文档

就RU而言,这是昂贵的,而且扩展性不太好。

所以问题是如何组织这样的数据&调用DocumentDB以最大限度地降低成本

发现的替代品:

  1. 显然最好:检索一个属性;改变更新-尚未更新
  2. 分离两个集合,使用存储过程从主集合检索,然后从字典检索
  3. 将hotFields1-2作为子文档({ sub: {hf1:0, hf2:""}}),并以某种方式只更新它?(我不确定是否可能)

PS。我们使用的客户端库的标签中的C#。如果它缺少smth,那么可以使用REST接口。

虽然没有确切的"最佳"答案:

您的#2选择将不适用于存储过程,因为存储过程的作用域是一个集合。

更新子文档(#3选项)与更新顶级属性没有什么不同——您仍在检索和重写文档(子文档只是文档上的另一个属性)。

虽然它可能会也可能不会减少RU(正如Larry在评论中指出的那样,你需要进行基准测试),但你可以选择将热门属性存储在一个单独的(较小的)文档(或多个较小的文档)中。属性越少,更新过程中消耗的带宽就越少,索引更新也就越少。然而,由于您现在要检索多个文档(可能是多个调用),您可能会发现此活动会抵消存储在单个文档中所节省的任何RU。

注意:没有什么可以阻止您将这些单独的文档存储在同一个集合中(这可以让您使用存储过程来解决问题,正如您在#2选择中所建议的那样)。您只需要创建某种类型的属性来帮助识别不同的文档类型。

一旦更改一个或所有属性,基于Documents的NoSQL就会替换文档。

就成本而言,它是以每次收集为基础的。

因此,如果您有一个DB,其中有两个集合,每个集合的性能级别为S1,即每月25美元。

$25 x 2=$50

如果你需要更好的性能,并将其更改为S2,你将被收取费用:

$50+$25=75

最新更新