Azure cosmosdb 同一集合中具有多个类型的CosmosDB/DocumentDB分区

Azure cosmosdb 同一集合中具有多个类型的CosmosDB/DocumentDB分区,azure-cosmosdb,Azure Cosmosdb,据我所知,团队的官方建议是将所有数据类型放入一个集合中,该集合在文档上有类似于type=someType的字段来区分类型 现在,如果我们假设大型数据库具有分区,其中可以有不同的对象类型: 完全不同的字段(因此没有用于分区的公共字段) 相关(通过参考) 如何组织事物,使应该在一起的事物以相同的分区结束 例如,假设我们有: 使用者 博客帖子 博客后评论 如果我们使用type=user | blogPost | blogPostComment将它们存储为单独的类型,在同一个集合中,我们如何确保用户、他

据我所知,团队的官方建议是将所有数据类型放入一个集合中,该集合在文档上有类似于
type=someType
的字段来区分类型

现在,如果我们假设大型数据库具有分区,其中可以有不同的对象类型:

  • 完全不同的字段(因此没有用于分区的公共字段)
  • 相关(通过参考)
  • 如何组织事物,使应该在一起的事物以相同的分区结束

    例如,假设我们有:

    使用者

    博客帖子

    博客后评论

    如果我们使用
    type=user | blogPost | blogPostComment
    将它们存储为单独的类型,在同一个集合中,我们如何确保用户、他的blogPost和所有相应的注释最终位于同一分区中? 这方面有什么最佳实践吗

    [更新] 你能完全避免跨分区查询吗?这应该是一个目标吗?或者你只是想尽量减少它们?
    例如,对于99%的案例/查询,您可以对数据进行完美的分区,但是您需要一些仪表板来显示所有数据的聚合。这是您认为不可避免并试图最小化的事情,还是完全可以避免的事情?

    分区应该保存与预期增长的组相关的数据,例如将对许多文档进行分组的租户(可以是您提到的不同类型的文档)因此,这个实例中的分区键应该是TenantId。分区更多的是与组相关的数据,而不是数据类型。如果数据与某个用户相关,那么您可以使用UserId,但是许多用户可能会在相同的帖子上发表评论,因此它似乎不是分区键的最佳候选项,除非用户信息进行了一些非标准化处理,因此它不必直接与其他用户关联。。如果有道理的话?

    基本上,在单个Cosmos集合中处理许多不同的逻辑实体类型时,最简单的选择是在所有文档上放置一个通用(或抽象,如您所指)分区键。此时,应用程序需要确保在运行时选择适当的值。我通常将此文档属性命名为
    partitionKey
    routingKey
    或类似名称

    这在设计最佳查询效率时非常重要,因为分区键的选择会对查询和吞吐量性能产生巨大影响。像这样的通用密钥可以让您设计数据的最佳存储,因为它有利于您正在构建的任何应用程序

    甚至像
    tenant
    这样的东西也没有意义,因为不同的租户可能具有完全不同的数据大小和访问模式。相反,您可以在运行时将
    tenantId
    作为分区键的一部分,作为一种组合

    更新:
    对于某些查询模式,可以完全通过单个分区为它们提供服务。不过,如果事情最终跨越了分区,那肯定不是世界末日。这个系统仍然很快。如果可能的话,限制给定查询需要触及的分区数量是理想的,但您永远不会100%地避开它。

    是的,这是一个合理的意图,但我仍然在暗中研究实现。正如您正确指出的,
    userId
    在教科书博客示例中不是一个好的分区键,但我很难理解可能是什么?/我提到数据类型只是因为它们可能非常不同,没有有机的公共字段(可能用作分区键),但我们可能需要添加一些抽象字段。这正是我所想的!谢谢分享。我会调查细节,如果我还有什么问题的话,我会带着更多的问题回来。非常感谢@迪兹:没问题:)很高兴它帮了你。如果有其他问题,请随意提问。我在开场白中又增加了一个(子)问题。请你看一下,把你的答案写进去,这样我就可以接受了。谢谢@deezg我已经更新了我的答案来澄清你剩下的问题,你为我节省了很多时间。非常感谢!