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%'

 

SQL优化:从设计表结构开始(层次型表结构设计方法)_第1张图片


转载于:https://www.cnblogs.com/momogua/p/8304391.html

你可能感兴趣的:(SQL优化:从设计表结构开始(层次型表结构设计方法))