多对多的关系违约到#34;所有"

时间:2017-12-11 16:34:38

标签: mysql database database-design

我必须使用表A和B.我还有一个关联表A_B,它存储表A和B之间的关系。在表A中,有一些记录要与表B中的所有记录相关(即使是记录,可以在将来添加)。

我们说我有A1,A2,A3和B1,B2和B3。

我希望A1与B1和B3相关

A2与B1和B2有关

A3与所有Bs相关

然后A_B表格如下:

A1, B1
A1, B3
A2, B1
A2, B2
A3, B1
A3, B2
A3, B3

如果我添加B4,我需要在A_B表中添加一条新记录以将其与A3相关联。我怎样才能定义" A3与所有Bs相关"不需要A_B表?我在考虑在A中添加一个标志(一个布尔值is_related_to_all),但我觉得它看起来不对(我最终可能有数百个is_related_to_all = false)

有没有办法使用关系来做到这一点?

修改

添加更多上下文:

表A 存储合作伙伴,表B 存储网站。有些合作伙伴与特定网站有关,有些合作伙伴与所有网站相关(有些合作伙伴可能与任何网站无关)。

4 个答案:

答案 0 :(得分:0)

如果添加布尔值,它将不再是传统的多个:多个映射表。可能"将不再有效。

但你当然可以为它编码 - 但是,你需要特殊的代码la:

FOREIGN KEYs

这可能会变为if flag is set, do ... else do ... 两个UNION。或者它可能变成别的东西。 (如果不理解这个映射表的使用,我无法预测。)

与此同时,那些与 no 网站相关的合作伙伴可能完全可以通过而不是来处理。 (这可能需要第3个if / then和/或SELECTs。)

答案 1 :(得分:0)

您可以考虑表B上的触发器:

DELIMITER ;;

CREATE TRIGGER relate_all_b_to_a3
    AFTER INSERT ON B
    FOR EACH ROW
BEGIN
    INSERT INTO (A_B)
    VALUES ('A3', NEW.B)
    ON DUPLICATE KEY UPDATE B=B;
END;;

DELIMITER ;

答案 2 :(得分:0)

好吧,如果这个想法太奇怪了 - 别介意 - 但你可以反过来推动它。你可以拥有一个A_HASNOT_B(一个更聪明的名字会更好)表。这样,B中的新记录将始终分配给A中的所有记录。在存储关系之前,您只需要反转基于UX的用户选择。

因此,在您的方案中,会有以下记录:

A  | B
=======
A1 | B2
---+---
A2 | B3

根据您的场景/用例,这可能是优雅的,也可能是完全愚蠢的。如果你最终只有几个关系,这是一个糟糕的解决方案,在这种情况下,我会去reaanbs解决方案(触发器)。如果您认为类型a的大多数记录将被分配给类型b,那么它可以以非常简单的方式完成工作。

答案 3 :(得分:0)

我建议采用与其他解决方案不同的方法。从更抽象的角度来看问题,你有两个A的“子类”:那些与一个或多个B相关的(我们称之为A_relatable),而那些与所有B相关的(我们称之为A_related)。 所以我建议用五种关系代表你的情况:

A(attributes of A)
B(attributes of B)
A_relatable (only primary key of A as foreign key, also primary key)
A_related (only primary key of A as foreign key, also primary key)
A_B(foreign key of A_relatable, foreign key of B)

通过这种方式可以验证所有约束,并且您可以定义一些存储过程来简化数据管理。