数据库设计之物理删除与逻辑删除
物理删除存在的问题:
1.历史数据关联不到删除的记录了。
假如A关联了B,如果物理删除了表记录B,那么A关联B的就会查询不到B的信息了。
比如之前查询A详情能查询到关联的B的数据,有一天B删除了,A再次查询详情查询不到关联的B的数据了。
2.级联删除存在问题。
假如需要级联删除,那么删除B就需要先关联A的所有记录,这样是不可行的。
比如删除商品,就需要删除所有关联此商品的订单。
======
思考及总结:
1.要么像hibernate那样,作为外键且被关联的有记录的,校验不让删除B。(感觉业务要判断好多表,也不知道哪个表关联了B。)(回到商品与订单的级联删除问题,这种方式不可取,我要删除某个商品,难不成必须得删除所有关联此商品的订单?)
2.要么B物理删除再加一个历史表。(几乎每个表都会多出一个历史记录表)
3.要么逻辑删除。(增加一个delete_flag标识)
======
逻辑删除存在的问题:
1.唯一索引。
2.数据表冗余删除的记录,导致查询缓慢。