无限级分类(或菜单)的高性能实现思路

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

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)直接输出表示层级的前缀
并且连顺序都排好了,是不是很方便呢?

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

关键字:php, mysql, 高性能, 表设计

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部