对于删除的级联操作,这种场景如何处理?
表结构:
商品表,商品关联表1,商品关联表2
程序员A写的删除代码,删除时从 商品表,商品关联表1,商品关联表2 中删除数据。
程序员B因为业务需要,加了一个 商品关联表3,但删除程序里没有删除商品关联表3的操作,他不知道A写了删除操作,也没有权力去修改程序员A写的删除代码。导致商品删除时,商品关联表3中冗余了数据,导致查询时不能搜到相关的商品而报错或者好一点的显示成了空。
请问,这种场景是谁的过错?
是程序员A应该设置一种机制来约束新加的表的删除?
或是程序员A在做好删除操作时,应该告知其他程序员要遵守删除规则?
还是程序员B应该在新加表时自发考虑到删除的级联操作?
感觉这里的约束始终找不到办法。
回答:
想要避免这种情况,不是应该遵守数据库规范--》实施参照完整性吗?新增的表3设置了商品表的外键,当在删除商品的时候,便不允许删除商品。
use demo;create table student(
id int,
name varchar(255),
sex tinyint,
age int,
primary key(id)
);
create table course(
c_id int,
name varchar(255),
s_id int,
constraint s_fk foreign key(s_id)
references student(id)
);
insert into student values(1,"aaa",1,10);
insert into course values(1,"bbb",1);
delete from student where id = 1;
直接删除商品会报错,除非先把引用删除。
回答:
1、使用事件系统,A 在删除时发布一个删除事件,其他的监听这个事件并进行相应操作。
2、数据库使用外键,自动删除。
回答:
如果新加了表,要考虑到这种场景,后开发的模块,连表的时候,加个商品表商品id不为空的条件,直接就把脏数据过滤,这样新的业务表在查询结果上,就和商品信息保持一致了,或者商品表作为主表,(推荐)这样都不会查到你的脏数据
最重要的问题,你加了表,别人为什么不知道?
回答:
我的思路是使用实现一个 Handler 提供回调的方式(个人不太喜欢用事件的方式);
如果 A 写的这个模块是一个主核心模块,可以定义一个钩子 interface,比如:
public interface ProductActionHandler { void onRemoveSuccess();
}
对于所有的这个接口的实现,在商品成功删除时调用相应的方法(借助 spring bean 很容易实现)。
以上是 对于删除的级联操作,这种场景如何处理? 的全部内容, 来源链接: utcz.com/p/944193.html