【发布时间】:2018-06-23 06:15:06
【问题描述】:
我正在为 DocumentDB 数据库建模,并试图找出解决特定问题的最佳方法。
让我们用Order > OrderLine > Product example. 来说明它
所以,Order 包含 OrderLines 和 OrderLines 包含 Products。 (逻辑上)
在 documentDB 中,Order 可以表示,例如:
{
id,
title,
date,
lines:
[
{ orderLineId, productId, name, quantity, price },
{ orderLineId, productId, name, quantity, price },
{ orderLineId, productId, name, quantity, price }
]
}
在这种情况下,OrderLines 被嵌入,Products 被引用(添加的name 字段是Product 在创建OrderLine 时名称的快照)。
现在我们来一个查询:How much of a Product with id=abc have i sold between date1 and date2?
在此设置中,该查询应遍历所有Orders > OrderLines 以在给定行中找到productId。听起来不是最优的。
其他解决方案是通过引用OrderLines 来展平文档,而不是将它们嵌入到Order 中。这对这个查询很有用,但是查询完整的 Order 会变成 2 个查询。
第三种选择是在 Product 文档中保留 numberOfSales 记录,以便我们为每个产品保留 runningBalance。这需要为每个Order 创建两个步骤写入:一个用于订单本身,一个用于更新Products 文档。
目前,我主要倾向于第三种解决方案,每种产品都保持平衡,但不确定我是否遗漏了什么?这有什么大问题吗?或者,有什么推荐的/更好的/其他方式吗?
【问题讨论】:
-
>>" 这对这个查询很好,但是查询完整的 Order 会变成 2 个查询。" - 如果你把这 2 个放在同一个分区中,你可以编写存储过程来更快地执行这 2 个......使用第 3 个选项 - 你需要注意
order的数据与product.numberOfSales数据一致。 .我认为方式取决于您需要执行每种类型的查询的频率..顺便说一句,有一个 FeedChange 选项,您可以使用它订阅您的集合中的文档更改并基于此 - 更新您的product.numberOfSales属性 - 所以您最终会收到 1 次订单创建电话
标签: azure-cosmosdb