数据库设计树形结构的技巧

前言

当业务中遇到树形结构时,比如菜单,省市区,部门等时如何设计数据库。一种设计可以通过每个字段带有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后面再加个-符

References

posted @ 2021-04-01 16:41  胖大星-  阅读(790)  评论(0编辑  收藏  举报