C# 在数据库中存储用户访问级别
我正在表中存储一个“用户”列表。应用程序的业务逻辑将引用一个对象,该对象包含当前登录用户在该表中的所有数据。并且,如果用户具有正确的访问权限,则能够允许用户执行操作 我想知道存储“访问级别”的最佳方式是什么 我认为存储访问级别的一种方法是将其作为一个整数,并使用C#“标志”组合多个访问级别,而不需要一组字段,这是否明智C# 在数据库中存储用户访问级别,c#,.net,database,database-design,C#,.net,Database,Database Design,我正在表中存储一个“用户”列表。应用程序的业务逻辑将引用一个对象,该对象包含当前登录用户在该表中的所有数据。并且,如果用户具有正确的访问权限,则能够允许用户执行操作 我想知道存储“访问级别”的最佳方式是什么 我认为存储访问级别的一种方法是将其作为一个整数,并使用C#“标志”组合多个访问级别,而不需要一组字段,这是否明智 Create = 1 Read = 2 Update = 4 Delete = 8 FullAcc = 16 我正在考虑的另一个选择,感觉不那么优雅,但我已经看到它
Create = 1
Read = 2
Update = 4
Delete = 8
FullAcc = 16
我正在考虑的另一个选择,感觉不那么优雅,但我已经看到它做了很多:
Read/Write = 1
R/W + Delete= 2
Full Access = 3
我想知道的原因是,似乎在第二种方法中添加额外的项会更简单,但在某些情况下,维护它会让人感到痛苦。你的想法是什么?我会选择选项1,因为它为每种访问类型提供了单独的标志
我还建议您使用时间戳存储更改历史。我一直倾向于使用标志的第一种方法。危险在于,您获得的权限级别太多,必须不断扩展枚举并开始使用大量数字,因此可能必须将数据库中的数据类型更改为大整数。但是,对于类似权限的内容,选项的数量应该相当有限。我的一个建议是将FullAcc定义为创建、读取、更新和删除的总和,而不是作为一个单独的实体。这样,当用户尝试更新某些内容时,您就不必检查他们是否具有Update或FullAcc权限。我会选择enum路径。它的强类型,在db和代码之间的传输相当好(ints和enum转换良好),您可以使用FlagsAttribute组合安全权限,并且当涉及到版本控制问题时,enum非常灵活(只要您不删除或重命名以前定义的enum值)。您的“flags”思想更灵活,如果有必要,允许您使用任何权利组合。“FullAcc”项不应定义为枚举中的特定数字,但是-它应该是其他标志的组合或组合在一起(如下所示,略去一些): 我看到的唯一痛苦是,如果向枚举添加更多项,则必须修改FullAcc项,然后在db中标识FullAcc记录并更新标志值
enum Rights { Create, read, Update, FullAcc = Create | Read | Update }