Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如何进行引用完整性?_Oracle_Relationships_Referential Integrity - Fatal编程技术网

Oracle 如何进行引用完整性?

Oracle 如何进行引用完整性?,oracle,relationships,referential-integrity,Oracle,Relationships,Referential Integrity,我有一个包含三个表的Oracle数据库: 表1:车辆 身份证 类型 项目 表2:Car 身份证 烙印 表3:Bus 身份证 公共汽车号码 表1: 如果车辆类型为Car,我希望列项存储Car表中的ID 如果车辆类型为总线,我希望列项存储来自总线表的ID 这会在链接带有外键约束的表时产生问题,因为例如,如果我在车辆表中选择了车辆ID,而该ID在总线表中不存在,Oracle将引发错误 实际上,我所做的是,我处理表时没有任何关系,但我面临着数据不一致的风险,以防表Bus或Car中的一行被

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

表1:
车辆

  • 身份证
  • 类型
  • 项目
表2:
Car

  • 身份证
  • 烙印
表3:
Bus

  • 身份证
  • 公共汽车号码
表1:

  • 如果车辆类型为
    Car
    ,我希望列
    存储
    Car
    表中的
    ID
  • 如果车辆类型为
    总线
    ,我希望列
    存储来自
    总线
    表的
    ID
这会在链接带有外键约束的表时产生问题,因为例如,如果我在车辆表中选择了车辆ID,而该ID在总线表中不存在,Oracle将引发错误

实际上,我所做的是,我处理表时没有任何关系,但我面临着数据不一致的风险,以防表BusCar中的一行被删除


有人有什么想法吗?

因为Oracle支持延迟外键,所以您可以强制“子”行的存在性和排他性。具体技术解释如下:

  • 链接帖子的第一部分没有使用显式类型鉴别器,但实现了排他性和存在性。实际上,“反向”FKs的空能力充当类型鉴别器
  • 链接文章的第二部分解释了即使不使用延迟外键,如何使用类型鉴别器实现排他性(但不存在)
不过,我不确定这是一个非常好的主意——在这种情况下,约束较少但更简单的模型通常被认为是合理的折衷方案:

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


显然,现在必须在应用程序级别进行更多的强制执行,但这是一种(罕见的)被认为是合理的情况,因为它很简单,并且有可能获得更好的性能—索引更少,因此,DBMS必须进行的索引维护更少,存储和缓存压力更小。

外键不能一次引用一个表,另一次引用另一个表。解决方案是在您的基本表上有
CarID
BusID
,每个都引用
Car
Bus
表,并确保在任何给定时间只有一个可以不是NULL。谢谢朋友,您的答案真的很完整。