在业务中,经常会涉及到 数据本身是自关联的情况,比如,组织架构数据,每个人都会有一个上级,那么就是 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%'