sql - 如何设计数据库以记录特定的查看和编辑权限(在 Laravel 中)?
问题描述
我正在使用 Laravel 框架,并希望拥有 3 个具有关系的数据库模型:
User M:N UserGroup
UserGroup 1:N GroupEntity
问题是 - 在范围内UserGroup
- 我希望有User
特定的权限来查看和编辑特定GroupEntity
的。
到目前为止我已经阅读和思考的内容:
1)
创建
user_entity_rights(
int id,
int group_id,
int user_id,
int entity_id,
boolean can_view,
boolean can_edit)
表,我会将每行的权限行列入白名单。我看到的问题是,这可能会导致大量所需的数据库行。
2)
在GroupEntity
表中,创建JSON 列,editable_by
并viewable_by
在其中存储用户 ID 数组。
这是一个更简单的解决方案,但由于 ID 不直接存储在数据库列中,因此可能存在巨大的性能问题。
请注意,我希望CRUD操作经常发生在权限上。
此外,无法通过某些静态角色来预测实际的数据库数据绑定或预先分组用户 - 在这些术语中,我希望这些关系是完全“随机的”。
所以我的问题:
- 标准 SQL 数据库甚至是存储此类数据绑定的正确位置吗?
- 如果是,那么这种数据库设计的最佳解决方案是什么?
- 是否有一些(第 3 方)实用程序可用于管理此类关系?该应用程序使用 Redis 来缓存一些东西 - 这有帮助吗?请注意,我当然希望数据能够持续重启/崩溃,而且我对 Redis 并不熟悉,无法判断它是否提供某种ACID事务......?
解决方案
您可以制作几个额外的查找表。IE:
EntityGroup_ViewableBy
和
EntityGroup_EditableBy
您的应用程序可以在给定用户的每个会话开始时点击一次,并将列表保存在内存中。即使您的用户拥有数百个实体组的权限,整数列表也不会占用太多内存。
这些表最终可能有很多行,但相对于其余数据而言,两列整数仍然很小,如果您在每个会话中为每个用户查询一次它们,对性能几乎没有影响。
即使您不喜欢这种方法,我也建议您避免将值集合存储在单个数据库字段中。在几乎任何现实世界的应用程序中,查找表都使每个级别(应用程序开发、数据库管理、数据库报告等)的管理和查询变得更加容易,您认为通过将一些分隔集合塞入一个单列,向我表明值的数量不会很大。省去一些麻烦,使用查找。
推荐阅读
- mysql - 如何在 MySQL/MariaDB 中添加一个生成的列,该列将根据其他列中的信息计算日期?
- angular - 带有复选框角度材料的动态数据树
- assembly - SSE4.1 无符号整数比较与溢出
- javascript - 有没有办法通过 JS 中的 RTC 发送变量?
- graphics - 将特定矩形上的交换链图像清除为特定颜色
- c# - C# 生成 JWT 令牌,其中应放置验证签名
- serilog - Serilog:如何不记录某些请求(或以不同级别记录)
- uart - 使用 gnuradio 解码 UART
- python - 从不同列中具有匹配值的行获取索引
- javascript - 是否有更多方法可以阻止cors?