SQL优化:从设计表结构开始(层次型表结构设计方法)

在业务中,经常会涉及到 数据本身是自关联的情况,比如,组织架构数据,每个人都会有一个上级,那么就是 id,parent_id 这样的设计。

但是这么设计之后,如果我要查询某个人的所有下级,就要用递归查询来遍历,一个是查询sql比较复杂,另一个是对于数据量稍大点的,性能肯定不会好到那里去。


那要怎么设计层次型表的结构呢?

一个比较好的方法就是在表中增加一个字段 cover_code,数据如下:

create table BANK_ORG
(
org_id NUMERIC(10) primary key,
parent_id NUMERIC(10) foreign key references BANK_ORG(org_id),
title NVARCHAR(30),
cover_code varchar(50)
);

insert into BANK_ORG(org_id,parent_id,title,cover_code)
values(1,null,'行长','001'),
      (2,1,'专务','001001'),
      (3,1,'常务','001002'),
      (4,3,'营业一部-部长','001002001'),
      (5,2,'营业二部-部长','001001001'),
      (6,5,'营业二部-次长','001001001001'),
	  (7,6,'营业二部-课长','001001001001001'),
	  (8,7,'营业二部-主任','001001001001001001'),
	  (9,7, '营业二部-职员1','001001001001001002'),
	  (10,7,'营业二部-职员2','001001001001001003')

cover_code的编码规则(这里引用日剧 《半泽直树》中的东京中央银行的组织架构作为例子来说明):

1、行长是 001

2、往下的 专务、常务,就是 001001,001002,其中前面的001,就是上级 行长的编码001,然后这2个岗位可以按照org_id排序后编码成001、002,所以合在一起就是 001001,001002。

3、再往下也是一样的,营业一部,营业二部,就是001002001(他的上级是常务,常务的编码是001002,于是在加上001),001001001(他的上级是专务,专务的编码是001001,于是在加上001


比如,要查询营业二部下面的所有岗位,由于营业二部部长的编码是 001001001,所以这么查:

--返回:001001001
select cover_code
from bank_org
where title = '营业二部-部长'

select * from bank_org
where cover_code like '001001001%'



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值