我可以在一列上为多个表设置完整性约束吗?

时间:2015-05-26 17:01:20

标签: database oracle oracle11g

我有一个表,其中包含与设备关联的组件列表。

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_idcomp_a.comp_a_id之间设置完整性约束;和dev_comps.comp_idcomp_c.comp_c_id;等等。?

一般情况下,我不希望我的应用/用户能够在dev_comps中创建一个条目,我在相应的{{1}中找不到匹配的comp_id表格。

或者,有更好的方法吗?

修改

我得出的结论是,我在这里真正做的是列重载。我记得从我的旧简介到DB课程,通常被认为是一个糟糕的设计。有没有一个干净的方法呢?

1 个答案:

答案 0 :(得分:2)

不,您不能拥有引用两个可能的父表之一的外键约束。这类问题有两种常见方法:

  1. 您可以将所有comp_*表合并到一个表中,添加comp_type列。据推测,这意味着每行的许多属性都是NULL,因为每种类型的组件只有少量的可用属性。您可以添加约束,以确保相应的列集NULLNOT NULL取决于comp_type,但您将浪费一些空间。另一方面,存储NULL值,特别是在行的末尾,非常便宜。

  2. 您可以创建一个只包含master_componentcomp_id的{​​{1}}表格。各种comp_type表可以具有指向该表的外键(尽管您希望comp_*至少添加为虚拟列)。 comp_type可以指向dev_comps表。

  3. 当然,根据问题的具体情况,还有其他选择。如果存在大量具有许多不同属性的组件,那么组合表将生成具有数百列的master_component表,则使用{master_component表可能更有意义{1}}表将属性存储为行而不是列。但这更像是一个专门的案例,而不是我开始的事情。