如何设计数据库以记录特定的查看和编辑权限(在Laravel中)?

时间:2019-07-25 21:03:37

标签: sql sql-server laravel

我正在使用Laravel框架,并希望具有3种具有相关关系的数据库模型:

User M:N UserGroup
UserGroup 1:N GroupEntity

问题是-在UserGroup的范围内-我想拥有User特定的权利,以 view edit 特定的{ {1}}。

到目前为止,我已经阅读并思考了以下内容:

1)
创建 GroupEntity

表,我将在每行白名单中添加权限。 我看到的问题是,这可能会导致大量必需的数据库行。

2)
user_entity_rights( int id, int group_id, int user_id, int entity_id, boolean can_view, boolean can_edit)表中,创建GroupEntityeditable_by JSON列,并将用户ID数组存储在其中。
这是一个更简单的解决方案,尽管由于ID并不直接存储在数据库列中,所以性能可能会出现巨大问题。


请注意,我希望 CRUD 操作经常会在版权上发生。
另外,也无法通过某些静态角色来预测实际的数据库数据绑定或预分组用户-用这些术语,我希望这种关系是完全“随机的”。

所以我的问题:

  • 标准SQL数据库甚至是存储此类数据绑定的正确位置吗?
  • 如果是,那么这种数据库设计的最佳解决方案是什么?
  • 是否存在一些(第三方)实用程序来管理这种关系?该应用程序使用Redis缓存某些内容-可以帮助吗?请注意,我当然希望数据能够重新启动/崩溃持久化,而且我对Redis并不熟悉,只能判断它是否提供某种 ACID 事务...?

1 个答案:

答案 0 :(得分:1)

您可以另外创建几个查询表。即:

EntityGroup_ViewableBy

EntityGroup_EditableBy

您的应用可以在每个会话开始时为给定用户点击一次,并将列表保存在内存中。即使您的用户拥有数百个实体组的权限,整数列表也不会占用太多内存。

这些表最终可能有很多行,但是相对于其余数据而言,两列整数仍然会很小,并且如果每个会话每个用户查询一次它们对性能几乎没有影响。

即使您不喜欢这种方法,我也建议您避免在单个数据库字段中存储值的集合。在几乎任何现实世界中的应用程序中,查找表都使每个级别(应用程序开发,数据库管理,数据库报告等)的管理和查询都更加容易,您认为通过将一些定界的集合塞入一个表中可以节省数据库空间和性能。单列向我表明值的数量不会很大。节省一些头痛,使用查找。