财务系统-控制数据被别的地方使用的时候不能删除

问题:如何控制某条数据被背的地方使用的时候不能删除这条数据!

例如地区表中有地区1,2,3条数据,用户收货地址表中有使用地区1这条数据,那么这条数据就不能被删除,除非先删除掉收货地址表中 引用地区1这条数据的数据。

个人想法:类似引用计数的方式

  1. 建立一张计数表:count 两个字段:[value,number]
    存储的值 (user_1,2) 表示user表中id为1的数据被使用两次
  2. 在对有 “引用别的表中数据的表” 进行 删除/修改/添加 的时候操作count中number的增减
  3. 只是说了一种思路,可以用redis啥的做也行

有没有更优的解决办法?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案
  1. 利用 MySQL 的外键约束也可以。
  2. 利用数据库的视图功能,可以聚合一些数据,并且保证数据源变化后,视图表保持一致。
3年前 评论
哓东 (楼主) 3年前
LiamHao (作者) 3年前
哓东 (楼主) 3年前
LiamHao (作者) 3年前
哓东 (楼主) 3年前
讨论数量: 4

这种是很常见的需求啊。 方法一:通过程序逻辑实现,每次删除前,先去查询另一个表有没有关联数据。 方法二:通过mysql外键关联绑定。

3年前 评论
哓东 (楼主) 3年前
  1. 利用 MySQL 的外键约束也可以。
  2. 利用数据库的视图功能,可以聚合一些数据,并且保证数据源变化后,视图表保持一致。
3年前 评论
哓东 (楼主) 3年前
LiamHao (作者) 3年前
哓东 (楼主) 3年前
LiamHao (作者) 3年前
哓东 (楼主) 3年前

最近在写的,给你参考

  //用户删除
public function remove(RetaineUser $retaineuser, File $file)
{
    //此处应该做一个判断,如果患者下有STL文件,则禁止删除 RetaineUser File做了数据关联
    if ($retaineuser->file()->count() > 0) {
        alert('删除失败,请先删除患者的STL文件', 'danger');
        return back();
    }$retaineuser->delete();
    alert('患者已经删除', 'danger');
    return back();
}
3年前 评论

引用计数这种在复杂逻辑系统中几乎就不可能准确维护,一旦出现任何意外,关联数据失败,整个系统分分钟崩溃啊,而数据库外键这种看似很美好,但是业务流程和数据库逻辑硬绑定在一起,除非你一次性做好了后面就不改了,频繁修改简直要死

其实这个问题本质应该是数据分层的问题,即遗留数据和当前有效数据不一致,那么你就要解决这个问题吧,为两者共存创建一个方案,而不是业务流程上修改它强行让两者一致,最好做法是在数据中加一个标记表示是否是有效数据,新增修改都只能用有效数据,遗留数据永远存在来解决数据关联问题,这种适用于像地区这种变更小但是关联很多的情况,另外像订单关联收货地址这种,则应该在下单时就为订单复制一份收货地址才对

3年前 评论
LiamHao 3年前
哓东 (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!