构造一个SQL表以获得匹配,还是不返回结果更好

构造一个SQL表以获得匹配,还是不返回结果更好,sql,sql-server,optimization,Sql,Sql Server,Optimization,我有一个有趣的设计问题。我正在设计我们项目的安全方面,以允许我们以不同的成本拥有不同版本的程序,并且允许经理类型的用户向其他用户授予或拒绝访问程序部分的权限。它将基于web并托管在我们的服务器上 我对每个“资源”或屏幕使用一个简单的允许或拒绝选项 我们将拥有大量的资源,用户将能够建立许多不同的组来让用户控制访问。每个用户只能属于一个组 我想到了两种方法,并且很好奇哪种方法在性能方面更适合SQL server 选项A access表中的条目表示允许访问。这不需要数据库中的列来存储信息。如果没有返回

我有一个有趣的设计问题。我正在设计我们项目的安全方面,以允许我们以不同的成本拥有不同版本的程序,并且允许经理类型的用户向其他用户授予或拒绝访问程序部分的权限。它将基于web并托管在我们的服务器上

我对每个“资源”或屏幕使用一个简单的允许或拒绝选项

我们将拥有大量的资源,用户将能够建立许多不同的组来让用户控制访问。每个用户只能属于一个组

我想到了两种方法,并且很好奇哪种方法在性能方面更适合SQL server

选项A access表中的条目表示允许访问。这不需要数据库中的列来存储信息。如果没有返回结果,则拒绝访问

我认为这意味着一个较小的表,但是查询会搜索整个表以确定不存在匹配项吗

选项B 数据库中包含一个位列,用于控制允许/拒绝。这将意味着总是有一个结果要找到,并使一个更大的表


想法?

我会投票支持选项B。如果你选择选项A,并且假设用户存在,他们可以进入,那么你最终会遇到这样的问题:你想拒绝用户访问,而不删除用户记录


在很多情况下,你会想锁定一个用户,但又不想完全破坏他们的帐户。一个这样的例子(不一定与您的用例相关联)是当您未能支付时,他们会切断您的帐户,直到您再次开始支付。他们不想删除该记录,因为他们仍然希望在您再次付款时启用该记录,而不是从头开始重新创建帐户,并丢失所有用户历史记录。

我会投票支持选项B。如果您选择选项A,并且假设有用户存在,他们可以加入,然后,您最终会遇到这样一个问题:您希望拒绝对用户的访问,而不删除用户记录


在很多情况下,你会想锁定一个用户,但又不想完全破坏他们的帐户。一个这样的例子(不一定与您的用例相关联)是当您未能支付时,他们会切断您的帐户,直到您再次开始支付。他们不想删除记录,因为他们仍然希望在您再次付款时启用该记录,而不是从头开始重新创建帐户,并丢失所有用户历史记录。

B。它允许更好地检查数据是否完整(例如,当您添加允许/拒绝的功能时)


此外,对于您知道将包含许多记录的表(如,100000+),表大小应该只是一个考虑因素。您甚至需要花时间输入表大小来考虑这个问题,其成本已经超过了额外的硬盘空间。

B。它可以更好地检查数据是否完整(例如,当您添加允许/拒绝的功能时)


此外,对于您知道将包含许多记录的表(如,100000+),表大小应该只是一个考虑因素。您甚至需要花时间输入表大小来考虑这个问题,其成本已经超过了额外的硬盘空间。

如果只是允许/拒绝,那么在用户和资源之间建立一个简单的链接表就可以了。如果链接表中有一个键控用户资源的条目,请允许访问

UserResources
-------------
UserId FK->Users
ResourceId FK->Resources
sql应该是这样的

if exists (select 1 from UserResources 
where UserId = @uid and ResourceId=@rid)
set @allow=1;

使用聚集索引(UserId和ResourceId),即使有数百万条记录,查询速度也会非常快。

如果只使用允许/拒绝,那么用户和资源之间的简单链接表就可以了。如果链接表中有一个键控用户资源的条目,请允许访问

UserResources
-------------
UserId FK->Users
ResourceId FK->Resources
sql应该是这样的

if exists (select 1 from UserResources 
where UserId = @uid and ResourceId=@rid)
set @allow=1;

使用聚集索引(UserId和ResourceId),即使有数百万条记录,查询速度也会非常快。

方法a,但除了隐式deney之外,我还将包括显式拒绝。我会制作一些用例,以确保您的最终逻辑工作正常,但这里有一些示例

User1 is in group1 and group2.  
User2 is in group1  
User3 is in group2 


我相信你的方法users1是允许的。

方法A,但除了你的隐式deney之外,我还将包括一个显式拒绝。我会制作一些用例,以确保您的最终逻辑工作正常,但这里有一些示例

User1 is in group1 and group2.  
User2 is in group1  
User3 is in group2 


我相信您的方法users1是允许的。

用户表将与访问控制表分开,因此添加或删除访问权限不会影响用户的存在。此外,默认情况下,如果没有发现拒绝访问的结果,则不可能意外获得访问权限。users表将与access Control表分开,因此添加或删除访问权限不会影响用户的存在。另外,默认情况下,如果没有发现拒绝访问的结果,那么不可能意外获得访问权限。也许我应该提到,我对数据库的命中比对大小更感兴趣,我只是观察到了方法的不同。我将重新表述这个问题。也许我应该提到,我对数据库的点击率比对大小更感兴趣,我只是在观察方法上的差异。我将重新措辞这个问题。我忘了提到一个用户只能属于一个组。我忘了提到一个用户只能属于一个组。