从建模的角度来看,在这种情况下,我倾向于 APC 关于将“软删除”行移动到另一个表(例如日志表)并使用硬删除的评论。
另一种选择(未测试)是在引用约束中包含软删除列,例如:
CREATE TABLE dept (
dept_id number,
alive number,
constraint alive_ck check (alive in (0,1)),
constraint dept_pk primary key (dept_id, alive),
constraint dept_uk unique (dept_id)
);
CREATE TABLE emp (
emp_id number,
dept_id number,
alive number,
constraint emp_pk primary key (emp_id),
constraint emp_dept_fk
foreign key (dept_id, alive)
references dept (dept_id, alive)
);
请注意,dept 表在 dept_id 上是唯一的,但在 (dept_id, alive) 上也有一个约束,以允许来自 emp 的引用约束。
这意味着您的应用程序现在需要在软删除一个部门时同时更新所有 emp 行 - 如果您不对其进行编码,则约束有效地确保该部门不能被软删除,除非 emp 是第一个已删除(或软删除 - 尽管您必须使约束延迟才能起作用)。