我一直将用户访问权限作为代码中的一组(位)并将其存储为几个大整数(取决于我需要多少个)。
这些权利包括:
- 允许查看客户记录
- 允许创建客户记录
- 允许编辑客户记录
- 允许删除客户记录
- 允许运行客户端报告
- 允许注册手机
- 允许查看仪表板
所以,它们不仅仅与数据库相关。
我发现我可以将其存储为 JSON 描述数组,但这可能会变得相当大(并且可能很慢)。我可以为每个描述使用 4 个字母的首字母缩写。
是否有第三种方法可以做到这一点,以尽量减少代码的冗长程度。
我一直将用户访问权限作为代码中的一组(位)并将其存储为几个大整数(取决于我需要多少个)。
这些权利包括:
所以,它们不仅仅与数据库相关。
我发现我可以将其存储为 JSON 描述数组,但这可能会变得相当大(并且可能很慢)。我可以为每个描述使用 4 个字母的首字母缩写。
是否有第三种方法可以做到这一点,以尽量减少代码的冗长程度。
基本上有两种不同的解决方案:
将每个用户的所有权限存储在一行中,或将权限存储在多行中。
单排
除了问题中概述的两种解决方案之外,还有几种不同的解决方案可供选择:
ALTER TABLE
这样做,这是不允许的)。SET
。 它具有与 1 相同的缺点,并且只能通过虚拟列添加索引。有多行
你可以有例如:
person
桌子permission_type
表格(其中有一type
varchar
列唯一地标识了应用程序的权限类型,还有一description
列用更方便人类理解的文字来描述它)person_has_permission_type
连接表。优点是索引很容易,您可以通过应用程序轻松添加新的权限类型。您最终可能会得到比其他解决方案更多的行,但这取决于具体情况。例如,也许大多数用户没有权限,或者只有一个权限。
所有上述解决方案的共同点在于,它比您的“存储在 bigint 中的位”解决方案更好,因为您只需查看数据库即可了解用户拥有哪些权限,即,您不需要应用程序代码来读取/解释权限。
也可以组合一些解决方案,例如,您可以从一开始就知道某些权限类型,您肯定需要将其定义为
person
表中的单独列,例如可能read_write_all boolean
(超级管理员)和read_all boolean
。然后将其与多行解决方案相结合,以便其余的权限类型可以由您的应用管理。