CosmosDB中的许多小文档

时间:2019-05-08 00:57:19

标签: azure-cosmosdb

我要与CosmosDB中的文档关联许多(100量级)数据。每条数据都很小(约100字节)。

我的第一个解决方案是将数据存储为文档内部的数组。可以,但是为了将新项目添加到数组中,我需要从CosmosDB中读取文档,添加元素,然后将文档替换回CosmosDB中。

我不想这样做,而是希望将每个数据作为其自己的文档存储在同一分区中。拥有多个小文档而不是一个汇总文档有什么弊端?

3 个答案:

答案 0 :(得分:0)

取决于您的用例。

  1. 对于频繁的添加操作,您首先要阅读并更新文档(2个操作),这比创建新文档(1个操作)要花费更多的成本。

  2. 但是,如果文档之间存在某种关系(例如传统SQL中的外键),那么如果您采用上述方法#1(具有更高的成本),则获取数据将需要多次查询(否则,您将获得)一次查询即可获取完整数据(低成本)。

我建议您阅读thisthis帖子,它们将使您更好地了解可以选择哪种方法。

答案 1 :(得分:0)

  

拥有许多小文档与使用小文档有什么缺点   汇总文件?

我想说的是,我建议您存储每条数据,而不是一个汇总的文档。

原因1:正如您在问题中提到的那样,如果要将元素添加到文档中,则需要从CosmosDB中读取文档,然后替换文档,因为到目前为止cosmos db不支持部分更新。(请参考此反馈,并在需要时遵循它:https://feedback.azure.com/forums/263030-azure-cosmos-db/suggestions/6693091-be-able-to-do-partial-updates-on-document)这是一项巨大而繁琐的工作。

原因2:如果存储数据,则可以平坦地查询它们。 (从c中选择*)

对于一个单个数组文档,您需要使用join访问嵌套属性。(从c.array中的c join array中选择a.array)

原因3:如果存储数据片段,则可以将它们管理到不同的分区中。即使您现在不需要它,为什么不保留此功能。

原因4:至于成本,这完全取决于RU和存储,并且对cosmos db的请求将消耗RU。如果存储数据,则只需要根据需要访问特定文档,我认为这更经济。

答案 2 :(得分:0)

我现在正面临这个问题,我想在这里发表我的贡献。我必须存储一些状态,此状态是我每小时获得一次的指标,然后我有两个选择:

  1. 为每个状态创建一个寄存器 -> 每天 24 个寄存器
  2. 每天创建一个寄存器并在其中添加状态 -> 每天 1 个寄存器,数组中有 24 个状态

我选择了第二个,因为:

  1. 两个选项将在数据库上具有相同的操作量
  2. 我在 Power BI 上使用这些数据,经过一些测试,第二个选项中的数据在导入后