gpt4 book ai didi

c# - 什么时候将标志存储为位掩码比使用关联表更好?

转载 作者:IT王子 更新时间:2023-10-29 03:40:36 25 4
gpt4 key购买 nike

我正在开发一个应用程序,其中用户拥有不同的权限来使用不同的功能(例如读取、创建、下载、打印、批准等)。权限列表预计不会经常更改。关于如何将这些权限存储在数据库中,我有几个选择。

在什么情况下选项 2 会更好?

选项1

使用关联表。

User----UserId (PK)NameDepartment
Permission----PermissionId (PK)Name
User_Permission----UserId (FK)PermissionId (FK)

Option 2

Store a bitmask for each user.

User----UserId (PK)NameDepartmentPermissions
[Flags]
enum Permissions {
Read = 1,
Create = 2,
Download = 4,
Print = 8,
Approve = 16
}

最佳答案

好问题!

首先,让我们对“更好”做一些假设。

我假设您不太关心磁盘空间 - 从空间的角度来看,位掩码是有效的,但如果您使用的是 SQL 服务器,我不确定这是否重要。

我假设您确实关心速度。使用计算时位掩码可以非常快 - 但在查询位掩码时您将无法使用索引。这应该无关紧要,但如果您想知道哪些用户具有创建访问权限,您的查询将类似于

select * from user where permsission & CREATE = TRUE

(今天还没有访问 SQL Server,在路上)。由于数学运算,该查询将无法使用索引 - 因此,如果您有大量用户,这将非常痛苦。

我假设您关心可维护性。从可维护性的角度来看,位掩码不像存储显式权限那样具有底层问题域的表现力。您几乎肯定必须跨多个组​​件(包括数据库)同步位掩码标志的值。不是不可能,而是背后疼。

因此,除非有另一种评估“更好”的方法,否则我会说位掩码路由不如将权限存储在规范化数据库结构中。我不同意它会“更慢,因为你必须做一个连接”——除非你有一个完全功能失调的数据库,否则你将无法衡量这一点(而没有事件索引的查询可能会变得明显即使有几千条记录也更慢)。

关于c# - 什么时候将标志存储为位掩码比使用关联表更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5708239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com