spring-boot - 如何更新 Cosmos Document DB 中存储的引用?
问题描述
我对基于文档的数据库非常陌生,并且在我的 Springboot 应用程序中使用 Azure 中的 Cosmos Document DB。
我有一个这样的数据结构:
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 查询权限。这样你只更新角色。
推荐阅读
- java - 如何在 Restlet 的 ServerResource 方法中请求另一个 api 作为客户端
- php - PHP 2 class implements interface
- java - How to detect changes in MSSQL table in java?
- regex - Using regex or excel, how to convert a date into a decimal?
- cassandra - nodetool 垃圾收集实际上在做什么
- javascript - 如何禁用导航组件中的按钮
- android - FCM push notification depending on app state
- python - 在 Kedro Notebook 中设置参数
- windows - 找不到 CMAKE_INSTALL_PREFIX 文件夹
- cron - 如何使用 cron 和 mutt 来安排基本的电子邮件?