Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.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
Sql server 可选外键-这是一个好的解决方案吗?_Sql Server_Database Design_Foreign Keys - Fatal编程技术网

Sql server 可选外键-这是一个好的解决方案吗?

Sql server 可选外键-这是一个好的解决方案吗?,sql-server,database-design,foreign-keys,Sql Server,Database Design,Foreign Keys,我有一个DB,在表单中有几个权限表: UserId, Object Id, lot of bit fields 我已将用户组添加到数据库中,我需要更新权限才能使用用户和用户组。我认为有两种方法 创建每个权限表的副本,每个对象权限(用户和组权限)有2个表-在每个表中,我将有一个外键指向“权限所有者”表(在一个表中指向用户,在第二个表中指向用户组): 向每个权限表添加一个字段(GroupId),并使用其中一个字段(UserId或GroupId)标识它是组权限还是用户权限。所以我将有一个包含2个外

我有一个DB,在表单中有几个权限表:

UserId, Object Id, lot of bit fields
我已将用户组添加到数据库中,我需要更新权限才能使用用户和用户组。我认为有两种方法

  • 创建每个权限表的副本,每个对象权限(用户和组权限)有2个表-在每个表中,我将有一个外键指向“权限所有者”表(在一个表中指向用户,在第二个表中指向用户组):

  • 向每个权限表添加一个字段(GroupId),并使用其中一个字段(UserId或GroupId)标识它是组权限还是用户权限。所以我将有一个包含2个外键的表-到用户和用户组,但是对于每个记录,只有一个FK将被使用,另一个将为null。 表可能如下所示:

    UserId NULL, GroupId NULL, ObjectId NOT NULL, lot of bit fields
    
  • 你认为最好的解决方案是什么?两者的利弊是什么?还有其他更好的解决方案吗?

    编辑:我需要知道如何处理用户和组的外键,而不是位字段。

    我会做第三个选择,即将位字段更改为tinyint(int系列或varbinary中的任何内容都可以,但您可能只需要2-3个标志)并使用(无需转换)检查安全级别。这不会添加列或表

    我通常在同一资源需要多个访问控制组合时执行此操作。例如,我将有一个名为calendar_permissions的int列,并将以下值从最低有效位分配给最高有效位视图(1)、添加(2)、编辑(4)、删除(8)。因此,如果我想检查delete的权限,我会执行一个“intvalue和8=1”条件。(如果用户拥有所有权限,则该值应为15=8+4+2+1)

    在您的情况下,1将是用户权限,2将是组权限,并且可以选择3将是用户和组权限。如果您对应用程序执行这种位运算感到不舒服,您可以通过视图公开它

    因为您将2定义为组权限,所以检查“用户”权限的调用应该重新兼容,因为整数值1转换为true

    或者,您可以在这些字段上设置检查约束,以限制对应用程序有意义的值

    PRO:没有额外的列/表,与当前系统兼容


    缺点:不像人类可读的那样,有些人在按位操作方面有问题。您可能必须创建一个视图才能让任何人实际使用它。

    如果两个集合可以授予的权限类型始终相同,我可能会将其保留在同一个表中。但请确保添加检查约束:

    UserId int NULL,
    GroupId int NULL,
    constraint CK_CorrectFKs CHECK (
       (UserId is null and GroupId is not null) or
       (UserId is not null and GroupId is null)
    ),
    ObjectId int NOT NULL, lot of bit fields
    
    或者,您是否考虑将建模组视为用户—或者只是修改
    用户
    表以直接接受组,或者让组表(带有“仅组”列)引用
    用户
    表?这可能是一种更简单的方法(例如,取决于数据库的哪些其他部分只需要与用户一起工作)。然后,您的所有权限检查只能是“这是一个ID列表(其中一个是用户,另一个是组),请计算此用户的聚合权限”

    UserId int NULL,
    GroupId int NULL,
    constraint CK_CorrectFKs CHECK (
       (UserId is null and GroupId is not null) or
       (UserId is not null and GroupId is null)
    ),
    ObjectId int NOT NULL, lot of bit fields