我正在开发一个应用程序,其中用户具有不同的权限来使用不同的功能(例如读取、创建、下载、打印、批准等)。权限列表预计不会经常更改。我有几个选项可以选择如何将这些权限存储在数据库中。
在什么情况下选项 2 会更好?
Option 1
使用关联表。
User
----
UserId (PK)
Name
Department
Permission
----
PermissionId (PK)
Name
User_Permission
----
UserId (FK)
PermissionId (FK)
Option 2
为每个用户存储一个位掩码。
User
----
UserId (PK)
Name
Department
Permissions
[Flags]
enum Permissions {
Read = 1,
Create = 2,
Download = 4,
Print = 8,
Approve = 16
}
很好的问题!
首先,让我们对“更好”做一些假设。
我假设您不太关心磁盘空间 - 从空间的角度来看,位掩码是有效的,但我不确定如果您使用 SQL Server,这是否重要。
我假设您确实关心速度。使用计算时,位掩码可以非常快 - 但在查询位掩码时您将无法使用索引。这应该不那么重要,但是如果您想知道哪些用户具有创建访问权限,您的查询将类似于
select * from user where permsission & CREATE = TRUE
(今天在路上无法访问 SQL Server)。由于数学运算,该查询将无法使用索引 - 因此如果您有大量用户,这将非常痛苦。
我假设您关心可维护性。从可维护性的角度来看,位掩码不如存储显式权限那样具有底层问题域的表达能力。您几乎肯定必须跨多个组件(包括数据库)同步位掩码标志的值。不是不可能,只是后背疼痛。
因此,除非有另一种评估“更好”的方法,否则我认为位掩码路由不如将权限存储在规范化的数据库结构中好。我不同意它会“变慢,因为你必须进行连接” - 除非你有一个完全功能失调的数据库,否则你将无法测量这一点(而没有活动索引的好处的查询可能会变得明显即使有几千条记录也会更慢)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)