我有一个表,其中包含与设备关联的组件列表。
dev_comps
=========
dev_id comp_type comp_id
------ --------- -------
1 A 1234
1 A 1237
1 A 1238
1 B 5678
1 C 1234
2 A 1235
(是的,我可以在设备上拥有每种组件的倍数,否则我只是将它们附加到设备表而不是连接表)
我还有几个组件类型的表(当然它们彼此之间都有一些不同的选项)。
comp_a
======
comp_a_id color style
--------- ----- -----
1234 red glass
1235 blue wood
comp_c
======
comp_c_id style length
--------- ----- ------
1234 glass 5
1235 wood 7
是否可以在dev_comps.comp_id
和comp_a.comp_a_id
之间设置完整性约束;和dev_comps.comp_id
和comp_c.comp_c_id
;等等。?
一般情况下,我不希望我的应用/用户能够在dev_comps
中创建一个条目,我在相应的{{1}中找不到匹配的comp_id
表格。
或者,有更好的方法吗?
修改
我得出的结论是,我在这里真正做的是列重载。我记得从我的旧简介到DB课程,通常被认为是一个糟糕的设计。有没有一个干净的方法呢?
答案 0 :(得分:2)
不,您不能拥有引用两个可能的父表之一的外键约束。这类问题有两种常见方法:
您可以将所有comp_*
表合并到一个表中,添加comp_type
列。据推测,这意味着每行的许多属性都是NULL,因为每种类型的组件只有少量的可用属性。您可以添加约束,以确保相应的列集NULL
或NOT NULL
取决于comp_type
,但您将浪费一些空间。另一方面,存储NULL
值,特别是在行的末尾,非常便宜。
您可以创建一个只包含master_component
和comp_id
的{{1}}表格。各种comp_type
表可以具有指向该表的外键(尽管您希望comp_*
至少添加为虚拟列)。 comp_type
可以指向dev_comps
表。
当然,根据问题的具体情况,还有其他选择。如果存在大量具有许多不同属性的组件,那么组合表将生成具有数百列的master_component
表,则使用{master_component
表可能更有意义{1}}表将属性存储为行而不是列。但这更像是一个专门的案例,而不是我开始的事情。