博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
无限级分类(或菜单)的高性能实现思路
阅读量:6924 次
发布时间:2019-06-27

本文共 1054 字,大约阅读时间需要 3 分钟。

一般说到无限级分类、菜单之类的东西,大家 (我) 的数据表设计一般是这样的

id parent_id title 更多字段...
1 0 衣物 ...
2 1 上衣 ...
3 1 裤子 ...
4 3 西裤 ...
5 4 长西裤 ...
6 4 短西裤 ...
7 2 衬衫 ...

其中,parent_id表示父分类的id。由此可知,衣物分类下有上衣裤子两个二级分类;而裤子还有西裤这个三级分类……以此类推

这种设计比较常见 (就我所知),但缺点很明显。

例如需要显示例如下面这样的面包屑导航时:
衣物 > 裤子 > 西裤
就不得不进行多次循环

再例如,需要显示所有分类并表示层级时:

也不得不进行多次循环

那么,如何快速实现上述的常见功能呢?

实现

首先,示例表设计:

id title path level 更多字段...
1 衣物 0 0 ...
2 上衣 0,1 1 ...
3 裤子 0,1 1 ...
4 西裤 0,1,3 2 ...
5 长西裤 0,1,3,4 3 ...
6 短西裤 0,1,3,4 3 ...
7 衬衫 0,1,2 2 ...

其中,path表示父级id列表。例如西裤0,1,3就表示衣物 > 裤子

实现面包屑时只要取出path字段的值,然后用,分割,得到id列表
再用where id in (1,3)即可

需要显示所有分类并表示层级时,使用下面的SQL:

SELECT *,concat(path,',',id) AS paths FROM menu ORDER BY paths

看到的结果是这样的:

id title path level paths
1 衣物 0 0 0,1
2 上衣 0,1 1 0,1,2
7 衬衫 0,1,2 2 0,1,2,7
3 裤子 0,1 1 0,1,3
4 西裤 0,1,3 2 0,1,3,4
5 长西裤 0,1,3,4 3 0,1,3,4,5
6 短西裤 0,1,3,4 3 0,1,3,4,6

那么,直接取出结果输出即可。level字段就是层级的意思

例如在PHP中,可以用str_repeat('--> ', $level)直接输出表示层级的前缀
并且连顺序都排好了,是不是很方便呢?

本文首发于我的博客 ,如果喜欢请常来玩哦

转载地址:http://jjujl.baihongyu.com/

你可能感兴趣的文章
java死锁和避免死锁
查看>>
仲裁流程系统开发杂记
查看>>
消息中间件基础介绍
查看>>
PMP——折旧法
查看>>
增加ad属性
查看>>
bootstrap大图轮播手机端不能手指滑动解决办法
查看>>
DNS服务器*****(二)
查看>>
tomcat在conf/Catalina/localhost目录下配置项目路径
查看>>
网络设备在网络环境中的应用
查看>>
ICN:SDN后的下一个热潮
查看>>
图解linux下top命令的使用
查看>>
Linux远程管理工具screen
查看>>
利用Server2008影卷复制功能快速恢复误删文件
查看>>
Android学习—动态布局方法总结
查看>>
需求与暗需求
查看>>
那些好用的小工具——Database Browser
查看>>
如何使用Rebase以及bind来重定位和绑定dll
查看>>
Diff程序的原理
查看>>
测试粒度
查看>>
oral_quiz->#俩queue实现stack#
查看>>