Azure CosmosDb 分区键 - 不同的架构

Azure CosmosDb partition key - different schema

我有一个 Azure CosmosDB SQP API 帐户,其中包含一个容器“EmployeeContainer”,分区键为“personId”。我在这个容器中有三种不同类型的集合。他们的架构如下所示:

人物合集:

{
    "Id": "1234569",
    "personId" : "P1241234",
    "FirstName": "The first name",
    "LarstName": "The last name"
}

人-部门合集:

{
    "Id": "923456757",
    "personId" : "P1241234",
    "departmentId": "dept01",
    "unitId": "unit01",
    "dateOfJoining": "joining date"
}

部门-员工

{
    "id": "678678",
    "departmentId" : "dept01",
    "departmentName": "IT",
    "employees" : [
        { "personId": "P1241234" },
        { "personId": "P1241235" },
        { "personId": "P1241236" },
    ]   
}

数据将如何存储在逻辑分区中? PersonId 是分区键,所有集合中都有 personId。因此,person 集合中人员 id 为“P1241234”的文档和 Person-Department 集合中人员 id 为“[=”的文档23=]P1241234”会存放在同一个逻辑分区吗? Department-Employees 中的数据将如何存储?

是的,确实如此,具有相同personId的文档将存储在相同的逻辑分区下(不管它们的type\schema)。我不确定您是否可以在具有分区键的集合上创建没有分区键的文档,但如果可以的话 - 所有这些文档都应该位于同一逻辑分区下(但我认为您无法创建它们)。

这个设计不是最优的。您应该使用 personId 作为分区键将 Person 和 Person-Department 组合成一个 collection,然后为具有 departmentId 的部门创建第二个容器,因为它是分区键,每个人作为另一行和任何其他属性您在查询 collection 时需要。不要编写查询两个容器的代码。每个都应该拥有满足您提出的任何请求所需的所有数据。然后使用更改提要使它们保持同步。

您可以在这篇文章中获得更多关于如何建模的详细信息here