关系数据库设计方案

时间:2012-10-17 12:02:18

标签: mysql sql database database-design erd

考虑我们有两个表如下:

products:       id, name
                  (PK = id)
product_group1: product_id
                  (PK = a1_id)
                  (FK = a1_id REFRENCES a1)
product_group2: product_id
                  (PK = a1_id)
                  (FK = a1_id REFRENCES a1)
product_group3: product_id
                  (PK = a1_id)
                  (FK = a1_id REFRENCES a1)

问题是,我想设计一个名为approved_products的表,它只接受group1和group2(而不是group3)的产品。

我该如何设计这样的表格? (我使用的是mysql BTW)

3 个答案:

答案 0 :(得分:1)

您想要的是“否定”外键约束,即拒绝此表中存在的产品ID。

然而,这是不可能的。你必须维护这样一个表 - 它只包含第1组和第2组的ID - 你自己;你可以使用触发器。之后,您将使用该表作为外键引用表。

答案 1 :(得分:1)

你应该设计你的表,好像那个“规则”不存在(因为,让我们面对它,它最终可以改变)

然后,您可以使用其他机制来实现此约束。如果要在数据库级别执行此操作,可以在表上使用before insert触发器,或者检查调用验证数据的函数的列。但为什么不在你的申请上做呢?对我来说这似乎是一个商业规则。

答案 2 :(得分:1)

如果不在触发器或应用程序级别插入某些逻辑,则无法使用当前设计解决此问题。 FOREIGN KEY s不能引用多个表(我理解你的设计每个产品组使用一个表,如果我错了请告诉我)。此外,它们不能包含任何条件逻辑,因此即使您有一个product_groups表,也无法创建仅允许该表中的G1和G2记录的FOREIGN KEY

为了使用标准的关系完整性约束来实现这一点,您需要一个名为approvable_products的附加表,其中包含第一组或第二组中的product_ids个产品。< / p>

相关问题