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
我有一个 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