摘要:需求数据表如下表表需求是得到以下结构的数据测试部门方法一循环查询查询用户列表循环用户列表查询对应的部门信息该方法查询次数为次查询列表,次查询部门,性能最低,不可取。
需求
数据表如下:
department表
|id|name|
user表
|id|name|department_id|
需求是得到以下结构的数据:
[ { "id":1, "name":"test", "department_id":1, "department":{ "id":1, "name":"测试部门" } } ]方法一:循环查询
查询用户列表
循环用户列表查询对应的部门信息
$users = $db->query("SELECT * FROM `user`"); foreach($users as &$user) { $users["department"] = $db->query("SELECT * FROM `department` WHERE `id` = ".$user["department_id"]); }
该方法查询次数为:1+N(1次查询列表,N次查询部门),性能最低,不可取。
方法二:连表通过连表查询用户和部门数据
处理返回数据
$users = $db->query("SELECT * FROM `user` INNER JOIN `department` ON `department`.`id` = `user`.`department_id`"); // 手动处理返回结果为需求结构
该方法其实也有局限性,如果 user 和 department 不在同一个服务器是不可以连表的。
方法三:1+1查询该方法先查询1次用户列表
取出列表中的部门ID组成数组
查询步骤2中的部门
合并最终数据
代码大致如下:
$users = $db->query("SELECT * FROM `user`"); $departmentIds =[ ]; foreach($users as $user) { if(!in_array($user["department_id"], $departmentIds)) { $departmentIds[] = $user["department_id"]; } } $departments = $db->query("SELECT * FROM `department` WHERE id in (".join(",",$department_id).")"); $map = []; // [部门ID => 部门item] foreach($departments as $department) { $map[$department["id"]] = $department; } foreach($users as $user) { $user["department"] = $map[$user["department_id"]] ?? null; }
该方法对两个表没有限制,在目前微服务盛行的情况下是比较好的一种做法。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/31750.html
摘要:方案二布隆过滤器拦截布隆过滤器介绍概念布隆过滤器英语是年由布隆提出的。这就是布隆过滤器的基本思想。防缓存穿透的布隆过滤器判断是否为合法非法则不允许继续查库从缓存中获取数据缓存为空从数据库中获取缓存空对象参考书籍开发与运维 上周在工作中遇到了一个问题场景,即查询商品的配件信息时(商品:配件为1:N的关系),如若商品并未配置配件信息,则查数据库为空,且不会加入缓存,这就会导致,下次在查询同...
阅读 3298·2021-09-30 09:54
阅读 3776·2021-09-22 15:01
阅读 3102·2021-08-27 16:19
阅读 2568·2019-08-29 18:39
阅读 2139·2019-08-29 14:09
阅读 620·2019-08-26 10:23
阅读 1332·2019-08-23 12:01
阅读 1859·2019-08-22 13:57