zoukankan      html  css  js  c++  java
  • 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%'



  • 相关阅读:
    nginx安装http2.0协议
    nginx内置变量 大全
    nginx全局查看进程
    Nginx1.14.2新增tcp/udp代理stream
    Nginx Location指令配置及常用全局变量
    Nginx配置udp/tcp代理
    ps -ef|grep详解
    centos7安装nginx(基础篇)
    js转义字符
    redis win连接以及配置连接密码
  • 原文地址:https://www.cnblogs.com/momogua/p/8304391.html
Copyright © 2011-2022 走看看