总结和思考-数据库如何表示层级,如何查询所有下级

我们在平时的工作中经常会碰到层级结构的情况,比如组织或部门架构,人员架构等,都存在层级关系,这时我们一般会定义一张表,就拿组织来说吧,我们会有张组织表,那么组织表中如何表示层级结构呢?

相信大家都有自己的想法和做法,我对我见到的做法做个回顾和思考。

1.如何表示

1.1 pid表示

很简单,就是表中记录父级编号,一般用parent_id表示,还会设置外键,表示强关联。这个父级编号可以是父级的id或父级的其它标识串。

1.1.1 垂直表示

意思是说通过一个parent_id,只能查到它的直属下一级,这种叫垂直表示

1.1.2 水平表示

和垂直表示的区别是,通过一个parent_id可以查询所有下级,这种方式也叫闭包表

查找uid为1205458624106193312的记录发现它的所有上级都罗列出来了。这就是闭包表的

特点 

1.2 标识串表示

可以规定一些标识串规则标识层级,比如第一层以001d开头,第二层在第一层的基础上追加第一层的长度,比如001d002e

1.3 id表示

可以规定id规则,第一层从1开始,下一级乘以2再相加,而且根据大概的数据量划定各层级id范围,再下一级成以3再相加,依次类推。比如第一层有10个,第二层有80个,设定第一层为1-10,第二层为第一层乘以10再相加。注意:选定扩倍因子时,当前级的直属下一级不能超过扩倍因子

第一层 1 2 3 4 5 6 7 8 9 10
1下面9个 
10 11 12 13 14 15 16 17 18 19 20
10/10 = 1
11/10 = 1 

2下面9个
21 
22
23
...
21/10=2

......

这种方式不太建议使用,一是产生冲突地概率比较大,局限性比较大,二是可能比较浪费id

2.如何查询所有下级

说到查询首先要确定是否包括本机,因为这一点有时候会造成困扰,确定是否包含本级后再写查询。

2.1 数据库递归查询

表里面通过pid表示父级,如果要查询一个节点的所有下级,可以通过定义函数完成查询

2.2 标识符like查询

2.3 闭包表一键查询

在1. 1.2已做说明

其实层级结构的表示有多种方式,为了适应业务需要,会逐渐演变稳定。我们当时就是标识符标识和pid标识,pid标识后面引进闭包表,查询更灵活了。希望在以后的工作中能有所应用。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值