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

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

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

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

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

有没有更优的解决办法?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案
  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年前

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