Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在数据库中存储用户访问级别_C#_.net_Database_Database Design - Fatal编程技术网

C# 在数据库中存储用户访问级别

C# 在数据库中存储用户访问级别,c#,.net,database,database-design,C#,.net,Database,Database Design,我正在表中存储一个“用户”列表。应用程序的业务逻辑将引用一个对象,该对象包含当前登录用户在该表中的所有数据。并且,如果用户具有正确的访问权限,则能够允许用户执行操作 我想知道存储“访问级别”的最佳方式是什么 我认为存储访问级别的一种方法是将其作为一个整数,并使用C#“标志”组合多个访问级别,而不需要一组字段,这是否明智 Create = 1 Read = 2 Update = 4 Delete = 8 FullAcc = 16 我正在考虑的另一个选择,感觉不那么优雅,但我已经看到它

我正在表中存储一个“用户”列表。应用程序的业务逻辑将引用一个对象,该对象包含当前登录用户在该表中的所有数据。并且,如果用户具有正确的访问权限,则能够允许用户执行操作

我想知道存储“访问级别”的最佳方式是什么

我认为存储访问级别的一种方法是将其作为一个整数,并使用C#“标志”组合多个访问级别,而不需要一组字段,这是否明智

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 }