问题描述
我的前任使用由多个父表共享的一些“重载”子表构建我们的数据库,使用“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 (将#修改为@)