如何更新 Cosmos Document DB 中存储的引用?
How to update stored references in Cosmos Document DB?
我对基于文档的数据库非常陌生,我在我的 Springboot 应用程序中使用 Azure 的 Cosmos 文档数据库。
我有这样的数据结构:
User:
{
"firstname": "Bob",
"password": "asdf",
"roles": [
{
"rights": [
{
"name": "RIGHT_READ"
},
{
"name": "RIGHT_WRITE"
}
],
"name": "ROLE_ADMIN",
"id": "0d5299e0-836c-494d-9299-e0836c294d55"
}
],
"id": "0a9030f1-30f8-4d23-9030-f130f85d23e7",
"email": "email@mail.com",
"username": "admin",
"lastname": "Martin"
}
Role:
{
"rights": [
{
"name": "RIGHT_READ"
},
{
"name": "RIGHT_WRITE"
}
],
"name": "ROLE_ADMIN",
"id": "0d5299e0-836c-494d-9299-e0836c294d55"
}
用户存储了他被分配到的所有角色。在这种情况下,用户存储包含多个权限的角色 ROLE_ADMIN。
如果我现在正在更新角色 ROLE_ADMIN,例如通过添加权限,并通过 documentClient.replaceDocument(docLink, role, null);
将其再次存储在数据库中,存储在用户中的该实体的引用不会更新。用户仍然包含一个具有两个权限而不是三个权限的角色。
我是否必须手动更新所有参考资料,还是我遗漏了什么?
CosmosDB 是一个非关系数据库。如果您将它用作关系数据库,那么您必须手动执行所有级联更新,因为 CosmosDB 本身不知道您正在引用数据库中的另一个文档。每个文档都与另一个文档无关。
基于此示例,您还遇到了数据完整性问题。您将权限存储在角色对象和用户对象中。您应该做的是将权限存储在角色对象中,然后仅使用用户对象中的角色 ID 并根据角色 ID 查询权限。这样你只更新角色。
我对基于文档的数据库非常陌生,我在我的 Springboot 应用程序中使用 Azure 的 Cosmos 文档数据库。
我有这样的数据结构:
User:
{
"firstname": "Bob",
"password": "asdf",
"roles": [
{
"rights": [
{
"name": "RIGHT_READ"
},
{
"name": "RIGHT_WRITE"
}
],
"name": "ROLE_ADMIN",
"id": "0d5299e0-836c-494d-9299-e0836c294d55"
}
],
"id": "0a9030f1-30f8-4d23-9030-f130f85d23e7",
"email": "email@mail.com",
"username": "admin",
"lastname": "Martin"
}
Role:
{
"rights": [
{
"name": "RIGHT_READ"
},
{
"name": "RIGHT_WRITE"
}
],
"name": "ROLE_ADMIN",
"id": "0d5299e0-836c-494d-9299-e0836c294d55"
}
用户存储了他被分配到的所有角色。在这种情况下,用户存储包含多个权限的角色 ROLE_ADMIN。
如果我现在正在更新角色 ROLE_ADMIN,例如通过添加权限,并通过 documentClient.replaceDocument(docLink, role, null);
将其再次存储在数据库中,存储在用户中的该实体的引用不会更新。用户仍然包含一个具有两个权限而不是三个权限的角色。
我是否必须手动更新所有参考资料,还是我遗漏了什么?
CosmosDB 是一个非关系数据库。如果您将它用作关系数据库,那么您必须手动执行所有级联更新,因为 CosmosDB 本身不知道您正在引用数据库中的另一个文档。每个文档都与另一个文档无关。
基于此示例,您还遇到了数据完整性问题。您将权限存储在角色对象和用户对象中。您应该做的是将权限存储在角色对象中,然后仅使用用户对象中的角色 ID 并根据角色 ID 查询权限。这样你只更新角色。