数据库设计树形结构的技巧
前言
当业务中遇到树形结构时,比如菜单,省市区,部门等时如何设计数据库。一种设计可以通过每个字段带有parent id 来递归获取所有的节点 ,也可以通过另一种方法来获取某个节点的子节点
使用level记录当前节点的父节点code
添加一个辅助的varchar字段level,字段的逻辑是多个部门的id使用.来连接,假设首层使用0表示,每一个层级使用上一层的level拼接上.再拼接父级部门id来表示
id | level | parent |
---|---|---|
1 | 0- | 0 |
2 | 0-1- | 1 |
3 | 0-1-2- | 2 |
当查询id为2 的子节点时
select l.* from (select level from table
where id = 2 )as le,
table l
where l.`level` like concat(le.level,'%')
使用union包括该节点
下面这种不行,因为如果查某个根节点(0-)则会查出所有根节点,如果有company id 也可
select id, level from res_location where level like concat((select level from res_location where id = 233),'%')
小结 :
- 小问题1 level是否会重复(不加id,只通过level查)
- 小问题2 0-1-11 和0-1-111 如果通过0-1-11%也会把后者查出来,所以level后面再加个-符