有一个表结构比如:
```
项目:
项目ID
项目名
分类ID
...
```
```
还有一个多级分类结构:
分类1
+ 分类1.1
++ 分类1.1.1
+++ 分类1.1.1.1
+++ 分类1.1.1.2
+ 分类1.2
分类2
...
```
假定我现在有分类1的序号,现在想通过这个序号取出对应分类1及其子项中的所有项目的列表,请问有没有什么方便快捷的解决方案?最好能O(1)解决的。
目前想到的方法:
1、项目里新增一个字段(暂时称为“分类路径”),存储一个线性数据,用来储存分类的路径,数据比如:分类1[分隔符]分类1.1[分隔符]分类1.1.1。做查询的时候用LIKE从左开始匹配。
比如进到“分类1”的时候,搜索`分类路径` = "分类1[分隔符]*"。
进到“分类1.1”的时候,搜索`分类路径` = "分类1[分隔符]分类1.1[分隔符]*"。
但是LIKE这样算不算滥用什么的?+ 如果迁移到一个没有LIKE的数据库不就歇菜了么。
2、新建一个数据表,类似于:
```
项目分类路径们:
项目ID
隶属于分类
```
然后当写入项目的时候,爬出所选目标分类的路径树,比如
当一个项目被分配到“分类1.1.1.2”这个分类下,则依次写入记录:
```
项目ID:001
隶属于分类:分类1.1.1.2
项目ID:001
隶属于分类:分类1.1.1
项目ID:001
隶属于分类:分类1.1
项目ID:001
隶属于分类:分类1
```
相当于空间换时间了。但是这样的话:
1、如果未来这个项目要变更分类记录,就变得麻烦了,得删掉之前所有的记录,然后重新爬表(虽然可以优化掉一部分查询);
2、得维护一张分类的全表树形(或至少部分树)结构的缓存来让路径计算变得更快一些、并借此降低用来获得路径的数据库查询次数,这很显然增加了系统复杂度(因为需要处理比如缓存更新等等这样的情况)。
好吧各位。所以我想的两个方案都有缺点,你有啥办法呢?请分享下见解。谢谢。