讨论数量:
可能需要确认一下需求,我从以下几点帮楼主分析下:
这点包括对读写效率要求,楼上提供的各种方案几乎都是基于关系型数据库的,除了递归方案以外,都是通过确保读效率降低写的方案。当然,如果楼主的业务场景对写入效率不敏感,自然用以上方案即可。
另外可以换个角度来分析楼主的需求,推荐关系既然是分上下级的,是否存在级数限制?如果存在级数限制且是个位数的话,完全可以通过快照所有上级ID的方式来存储和查询。
如果读写效率都敏感,且要达到真正的无限分级,我建议不如抛开关系型数据库的限制使用类似 Neo4j 这样的图数据库专门解决此类问题。
这种数据结构相当于多叉树,用『树查询』思路解决: 在原有表结构中增加一列 path,为路径,通过 like 单边查询实现查到所有级联下级。
id | 编号 | 名 | 路径 |
---|---|---|---|
1 | 1 | A | .1. |
2 | 2 | B | .1.2. |
3 | 3 | C | .1.2.3. |
4 | 4 | D | .1.2.4. |
5 | 5 | E | .1.2.4.5. |
6 | 6 | F | .1.2.3.6. |
7 | 7 | G | .1.2.3.6.7 |
查所有 C 的下级(含 C,要排除 C 再加条件 id != 3)
select * from table_name where path like ".1.2.3.%"
查所有 E 的上级,把『路径』split 一下就好了
推荐文章: