我必须使用表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 存储网站。有些合作伙伴与特定网站有关,有些合作伙伴与所有网站相关(有些合作伙伴可能与任何网站无关)。
答案 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)
通过这种方式可以验证所有约束,并且您可以定义一些存储过程来简化数据管理。