随记
-
有关类似订单,用户关联数据删除,例如删除订单时,将所属的商品删除;或者是删除用户时,将用户发布过的话题和回复删除。从实现的机制来看,可以有分以下两种类型:
- 代码监听器 —— 利用 Eloquent 监控器 的 deleted 事件连带删除,好处是灵活、扩展性强,不受底层数据库约束,坏处当删除时不添加监听器,就会出现漏删;
- 外键约束 —— 利用 MySQL 自带的外键约束功能,好处是数据一致性强,基本上不会出现漏删,坏处是有些数据库不支持,如 SQLite。
如果使用的是 MySQL 或者其分支,我们一般会选择『外键约束』的方式来实现。当然,除非业务上有特殊的逻辑,就会优先考虑代码监听器的灵活性。
-
有关处理响应数据结构与嵌套关系时,使用 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 一致,用法也基本相同。
- ......
参考链接:
Does Foreign Key improve query performance?
Why use Foreign Key constraints in MySQL?
本作品采用《CC 协议》,转载必须注明作者和本文链接
不是说少用『外键约束』吗 影响数据库性能 删除的业务逻辑在代码里实现会不会好点
@安小游 用户量大,并发高的大项目,确实不能因为外键约束的数据一致性强的优点,而忽略其所带来的性能瓶颈。