随记

  1. 有关类似订单,用户关联数据删除,例如删除订单时,将所属的商品删除;或者是删除用户时,将用户发布过的话题和回复删除。从实现的机制来看,可以有分以下两种类型:

    • 代码监听器 —— 利用 Eloquent 监控器 的 deleted 事件连带删除,好处是灵活、扩展性强,不受底层数据库约束,坏处当删除时不添加监听器,就会出现漏删;
    • 外键约束 —— 利用 MySQL 自带的外键约束功能,好处是数据一致性强,基本上不会出现漏删,坏处是有些数据库不支持,如 SQLite。

    如果使用的是 MySQL 或者其分支,我们一般会选择『外键约束』的方式来实现。当然,除非业务上有特殊的逻辑,就会优先考虑代码监听器的灵活性。

  2. 有关处理响应数据结构与嵌套关系时,使用 Fractal ,例如话题数据需要额外嵌套用户信息来展示页面详情,接口需要返回如下数据:

    {
    "id": 1,
    "title": "Voluptatem quas ut voluptatem quibusdam id.",
    "body": "Et et molestiae exercitationem est. Reiciendis sed accusamus delectus facilis eveniet doloremque. Deleniti dignissimos dolorem voluptas qui ea aut illo.",
    "user_id": 3,
    "user": {
        "id": 3,
        "name": "Shakira Reilly",
        "email": "jayce84@example.net",
        "avatar": "https://fsdhubcdn.phphub.org/uploads/images/201710/14/1/s5ehp11z6s.png?imageView2/1/w/200/h/200",
        "introduction": "Autem perspiciatis nihil minima impedit quidem et facere.",
        }
    }

    Fractal 是一个转换层(transformer),API 开发中非常方便的一种开发方法,可以帮助我们处理响应数据的结构与复杂的嵌套关系,最后将数据返回给客户端。可以把 Fractal 理解为 Web 开发中视图,控制着 API 的最终数据输出。Laravel 5.5 的新功能 eloquent-resources 整体思路跟 Fractal 一致,用法也基本相同。

  3. ......

参考链接:
Does Foreign Key improve query performance?
Why use Foreign Key constraints in MySQL?

本作品采用《CC 协议》,转载必须注明作者和本文链接
Wayne
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

不是说少用『外键约束』吗 影响数据库性能 删除的业务逻辑在代码里实现会不会好点

6年前 评论

@安小游 用户量大,并发高的大项目,确实不能因为外键约束的数据一致性强的优点,而忽略其所带来的性能瓶颈。

6年前 评论

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