CosmosDB:用于在文档中存储关系和批量更新/删除性能的模式

时间:2019-02-24 15:53:11

标签: azure-cosmosdb

我正在寻找一种模式来为存储在CosmosDB中的结构化JSON文档建立安全性。一组用户组或单个用户可以访问一个文档,每个用户组每个文档都具有特定角色。该角色已映射到CRUD权限。我需要根据查询文档的权限过滤掉文档,并且正在考虑在文档中使用数组存储权限信息。

我的关注如下:

  • 删除权限的性能。更新数万个文档有什么影响?
  • 删除多个文档的权限时不支持任何事务。除了可以自己建立交易,还有哪些可用模式来避免丢失删除权限?

2 个答案:

答案 0 :(得分:0)

  

删除权限的性能。有什么影响   更新数万个文档?

根据您的描述,您需要经常更改文档的权限。但是,据我所知,到目前为止,cosmos db sql api不支持部分更新。(请参考我以前的案例:How do you update sub-document in cosmos db更新,因此因此,您需要在每次操作时都操作整个文档。这对您来说是一项昂贵的工作。

据我所知,我建议您使用关系数据库。将权限存储在特定的表中,并将其用作文档的外键。也许这更适合您。

答案 1 :(得分:0)

我来自CosmosDB工程团队。没有足够的细节来提供准确的答案,但请随时跟进。

  1. 删除权限的性能。更新数万个文档有什么影响?

替换量要比创建的重,尽管这在当今的RU中可能还没有体现出来。

  1. 在分区键的边界内支持事务。请参见https://docs.microsoft.com/en-us/azure/cosmos-db/how-to-write-stored-procedures-triggers-udfs#transactions,以了解有关使用存储过程实现交易的更多详细信息。

  2. 可使用哪些模式来避免丢失删除权限?

取决于是否期望对同一文档进行并发权限更新,权限的(重新)应用是幂等的。假设没有并发,并且x和x'是当前和新的权限集,则在发布更新失败的情况下,对所有文档重新应用(重新替换)x'应该不会起作用。

关于管理每个文档的权限集,我也有一个建议-您不是考虑将多个文档上的相同权限集复制,而是考虑将权限集分组到权限“组”中,为实际权限添加另一层间接寻址吗?您可以为每个“权限组”维护单独的文档,其中包含一组实际的用户组和/或属于权限的用户。希望这可以减少您对主要文档本身所做的更新,并且在许多情况下,您可以避免仅使用具有权限组详细信息的文档进行更新。