怎样才能实现排序优化的层次关系表设计
数据层次的概念:
数据层次是表示数据的一种重要关系。在数据库的设计中,如组织结构分解、任务分解和行政区划分解都是层次关系数据的典型例子。
通常,表示层次关系的数据需要实现以下属性:
1.层次结构的级联级别数。如:中国->湖南省->长沙市->雨花区,也就是4楼。
2.它可以反映相同级别之间的顺序关系。比如长沙肯定在衡阳前面(因为是省会)。
3.您可以获得任何级别的父节点级别的子节点(子节点集)。
4.直接获取任何级别的数据。比如三线城市级别的数据。
5.构造层次关系表达式树很方便。
6.层次结构和排序方式的改变不影响其他数据的内部逻辑关系。
通常,有三种方法来表示分层数据:
1.建立多个数据库表:
例如,COUNTRY: ID(主键)COUNTRY_NAME
省:ID(主键)COUNTRY_ID(外键),省名
城市:ID(主键),省ID(外键),城市名称
这种方法简单,但设计不够灵活,数据处理比较麻烦。
2.采用表的自关联外键引用。
例如:DISTRICT_INFO: ID(主键),PARENT_ID,(外键)DISTRICT_INFO
通过引用外键(PARENT_ID)的主键(ID)建立层次关系。
优点:不限层次关系,扩展性强。对于Oracle数据库,只需通过start with,,,connect by-statement即可实现对数据的查询。
缺点:看不清楚层次关系,无法实现排序。
3.采用编码来实现层次结构。
区:ID、代码、名称,其中代码以上级代码对下级代码的前缀为特征。
优点:通过编码的内容很容易回到数据的层次关系。
缺点:使用Like方法或函数查询查找子集效率低,能够实现层次关系的层数有限(受代码的字段长度影响)。
优化方案:
设置2,3,用固定长度的方法设计表的编码级别。
地区:ID,代码,PARENT_ID,名称
其中ID是主键,CODE:被指定为4位数级别。性能数据如下:
Id,codeparent _ id,name
1 0001中国
2 00010001 1湖南
3 00010010001 2衡阳
4 00010010002 2 2长沙
5 00010001
从数据中可以看出,PARENT_ID可以直观的表达层次关系。
代码CODE可以直观地表达同一级别的层次关系和顺序关系。
如果长沙要排在衡阳前面,就要调整它的代码,外部引用关系不会受它影响,因为是用ID实现的。
获取节点的父节点:
Select * From DISTRICT Where ID =(Select PARENT _ ID From DISTRICT Where ID = 2)
获取节点的子节点列表:
select * From PARENT _ ID = 2的地区
获取所有子节点信息:
选择级别,*从d区开始,从PARENT_ID=2开始,通过d连接。PARENT _ ID = Prior t . ID
或-排序模式
Select * From DISTRICT d,其中d.CODE如“00010001%”按代码排序
获取某一级(n)的节点信息(实现排序,意思是级代码长度固定):
Select * From地区,其中长度(代码)=4*N,代码如“0001%”按代码排序......
0条评论