我应该如何在DocumentDb中存储大量行

时间:2014-11-07 14:28:46

标签: c# azure azure-storage azure-cosmosdb

我的系统中有一个实体,会在很短的时间内添加很多评论。

我是否正确地说,如果我阅读文档然后修改其中的内容,整个对象会被持久存回商店?

如果这是正确的,那么加载和存储一个带有5000个注释的对象只是为了让我可以添加注释看起来有点太多了?

我应该将每条评论存储为文档,然后在文档集中扫描特定密钥吗?我还需要能够快速找到评论并进行修改。

1 个答案:

答案 0 :(得分:1)

一份大型文件

如果您想将所有评论存储在一个文档中,您将遇到一些问题:

  • 并发写入 - 您将不得不进行大量的读取和重试操作(非当前的Etag)
  • 加载大型文档以添加评论
  • 加载大型文档以编辑评论

优点:

  • 您可以在一次操作中删除包含所有文档的主对象

多个馆藏

我猜的最佳选择是将注释和主要对象拆分为两个集合,并通过id将每个注释链接到主对象。 这样,您可以添加和编辑单个注释,以及通过查询检索所有文档。这样,您可以在评论集合上运行更复杂的查询 - 例如,按用户获取所有评论等。

缺点:

  • 使用所有评论删除主对象将非常昂贵(您必须逐个删除评论)

虽然您必须知道 OrderBy子句尚不支持,但您可能会遇到检索例如最近10条评论等问题。

可能的替代

不确定您必须支持哪些其他操作/查询。但是,如果它只是CRUD,检索主对象的注释列表并可能获得最后的x注释,您可以考虑使用Azure Table,其中:

  • 行键 - 基于时间的标识符(Unix纪元)+避免冲突的GUID
  • 分区键 - 主要对象ID

通过这种方式,您可以非常快速地检索和更新评论实体,并且可以按时间查询