对于删除的级联操作,这种场景如何处理?

表结构:
商品表,商品关联表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

回到顶部