mysql 无限极分类, cte递归查询

首先, 我对数据库没有什么有效的了解
我想在mysql里实现一个分类表, 就像京东淘宝的商品分类, 可以实现无限极分类
需求是:

  • 能直接查询某个节点的所有子节点 (比如要查询某个大类下的所有商品)
  • 能查询两个节点间的路径 (要做面包屑导航)

那如何进行建表? 我进行了搜索
What are the options for storing hierarchical data in a relational database?
这个答案说了很多选择, 我选择了第一种Adjacency List, 即邻接表(其他的搞不懂, 都需要维护额外的字段或者表, 我希望表结构尽可能简单)

同时, 根据
MySQL 8.0 Labs: [Recursive] Common Table Expressions in MySQL (CTEs)
cte递归查询可以满足我的需求

所以我使用了 mysql8 和 cte 来做这件事情
表结构就只有 id, parent_id, name

目前表里有200多个分类, 估计最多不会超过一万条
但是我并不知道 cte 递归查询, 会不会有什么性能上的瓶颈 (对于数据量和请求量上来以后)
所以求建议, 我是维持现有的表结构用 cte 递归就好了, 还是需要修改表结构以便于更快速地读?

阅读 6.4k
2 个回答

递归查询,肯定不建议,特别是数据量大的时候。
那又想要查询时间越快越好,只能采取冗余数据方式。
分类的话。这个结构没必要改了
我举个例子假设有如下分类关系
id name pid
1 手机 0
2 iPhone 1
这时候 商品表可以如下两种设计方式
第一种 path冗余
category_path 1/2 这样比如你查手机大类 只要 Like 1% 就可以了
第二种 中间表关联
假设商品ID 是1
product_id category_id
1 1
1 2
上述两种方法皆可以满足你的需求!

建议使用 path 去保存全路径,递归比较慢,尽量不要使用啦(上面的 @Lowky 说的已经很清楚了)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题