使用触发器在三个级别的表之间强制执行唯一性?

问题描述 投票:0回答:1

我有三层表,具有一对多关联。

角色可以有权利,权利也可以有属性。每个单独的属性都有 20 种属性类型之一。

(将来有可能添加一些额外的属性类型,但不会比当前的 20 个属性类型多太多。)

一项权利可以有 0 到多个属性,但每个属性类型最多可以有一个属性。 (通过对权利中属性的属性类型进行唯一键约束,可以轻松实施。)

一个角色可以有 0 到多个权利。但在其所有权利中,它不能拥有多个相同的属性类型。

我试图处理的情况是:

1)。如果新权利中属性的任何属性类型与角色现有权利中的任何属性类型冲突,则防止将新权利添加到角色。

2)。如果该权利由任何已经拥有具有冲突属性类型的权利的角色所拥有,则防止将属性添加到现有权利。

我猜触发器将是一种在三个级别上强制执行属性类型唯一性的方法 - 但有更好的替代方案吗?

这些表格都是相当静态的。一旦设置完毕,对其进行修改可能就不会频繁了。

我尝试过使用具有唯一 Ent-AttType 键的 Ent-Att-AttType 表,然后使用具有唯一 Role-AttType 键的 Role-Ent-Att-AttType 表。

我无法保持这些同步。还关心维护多个表中重复的 AttType 信息。

这让我相信我需要像触发器这样的东西来在表的三个级别上强制执行这些独特的关系。

sql-server database-design triggers unique-constraint
1个回答
0
投票

独特之处在于:

  • 权利_id
  • 属性类型_id

因此,您可以重新排列架构以在权利和属性之间创建一个表,其主键是这些列:

create table entitlement (
  id int,
  ...
)

create table attribute_type (
  id int,
  ...
)

create table attribute (
  id int,
  ...
)

create table entitlement_attribute_type (
  entitlement_id int references entitlement,
  attribute_type_id references attribute_type,
  attribute_id references attribute,
  primary key (entitlement_id, attribute_type_id)
)
© www.soinside.com 2019 - 2024. All rights reserved.