如何更新Cosmos Document DB中存储的引用?

时间:2019-01-02 15:49:53

标签: spring-boot reference azure-cosmosdb updates

我对基于文档的数据库非常陌生,并且正在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);将其再次存储在数据库中,不会更新存储在用户中的该实体的引用。用户仍然包含具有两个权限的角色,而不是三个。

我是否必须手动更新所有参考,或者我缺少什么?

1 个答案:

答案 0 :(得分:1)

CosmosDB是一个非关系数据库。如果将其用作关系数据库,则必须手动执行所有级联更新,因为CosmosDB本身不知道您是从数据库中引用另一个文档。每个文档都是彼此不可知的。

根据此示例,您还会遇到数据完整性问题。您将权限既存储在角色对象中,又存储在用户对象中。相反,您应该做的是将权限存储在角色对象中,然后仅在用户对象中使用角色ID,然后根据角色ID查询权限。这样一来,您只需更新角色即可。