我有3个表:组,规则,操作
我可以在(1组,1条规则),(1组,1个动作)或(1组,1条规则,1个动作)之间建立关系
我想我可以创建一个链接表group_rule_action,并将其中一个FK设置为NULL,如果它只是两个项目之间的关系
例如,我在组1和规则A之间有关系,我有(1,A,NULL)
问题是如果我为这个组/规则创建一个动作,我必须更新这个与(1,A,ACTION1)的关系...但是如果我添加一个新的后来的行动,我需要插入(1,A,ACTION2),所以它不是很一致
我还可以在Actions和Rules上设置groupId FK,但是当我将动作链接到规则时,我需要确保它们具有相同的groupId(并且我最终会有冗余信息)
有更好的想法吗?
答案 0 :(得分:0)
正如你所说,
我还可以在动作和规则上设置groupId FK ...
我认为这意味着组和规则以及组和操作相关为“一对多”:一个组可以有许多规则/操作,一个规则/操作只能属于一个组。如果是这样,那么请使用groupId
列来表示这些关系。
现在要建立规则和操作之间的多对多关系,并且限制规则和相关操作必须属于同一个组,您将 引入一些冗余 - 具体而言,复制两个实体所属的组的信息。
鉴于此,第三个表RulesActions
可以这样定义:
RuleID
ActionID
GroupID
FOREIGN KEY (RuleID, GroupID)
FOREIGN KEY (ActionID, GroupID)
GroupID
列是冗余位:显然,可以通过查找相应的表来确定RuleID
或ActionID
的组。但是,正如您所看到的,单个GroupID
列用作两者的组引用,从而确保这两个项具有相同的组。并且为了确保组ID确实是规则和操作所属的组(而不仅仅是任意组),该列包含在两个外键中,即RulesActions
表引用{{1 } Rules
代替(RuleID, GroupID)
,而RuleID
则相同。
当然,给定这样的FK定义,需要以相同的方式定义目标表中的相应主键或唯一约束。我说主键或唯一约束 ,因为在我使用的产品SQL Server中,允许外键引用定义为主键或应用的列一个独特的约束。因此,在SQL Server中,我可以像这样定义Actions
和Rules
表:
Actions
:
Rules
RuleID PRIMARY KEY
GroupID FOREIGN KEY
UNIQUE (RuleID, GroupID)
:
Actions
这将允许我拥有之前指定的ActionID PRIMARY KEY
GroupID FOREIGN KEY
UNIQUE (RuleID, GroupID)
架构。我不确定是否有许多其他产品会允许这样做,如果没有,你可以尝试以下方法:
RulesActions
:
Rules
RuleID UNIQUE
GroupID FOREIGN KEY
PRIMARY KEY (RuleID, GroupID)
:
Actions
这样,UNIQUE约束仅应用于(实体)ID列,以确保ID的唯一性,并将ActionID UNIQUE
GroupID FOREIGN KEY
PRIMARY KEY (RuleID, GroupID)
中外键的目标列集定义为主键,以便您具有共同的FK< - > PK关系。
请注意,如果事实证明您需要多对多的群组/规则和/或群组/操作关系,那么这个想法本身就会发生很小变化。对于多对多关系,您需要引入一个映射表,其中RulesActions
将是主键,相应的外键需要引用那个表而不是主要实体之一。