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

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

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

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

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

有没有更优的解决办法?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案
  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年前

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