关于数据库删除数据的同时保持完整性的个人做法。

进了单位,要我从头写一个商城出来。
完成了初步的数据库表格设计之后,发现如下一个问题:

我的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就行了。

关于数据库删除数据的同时保持完整性的个人做法。

http://blog.mothership.top/posts/56e4dcec.html

作者

Mother Ship

发布于

2017-07-19

更新于

2023-02-13

许可协议

评论