Azure cosmosdb 如何使具有2个分区键的文档保持同步/引用完整性?

Azure cosmosdb 如何使具有2个分区键的文档保持同步/引用完整性?,azure-cosmosdb,azure-cosmosdb-sqlapi,Azure Cosmosdb,Azure Cosmosdb Sqlapi,我有一个cosmos db,它具有高基数的合成分区键和类型属性。 我需要一个用户可以在他们之间共享文档的设置 例如,这是一个文档: { “id”:”guid”, “title”:”Example document to share”, “ownerUserId”:”user1Guid”, “type”: “usersDocument”, “partitionKey”:”user_user1Guid_documents” } 现在,用户希望与其他用户共享此文档 假设: 一个文档可以与多个用户共享

我有一个cosmos db,它具有高基数的合成分区键和类型属性。 我需要一个用户可以在他们之间共享文档的设置

例如,这是一个文档:

{
“id”:”guid”,
“title”:”Example document to share”,
“ownerUserId”:”user1Guid”,
“type”: “usersDocument”,
“partitionKey”:”user_user1Guid_documents”
}
现在,用户希望与其他用户共享此文档

假设:

  • 一个文档可以与多个用户共享(数千个)
  • 一个用户可以与他共享数千个文档
  • 出于以下两个原因:

  • 我不想将共享嵌入
    文档
    文档,也不想嵌入
    用户
    文档(因为写入很快就会变得无效/昂贵),但我更希望那些
    m:n
    是单独的文档
  • 我不想让所有用户/文档共享,因为它很快就会创建热点
  • 我需要两个问题:

    1<代码>列表文档与我共享 在这个查询中,在查询时,我知道
    用户的
    id
    文档是与共享的

    2<代码>列表ALLUSERS将此文档与共享
    在这个查询中,在查询时,我知道与不同的用户共享的文档的id

    所有这些让我觉得我应该有两个单独的文档类型和单独的分区

    要列出与我共享的所有文档,请执行以下操作:

    {
      “id”:”documentGuid”,
      “type”:”sharedWithMe”,
      “partitionKey”:”sharedWithMe_myUserGuid”
    }
    
    (这也可以是包含共享文档集合的单个文档。这里重要的是partitionKey)

    现在我可以很容易地从c中执行SQL,比如
    SELECT*,其中c.type=“sharedWithMe”
    并对包含我的用户guid的分区键运行查询

    对于列出与我共享某个文档的所有用户,其类似:

    {
      “id”:”userISharedWithGuid”,
      “type”:”documentSharings”,
      “partitionKey”:”documentShare_documentGuid”
    }
    
    现在,我可以轻松地执行SQL操作,如从c中选择*,其中c.type=“documentSharings”
    并对包含我的文档guid的分区键运行查询

    问题:

    当用户与某个用户共享一个文档时,应该使用不同的分区键创建这两个文档(因此,没有sp/事务)

    如何保持这种“原子式”或避免创建/更新异常


    或者有更好的方法来建模吗?

    我认为您的方法是有意义的,我会根据查询的范围以多种方式执行类似于分区的操作。我想您主要关心的是,是否在保存第一组和最后一组相关文档之间发生故障?不幸的是,在文档保存时管理文档链的唯一方法是在应用程序代码中。i、 e.我们确保以最容易回滚的顺序保存,然后在异常处理程序中实现回滚方法,这通过将保存的文档集合保存在内存中来实现。
    正如您所说,在跨分区时,没有现成的事务处理