DocumentDB:如何更好地构建数据以进行更新
DocumentDB: How to better structure data for updates
例如,我有这样的文档集:
{
hotField1 : 0,
hotField2 : "",
coldField1 : 0,
...
coldFieldN : ""
}
在此范围内,冷属性只写入一次,有时访问,热属性写入后相当频繁accessed\updated(但在不同的用例中,它不是同一子文档或同一对象的一部分).
文档量比较大(1M以上),热数据的大小至少是冷数据的十倍。
由于部分更新仍然是最想要但尚未实现的功能,因此更新 hotField1 的唯一方法是:
- 索取完整文件
- 更改 hotField1 或 hotField2
- 写回整个文件
这在 RU 方面成本很高,而且扩展性不好。
所以问题是如何在 DocumentDB 中组织此类数据和调用以最小化成本?
发现的替代品:
显然最好:取回一个 属性;改变;更新 - 还没有。
- 分离两个集合,使用存储过程从主集合中检索然后从字典中检索?
- 将 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 选择中所建议的那样)。您只需要创建某种类型的 属性 来帮助您识别不同的文档类型。
例如,我有这样的文档集:
{
hotField1 : 0,
hotField2 : "",
coldField1 : 0,
...
coldFieldN : ""
}
在此范围内,冷属性只写入一次,有时访问,热属性写入后相当频繁accessed\updated(但在不同的用例中,它不是同一子文档或同一对象的一部分). 文档量比较大(1M以上),热数据的大小至少是冷数据的十倍。
由于部分更新仍然是最想要但尚未实现的功能,因此更新 hotField1 的唯一方法是:
- 索取完整文件
- 更改 hotField1 或 hotField2
- 写回整个文件
这在 RU 方面成本很高,而且扩展性不好。
所以问题是如何在 DocumentDB 中组织此类数据和调用以最小化成本?
发现的替代品:
显然最好:取回一个 属性;改变;更新- 还没有。- 分离两个集合,使用存储过程从主集合中检索然后从字典中检索?
- 将 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 选择中所建议的那样)。您只需要创建某种类型的 属性 来帮助您识别不同的文档类型。