随记

  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
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

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

6年前 评论

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

6年前 评论

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