服务端开发经常需要设计一个表来存储树结构(如字典数据),正常可能只需一个
parent_id
字段即可,但查询起来会很费劲,那么如何设计才能更简单高效了?
基本思路: 必须字段 parent_id
用来维护父子关系,扩展字段 depth
path
is_leaf
用来实现快速查询父子节点,状态字段 is_enable
is_fixed
用来控制显隐及是否允许删除
上表结构: 个人实际项目中设计使用的
上字段解释:
- parent_id:根节点默认为0,非根节点默认指向自己父节点的主键ID;
- business_id:可用于存储一些业务关联信息,后续可以根据此字段值查询;
- depth:在保存时维护,默认根节点值为 0,非根节点的值为父节点的 depth + 1;
- path:在保存时维护,默认根节点值为 0-,非根节点的值为父节点的 path + 父节点的主键ID + 字符串 -;
上查询思路:
- 查询某节点的所有子孙节点:通过
该节点的 path 值 + 该节点的主键ID + 字符串 -
like 一下即可 - 查询子孙节点中指定深度(层级)的节点:在上面条件中加上
depth = 指定深度值
即可 - 查询所有叶子节点:通过
is_leaf = 1
即可