微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

复杂参考Oracle 中的完整性:子节点有多个父节点,非键连接

如何解决复杂参考Oracle 中的完整性:子节点有多个父节点,非键连接

我的前任使用由多个父表共享的一些“重载”子表构建我们的数据库,使用“tabletype”列指定哪个父表是特定子记录的父表。此外,父母和孩子经常使用多个列连接,这些列不是键、复合键或以任何方式唯一。多个父记录可以通过这种方式与多个子记录相关联。通常,SELECT disTINCT 或 GROUP BY 用于消除结果、报告或表单中的重复项。显然,这就是我们的数据真正工作的方式,用户对此没有意见。我没有被强制改变这种结构。

一个例子中,子表有一个“tabletype”列,其中包含三个可能的值之一(目前没有强制执行它们的约束)。它有一个外键列与一个父表的 ID(称为 ParentA)相关。对于与其他两个父项相关的记录,此列是空白的。它有一个标识号(非唯一)列(我们称之为“IdentiNum”)和一个“BatchID”列,并使用这两列与其他两个父项中的任何一个连接。

如您所料,参照完整性并未强制执行,并且可能无法通过简单的 RI 触发器和约束来强制执行。我是一名 Access 程序员,刚接触 Oracle 和 PL/sql。我可以编写代码来使用 VBA 在 Access 界面中强制执行 RI。如果我们按照我们的计划,使用 APEX 或其他工具替换此界面,那将没有任何好处。我想要它所属的数据库中的 RI。

对于这个案例,我认为我需要以下内容

  • 对 tabletype 的约束,允许指定哪个表包含记录的父级的三个值之一。
  • 对孩子的 ForeignKey 列的约束,要求其值存在于 ParentA 的 ID 列中,除非它可能为 null。
  • ParentA 上的删除触发器,它级联删除子表中的相关记录,但仍允许子表的 ForeignKey 可为空。
  • 对孩子的 IdentiNum 和 BatchID 列的约束,要求值(一起)存在于 ParentB 或 ParentC 中,具体取决于 TableType 的值。
  • delete 在 ParentB 和 ParentC 上触发,它级联删除子表中的相关记录,关系由 IdentiNum、BatchID 和 TableType 确定。但是,当删除 ParentB 或 ParentC 记录时,该过程必须在删除所有相关子记录之前检查以确保没有其他父记录具有相同的 IdentiNum 和 BatchID 值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。