如何建模2 OR 3项之间的关系?

时间:2013-09-11 04:12:00

标签: sql database database-design relational-database

我有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(并且我最终会有冗余信息)

有更好的想法吗?

1 个答案:

答案 0 :(得分:0)

正如你所说,

  

我还可以在动作和规则上设置groupId FK ...

我认为这意味着组和规则以及组和操作相关为“一对多”:一个组可以有许多规则/操作,一个规则/操作只能属于一个组。如果是这样,那么请使用groupId列来表示这些关系。

现在要建立规则和操作之间的多对多关系,并且限制规则和相关操作必须属于同一个组,您将 引入一些冗余 - 具体而言,复制两个实体所属的组的信息。

鉴于此,第三个表RulesActions可以这样定义:

RuleID
ActionID
GroupID
FOREIGN KEY (RuleID, GroupID)
FOREIGN KEY (ActionID, GroupID)

GroupID列是冗余位:显然,可以通过查找相应的表来确定RuleIDActionID的组。但是,正如您所看到的,单个GroupID列用作两者的组引用,从而确保这两个项具有相同的组。并且为了确保组ID确实是规则和操作所属的组(而不仅仅是任意组),该列包含在两个外键中,即RulesActions表引用{{1 } Rules代替(RuleID, GroupID),而RuleID则相同。

当然,给定这样的FK定义,需要以相同的方式定义目标表中的相应主键或唯一约束。我说主键或唯一约束 ,因为在我使用的产品SQL Server中,允许外键引用定义为主键或应用的列一个独特的约束。因此,在SQL Server中,我可以像这样定义ActionsRules表:

  • 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将是主键,相应的外键需要引用那个表而不是主要实体之一。