关于数据库删除数据的同时保持完整性的个人做法。
进了单位,要我从头写一个商城出来。
完成了初步的数据库表格设计之后,发现如下一个问题:
我的address表记录了用户的收货地址,而订单中采用aid指向address表的某行。
那么如果用户后期删除了这个aid对应的收货地址,或者修改了地址,会引发bug:早期订单对应的地址会改变或者无法找到。
一开始考虑用外键约束,但是外键约束只能达成这样的目标:
- 如果存在采用这个aid的订单,就拒绝删除aid
- 删除aid同时删除所有带这个aid的订单
这明显不符合常识和业务需求。
我想出的解决办法是:给address表加一个valid的int字段,长度为1(实际上就是boolean,记录这个地址有没有效),删除地址的时候不直接从数据库删除,而是将valid改为0。
修改地址的时候,也不直接改,而是创建一个新的地址,再把老的地址valid值改成0。
这样,如果订单采用了valid为0的address,也能够正常显示,但是用户在选择自己收货地址的时候是看不到这条“被删除”的地址的(WHERE valid =1)。
类似的业务需求也是这样,例如product也加一个valid字段,出现一个包含了已删除产品的订单时,能正常显示,但是这个产品不能被加入购物车和订单。
这样业务需求倒是实现了,但是service感觉会异常复杂……需要重新梳理。
幸好Mapper层不需要太多修改,把删除方法全去掉,再在某些条件里加上valid=1就行了。
关于数据库删除数据的同时保持完整性的个人做法。