【问题标题】:How should I store lots of rows in DocumentDb我应该如何在 DocumentDb 中存储大量行
【发布时间】:2015-01-04 09:00:59
【问题描述】:

我的系统中有一个实体,它会在短时间内针对它添加很多 cmets。

如果我读取一个文档然后修改其中的某些内容,那么我是否正确地说,整个对象会被持久化回存储区?

如果这是正确的,那么加载和存储一个包含 5000 cmets 的对象以便我可以添加评论似乎有点太多了?

我是否应该将每条评论存储为一个文档,然后在文档集合中扫描特定键?我还需要能够快速找到评论并对其进行修改。

【问题讨论】:

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


    【解决方案1】:

    一个海量文档

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

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

    优点:

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

    多个集合

    我猜最好的选择是将评论和主要对象分成两个集合,并通过 id 将每个评论链接到主要对象。 通过这种方式,您可以添加和编辑单个评论以及通过查询检索所有文档。通过这种方式,您可以对 cme​​ts 集合运行更复杂的查询,例如 - 按用户等获取所有 cmets。

    缺点:

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

    虽然您必须知道 OrderBy 子句尚不支持,但您可能在检索例如最后 10 个 cmets 等时遇到问题。

    可能的替代方案

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

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

    这样您可以极快地检索和更新评论实体,以及按时间查询它

    【讨论】:

    • 要补充一点 - 请记住,集合不是表,也不强制执行模式(我更愿意将它们视为存储文档的分区)。您可以对主要对象和评论文档使用相同的集合 - 这使您的主要对象和 cmets 位于同一个事务域中。
    • 您可能也有兴趣在 Azure DocumentDB 反馈站点上投票支持“更新”或“补丁”。这将有助于让产品团队听到您的声音 - feedback.azure.com/forums/263030-documentdb/suggestions/…
    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 2010-09-29
    相关资源
    最近更新 更多