资讯专栏INFORMATION COLUMN

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

aristark / 357人阅读

摘要:一般说到无限级分类菜单之类的东西,大家我的数据表设计一般是这样的更多字段衣物上衣裤子西裤长西裤短西裤衬衫其中,表示父分类的。

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

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31962.html

相关文章

  • 分层数据Hierarchical Data探索(1.递归)

    摘要:分层数据探索例如无限级分类多级菜单省份城市引言什么是分层数据类似于树形结构,除了根节点和叶子节点外,所有节点都有一个父节点和一个或多个子节点。接下来我会先通过一般方法和递归方法来实现无限极分类,然后再通过两种数据模型来谈一谈分层数据的处理。 分层数据Hierarchical Data探索(例如:无限级分类、多级菜单、省份城市) 引言 什么是分层数据? 类似于树形结构,除了根节点和叶子节...

    yzd 评论0 收藏0
  • JavaScript实现无限递归树

    摘要:需求最近遇到一个需求,平时被后台惯着直接返回了树形结构给到前端,前端对这种嵌套类型的数据如地区的级联或菜单的树形结构省掉了一层处理。当然,没用好就相当于一堆废铁,甚至将导致一些不可预料的结果。相比起递归,我更喜欢这种方法。 需求 最近遇到一个需求,平时被后台惯着直接返回了树形结构给到前端,前端对这种嵌套类型的数据(如地区的级联或菜单的树形结构)省掉了一层处理。换了个后台小哥哥返回了扁平...

    atinosun 评论0 收藏0
  • 在数据库中存储一棵树,实现无限分类

    摘要:第三条同样需要递归,因为通过一个分类,数据库中只存储了其直属父类,需要通过递归到顶级分类才能获取到它们之间的所有分类信息。 原文发表于我的博客: https://blog.kaciras.net/article/36 在一些系统中,对内容进行分类是必需的功能。比如电商就需要对商品做分类处理,以便于客户搜索;论坛也会分为很多板块;门户网站、也得对网站的内容做各种分类。 分类对于一个内容展...

    Airy 评论0 收藏0

发表评论

0条评论

aristark

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<