微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将可选的多对多关系添加到另一个多对多关系表中?

如何解决如何将可选的多对多关系添加到另一个多对多关系表中?

我定义了以下表格:

- Group
  - GroupID (pk - int)
  - ...

- Item
  - ItemID (pk - int)
  - ...

- Groups_Items
  - GroupID (pk - int)
  - ItemID (pk - int)

在GroupID上有一个FK链接到Group表,在ItemID上有一个FK链接到Item表。

我需要向Groups_Items表添加可选关系,即RuleSetId

- Groups_Items
  - GroupId (pk - int)
  - ItemId (pk - int)
  - RuleSetId (int - nullable)

规则集表定义如下:

- RuleSet
  - RuleSetId (int)
  - RuleId (int)

和Rule表定义如下:

- Rule
  - RuleId (int)
  - ...

当我尝试使用RuleSet表中的RuleSetId将FK添加到Groups_Items表中的RuleSetId时,这会给我一个错误消息,提示我不允许。

每个项目必须与一个组相关联,一个组可以有多个项目,但是我想提供一个选项,以允许通过RuleSet将一个或多个规则与一个项目相关联。请注意,我不想将规则集直接关联到项目本身,而是关联到与组关联的项目,因为该项目可能是相同的,但关联到不同的组,并且取决于该项目的组,可能适用不同的规则集属于。

我希望这是有道理的。

我正在努力使它起作用,因此我必须对它进行错误的设计,但是我不确定如何最好地解决这个问题。

更新-1

这是我要实现的目标图。请注意,我在此期间添加了RuleSet表,该表仅包含一个主键,即RuleSetId

enter image description here

尝试在GroupsItems表和RuleSet表之间添加关系时出现以下错误

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint 
"FK_GroupsItems.ERuleSet". The conflict occurred in database 
"MyDatabase",table "dbo.RuleSet",column 'RuleSetId'.

当我尝试在RuleSet表和RuleSetRules表之间添加关系时遇到以下错误

Unable to create relationship 'FK_RuleSetsRules.RuleSet'.
The ALTER TABLE statement conflicted with the FOREIGN KEY constraint 
"FK_RuleSetsRules.RuleSet". The conflict occurred in database "MyDatabase",column 'RuleSetId.

解决方法

更新:请注意,在此答案中,我更改了“规则集”表的含义。在此答案中,“规则集”表创建每个规则集(但不创建规则)。 RulesetID是一个i​​nt和PK。然后,规则会在Ruleset_Rules中链接到该规则集。


我相信规则集表还需要具有外键引用的主键。我建议Ruleset和Rules还应该获得一个多对多表,以将它们链接起来(如果要重用规则),或者将RulesetID作为规则中的字段。这个例子有很多对很多:

function iroot(base,root) {
  if (typeof base !== 'bigint' || typeof root !== 'bigint') throw new Error("Arguments must be bigints.");

  let s = base + 1n;
  let k1 = root - 1n;
  let u = base;
  while (u < s) {
    s = u;
    u = ((u*k1) + base / (u ** k1)) / root;
  }
  return s;
}

这里是db<>fiddle,其中包含设置和示例插入。

更新:这是来自下面评论的updated DB<>fiddle。这具有更多的FK并解释了某些插入故意失败的情况。

请注意,这假设组/项目的每个组合都可以分配0或1个规则集。如果您需要多个规则集,那么在Grp_Item的多对多表中,它会变得有些复杂。

还请注意,我还没有创建所有FK,仅创建了与Grp_Item中当前问题相关的FK。

,

规则集表定义如下:

- RuleSet
  - RuleSetId (int)
  - RuleId (int)

和Rule表定义如下:

- Rule
  - RuleId (int)
  - ...

当我尝试使用RuleSet表中的RuleSetId将FK添加到 Groups_Items表中的RuleSetId,它给我一个错误 告诉我我不允许。

请注意,我不想将规则集直接关联到该项目 本身,但关联到组的项目可能是 相同但关联到不同的组和不同的一组 规则可能会根据项目所属的组而适用。

通过将RuleSetId添加到Groups_Items表中,可以在RuleSet和Items之间建立显式关联,这是您不想要的。当前,RuleSet表仅包含主键和RuleId,缺少GroupId。我认为您正在寻找这样的东西:

规则集表定义如下:

- RuleSet
  - RuleSetId (pk - int)
  - GroupID (fk - int)
  - RuleId (fk - int)

和Rule表定义如下:

- Rule
  - RuleId (pk - int)
  - ...

现在RuleSet表包含GroupId和RuleId之间的关系,因此没有理由将RuleSetId添加到Groups_Items表中。

,

最简单的方法是从头开始。使用编辑器创建DDL(模式)。

-- Rule RUL exists.
--
rule {RUL}
  PK {RUL}
-- Rule set RST exists.
--
rset {RST}
  PK {RST}
-- Rule RUL is member of rule set RST.
--
rule_rset {RST,RUL}
       PK {RST,RUL}

FK1 {RST} REFERENCES rset {RST}
FK2 {RUL} REFERENCES rule {RUL}
-- Item ITM exists.
--
item {ITM}
  PK {ITM}
-- Group GRP exists.
--
group {GRP}
   PK {GRP}
-- Item ITM is member of group GRP.
--
item_group {GRP,ITM}
        PK {GRP,ITM}

FK1 {ITM} REFERENCES item  {ITM}
FK2 {GRP} REFERENCES group {GRP}
-- Set of rules RST applies to item ITM in group GRP.
--
item_group_rset {GRP,ITM,RST}
             PK {GRP,ITM}

FK1 {GRP,ITM} REFERENCES item_group {GRP,ITM}

FK2 {RST} REFERENCES rset {RST}

注意:

All attributes (columns) NOT NULL

PK = Primary Key
FK = Foreign Key

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。