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

时间:2018-09-04 09:32:48

标签: sql sql-server database acid

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

  • 用户
  • 团队(用户组)
  • 角色

您想建立一些权限关系,无论如何都要具有数据库的灵活性,例如:

  • 用户X可以更改用户Y的权限
  • 用户X可以更改小组Y的权限
  • 用户X可以更改角色Y的权限
  • 团队X可以更改角色Y的权限
  • X队可以更改Y队的权限
  • 角色X可以更改团队Y的权限
  • 角色X可以更改角色Y的权限

在类似的情况下,我目前有一个具有以下架构的表:

  • SubjectType(用户|团队|角色)
  • SubjectId (整数-不是外键)
  • TargetType(用户|团队|角色)
  • TargetId (整数-不是外键)

这允许在一个地方指定所有关系,但是,由于没有指定的关系,因此存在问题:

  • 角色A配置为有权访问团队ID为X,Y,Z的团队
  • 删除了Y和Z团队,其他地方都没有错误
  • 查询角色A的目标时,仍返回团队ID Y和Z。

就目前而言,我可以看到两个选项,每个选项都涉及折衷方案(赞成= +,反对=-):

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

  • (+)保持一个表和单个查询的简单性 并在删除团队后手动删除团队权限条目
  • (-)将需要3个手动删除操作(用户|团队|角色)。虽然只有一个删除功能可以重复进行,但没有固定和快速的保证书

2。在自己的表中指定每个关系。

  • (+)ACID保证将防止条目变为孤立
  • (-)更大的表格详细程度,7-9个表格用于基本相同的事情
  • (-)更多查询,更多联接(特别是在使用类表继承的情况下)

我倾向于第二种选择,是在下面添加额外的复杂性并将其抽象为单个访问函数,并认为这值得进行额外的工作(涉及一些重写)。

但是,我想知道我是否错过了其他选择,或者是否有一些针对此问题的经验丰富的建议?

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

0 个答案:

没有答案