boa*_*tor 8 python database authorization key-value nosql
我有一个访问大量JSON数据的Web应用程序.
我想使用键值数据库来存储Web应用程序的不同用户(不是数据库用户)拥有/共享的JSON数据.每个用户应该只能访问他们拥有或共享的记录.
在关系数据库中,我会Owner在记录表中添加一列,或者在单独的表中管理共享所有权,并在应用程序端检查访问权限(Python).对于关键价值商店,我想到了两种方法.
如果我使用密钥USERID_RECORDID然后编写代码来检查USERID访问记录之前怎么办?这是一个好主意吗?它不适用于用户之间共享的记录.
我可以USERIDs在值数据中存储一个或多个,并检查数据是否包含尝试访问记录的用户的ID.性能可能比将用户ID作为密钥的一部分要慢,但共享所有权是可能的.
您描述的两种解决方案都有一些局限性。
您自己指出,在密钥中包含所有者 ID 并不能解决共享数据的问题。但是,如果您添加另一个包含与该用户共享的内容的 ID 的键/值对,则此解决方案可能是可以接受的(key: userId:shared, value: [id1, id2, id3...])。
当且仅当您的应用程序需要进行查询以检索有权访问特定内容的用户列表时,您的第二个建议(其中包含被授予对给定内容的访问权限的用户列表)才可以。如果您需要列出给定用户可以访问的所有内容,这种设计将导致性能不佳,因为 K/V 存储必须扫描所有记录 - 而这种类型的数据库引擎通常不允许您创建优化此类请求的索引。
从更一般的角度来看,对于 NoSQL 数据库,尤其是键/值存储,必须根据应用程序提出的请求来定义模型。它可能会导致您重复一些信息。应用程序有责任维护数据的一致性。
例如,如果您需要获取给定用户的所有内容,无论该用户是内容的所有者还是与他共享这些内容,我建议您为该用户创建一个密钥,其中包含以下内容的内容 ID 列表正如我已经说过的那样,该用户。但是,如果您的应用程序还需要获取允许访问给定内容的用户列表,您应该将他们的 ID 添加到该内容的字段中。这会导致类似的结果:
key: contentID, value: { ..., [userId1, userID2...]}
当您删除用户对给定内容的访问权限时,您的应用程序(而不是数据存储区)必须从内容值中删除 userId,并从该用户的内容列表中删除 contentId。
这种设计可能意味着您的应用程序会发出多个请求:例如,一个请求用于获取允许访问给定内容的用户 ID 列表,一个或多个请求用于获取这些用户配置文件。然而,这实际上不应该成为问题,因为 K/V 存储通常具有非常高的性能。
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |