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

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

idparent_idtitle更多字段...
10衣物...
21上衣...
31裤子...
43西裤...
54长西裤...
64短西裤...
72衬衫...

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

这种设计比较常见 (就我所知),但缺点很明显。
例如需要显示例如下面这样的面包屑导航时:
衣物 > 裤子 > 西裤
就不得不进行多次循环

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

<select name="" id="">
    <option value="">衣物</option>
    <option value="">--> 裤子</option>
    <option value="">--> --> 西裤</option>
    <option value="">--> --> --> 长西裤</option>
    <option value="">--> --> --> 短西裤</option>
    <option value="">--> 上衣</option>
    <option value="">--> --> 衬衫</option>
</select>

也不得不进行多次循环

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

实现

首先,示例表设计:

idtitlepathlevel更多字段...
1衣物00...
2上衣0,11...
3裤子0,11...
4西裤0,1,32...
5长西裤0,1,3,43...
6短西裤0,1,3,43...
7衬衫0,1,22...

其中,path表示父级id列表。例如西裤0,1,3就表示衣物 > 裤子
实现面包屑时只要取出path字段的值,然后用,分割,得到id列表
再用where id in (1,3)即可

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

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

看到的结果是这样的:

idtitlepathlevelpaths
1衣物000,1
2上衣0,110,1,2
7衬衫0,1,220,1,2,7
3裤子0,110,1,3
4西裤0,1,320,1,3,4
5长西裤0,1,3,430,1,3,4,5
6短西裤0,1,3,430,1,3,4,6

那么,直接取出结果输出即可。level字段就是层级的意思
例如在PHP中,可以用str_repeat('--> ', $level)直接输出表示层级的前缀
并且连顺序都排好了,是不是很方便呢?

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值