如何做出参照完整性?

时间:2014-01-27 11:34:31

标签: oracle relationships referential-integrity

我有一个包含三个表的Oracle数据库:

表1:Vehicle

  • ID
  • 类型
  • 项目

表2:Car

  • ID
  • 品牌

表3:Bus

  • ID
  • 公交车号码

在表1中:

  • 如果车辆类型为Car,我希望专栏Item存储来自ID表的Car;
  • 如果车辆类型为Bus,我希望专栏Item存储来自ID表的Bus;

使用外键约束链接表时会出现问题,因为例如,如果我选择车载ID 进入车辆表 > 总线表中不存在,Oracle将引发错误。

我实际上在做的是,我处理的表没有任何关系,但我面临数据不一致的风险,如果表格中的一行总线汽车已删除。

有人有想法吗?

1 个答案:

答案 0 :(得分:1)

由于Oracle支持延迟外键,因此您可以强制执行“子”行的存在和排他性。确切的技术解释如下:How to create multiple one to one's

  • 链接帖子的第一部分不使用显式类型鉴别器,但实现了排他性和存在性。实际上,“反向”FK的NULL能力充当类型鉴别器。
  • 链接帖子的第二部分解释了即使不使用延迟外键,如何使用类型鉴别器来实现排他性(但不存在)。

我不确定这是一个非常好的主意 - 在这种情况下,一个较少约束但更简单的模型通常被认为是合理的妥协:

enter image description here

根本没有类型鉴别器 - 通过检查子表中相应的行是否存在,您可以轻松确定父类型是否为给定类型。在没有同时获取特定类型数据的情况下检查类型是很少见的,因此这不太可能影响性能。

显然,现在必须在应用程序级别进行更多的强制执行,但这是(罕见的)由于简单性和更好的性能潜力而被认为合理的情况之一 - 索引较少,因此索引维护较少DBMS必须做更少的存储和缓存压力。