Sql server 可选外键-这是一个好的解决方案吗?
我有一个DB,在表单中有几个权限表: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个外
UserId, Object Id, lot of bit fields
我已将用户组添加到数据库中,我需要更新权限才能使用用户和用户组。我认为有两种方法
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