Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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/7/sql-server/26.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-ACID关系_Sql_Sql Server_Database_Acid - Fatal编程技术网

两个不同实体之间的SQL-ACID关系

两个不同实体之间的SQL-ACID关系,sql,sql-server,database,acid,Sql,Sql Server,Database,Acid,假设有一个系统,您有三个实体: 使用者 团队(用户组) 角色 并且您希望设置一些权限关系,不管怎样,数据库中都具有灵活性,例如: 用户X可以更改用户Y的权限 用户X可以更改团队Y的权限 用户X可以更改角色Y的权限 团队X可以更改角色Y的权限 团队X可以更改团队Y的权限 角色X可以更改团队Y的权限 角色X可以更改角色Y的权限 在类似的场景中,我当前有一个具有以下模式的表: SubjectType(用户|团队|角色) SubjectId(整数-非外键) 目标类型(用户|团队|角色) Tar

假设有一个系统,您有三个实体:

  • 使用者
  • 团队(用户组)
  • 角色
并且您希望设置一些权限关系,不管怎样,数据库中都具有灵活性,例如:

  • 用户X可以更改用户Y的权限
  • 用户X可以更改团队Y的权限
  • 用户X可以更改角色Y的权限
  • 团队X可以更改角色Y的权限
  • 团队X可以更改团队Y的权限
  • 角色X可以更改团队Y的权限
  • 角色X可以更改角色Y的权限
在类似的场景中,我当前有一个具有以下模式的表:

  • SubjectType(用户|团队|角色)
  • SubjectId(整数-非外键)
  • 目标类型(用户|团队|角色)
  • TargetId(整数-非外键)
这允许在一个位置指定所有关系,但是,由于没有指定的关系,因此存在以下问题:

  • 角色A配置为可以访问团队ID为X、Y、Z的团队
  • 团队Y和Z被删除,其他地方没有错误
  • 在查询角色A的目标时,仍然返回团队ID Y和Z
目前,我可以看到两种选择,每种选择都涉及妥协(赞成=+,反对=-):

1。将数据保留在一个位置,但在删除实体时删除孤立的权限关系。

  • (+)保持了一个表和单个查询的简单性 并在删除团队时手动删除团队权限条目
  • (-)将需要3次手动删除操作(用户|团队|角色)。虽然将有一个单一的删除功能,可以以可重复的方式进行,但没有硬性和快速的担保
2。在各自的表中指定每个关系。

  • (+)ACID保证将防止条目成为孤立项
  • (-)更详细的表格,基本上相同的东西有7-9个表格
  • (-)更多查询,更多联接(特别是使用类表继承时)
我有点倾向于第二种选择,考虑增加下面的额外复杂性,并将其抽象为单个访问函数,我认为这是值得额外工作的(包括一点重写)


然而,我想知道是否有一个不同的选择,我错过了,或者是否有一些强大的经验为基础的建议对这个问题


将SQL Server 2012与此设置一起使用,但我认为这是一个常见的SQL/数据库问题。

您可以对外部关系使用级联删除。因此,当主表被删除时,子表也被删除。不幸的是,subjectId和targetId只是整数而不是外键,以便一般存储(用户|团队|角色)“基于此问题的有经验的建议?”--您在征求意见吗?我建议您使用表的第二个选项,该选项具有可以利用外键关系的关系。