【发布时间】:2017-01-23 19:50:23
【问题描述】:
例如,我有这样的文档集合:
{
hotField1 : 0,
hotField2 : "",
coldField1 : 0,
...
coldFieldN : ""
}
在这个范围内,冷属性被写入一次,并且有时被访问,热属性被写入然后经常被访问\更新(但在不同的用例中,它不是同一个子文档或同一个对象的一部分)。 文档量相当大(1M 甚至更多),热数据的大小至少比冷数据少十倍。
由于部分更新仍然是最想要但尚未实现的功能,因此更新 hotField1 的唯一方法是:
- 索取完整文档
- 更改 hotField1 或 hotField2
- 写回整个文档
这在 RU 方面代价高昂,并且无法很好地扩展。
那么问题是如何在 DocumentDB 中组织这些数据和调用以最小化成本?
发现的替代品:
-
显然最好:检索一个属性;改变;更新- 还没有。 - 分离两个集合,使用存储过程从主集合中检索,然后从字典中检索?
- 将 hotFields1-2 作为子文档
({ sub: {hf1:0, hf2:""}})并以某种方式只更新它? (我不确定是否可能)
PS。我们使用的客户端库的标签中的 C#。如果它缺乏 smth,则可以改用 REST 接口。
【问题讨论】:
-
#3 今天也是不可能的。我的第一个建议是使用直接的多合一文档方法构建它并对其进行基准测试。如果它不符合标准,则在使用分区集合时调整分配的吞吐量参数,如果不是,则转到更高的 S 级别。如果这仍然不够,那么根据字段的“热”程度考虑更复杂的分区设计。以我的经验,工程师关于什么会很快,什么不会的假设与现实相去甚远。你需要试验一下。
-
@LarryMaccherone,我们已经在 RDBMS 上有了工作系统,所以我们已经收集了一些统计数据。你能详细说明一下,更复杂的设计是什么意思?
-
只是将您的数据按热域和冷域拆分是构建、维护和培养新开发人员的更多工作。在您知道简单的多合一文档设计是否足够之前,为什么要承担这笔费用?
标签: c# azure-cosmosdb