DocumentDB:如何更好地构建数据以进行更新

DocumentDB: How to better structure data for updates

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

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

在此范围内,冷属性只写入一次,有时访问,热属性写入后相当频繁accessed\updated(但在不同的用例中,它不是同一子文档或同一对象的一部分). 文档量比较大(1M以上),热数据的大小至少是冷数据的十倍。

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

  1. 索取完整文件
  2. 更改 hotField1 或 hotField2
  3. 写回整个文件

这在 RU 方面成本很高,而且扩展性不好。

所以问题是如何在 DocumentDB 中组织此类数据和调用以最小化成本?

发现的替代品:

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

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

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

在费用方面,以单次收款为准。

因此,如果您的数据库中包含两个集合并且每个集合的性能层级为 S1,即每月 25 美元。

25 美元 x 2 = 50 美元

如果您需要更好的性能,并且将一个更改为 S2,您将被收取费用:

50 美元 + 25 美元 = 75 美元

虽然没有确切的 "best" 答案:

您的第 2 个选择不适用于存储过程,因为存储过程的范围限定为集合。

更新子文档(#3 选择)与更新 top-level 属性没有什么不同 - 您仍在检索 re-writing 文档(子文档只是另一个 属性在文件上)。

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

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