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

来源:互联网 发布:pkpm钢结构设计软件 编辑:程序博客网 时间:2024/06/05 23:59

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

--返回:001001001select cover_codefrom bank_orgwhere title = '营业二部-部长'select * from bank_orgwhere cover_code like '001001001%'



0 0
原创粉丝点击