相信大家常常会碰到多级分类的场景,固定几级的分类还好搞,无限级分类就麻烦些了
最原始的无限级分类的做法是做一个分类表和一个叶子表,每一行表示一个分类,带parentId
但如果搜索一个比较上层的分类下的所有叶子表,那就要遍历所有中间分类,并使用IN或者UNION来连接结果,不仅低效,切容易造成溢出
我百度百度搜索一下Sql无限级分类还会有各种黑科技,包括写存储过程,缓存分类树,用非关系型数据库...
然而高效的无限级分类其实没那么难
每种分类加一个字段作为标识,假如用Long字段
那么就有8+8+8+8+8+8+8+8位 可以作为分类层级
第一个8位是最顶级,第二个是它的子分类...
例如
0表示电器
01 表示空调 03表示电视机
016表示变频空调 017表示定频空调 035表示智能电视机 036表示非智能电视机
那么我要搜索所有电器只要搜索 0<=x<1,搜索所有空调只要搜索01<=x<1....
看到这里有些老铁会奇怪,不是说无限级分类吗?long只有8位啊!
而有些老铁就机智地想到了字符串,数据库里的字符串是同样可以被B树索引的,而且是无限长的(好吧有限长,但那长度几乎用不完吧)
这种技巧经过测试,事实表明字符串索引的性能还是相当好的
当然,这种技巧大概有很多人想过了,我应该不是第一个,但突然有灵感,我还是记录下来,请各位大佬指教