层次关系数据库表的设计,无限层次(转)

数据层次的概念:

  数据层次是表达数据的一种重要关系,在数据库的设计中,如:组织结构分解、工作任务分解、行政区划的分解等都是层次关系数据的典型实例。

  表达层次关系的数据一般需要实现如下属性:

  1.层次的最大级联层次数。如:中国->湖南省->长沙市->雨花区,就是4层。

  2.能反映同一层次之间的顺序关系。如:长沙市 必须在 衡阳市的前面,(因为其是省会)。

  3.能获取任意层次的父节点级子节点(子节点集)。

  4.直接获取任意层次的数据。比如:第三层 市级别的数据。

  5.能方便构造层次关系表达树。

  6.层次结构及排序方式的改变不影响其其他数据的内部逻辑关系。

  一般有三种方式来表现层次关系的数据:

  1.建立多个数据库表:

  如: COUNTRY: ID(主键) COUNTRY_NAME

  PROVINCE: ID(主键) COUNTRY_ID(外键),PROVINCE_NAME

  CITY: ID(主键), PROVINCE_ID(外键),CITY_NAME

  此种方式比较简单,但设计的灵活性不够,数据处理起来比较麻烦。

  2.采用表的自关联外键引用

  如: DISTRICT_INFO: ID(主键),PARENT_ID,(外键)DISTRICT_INFO

  通过外键(PARENT_ID)的自身引用主键(ID)来确立层次关系。

  优点:无限级别的层次关系,扩充性强。对于Oracle数据库来说,能简单通过 Start With,,,Connect By--语句来实现数据的查询。

  缺点:不能明确看出层次关系,无法实现排序。

  3.采用编码方式来实现层次

  DISTRICT: ID,CODE,NAME 其中CODE的特点是上级编码是下级编码的前缀

  优点:通过编码的内容能够很容易回去数据的层次关系。

  缺点:使用Like方法或函数查询来实现子集的查找,效率较低,能实现层次关系的级数有限(受CODE的字段长度影响)。

  优化方案:

  集合2,3的优点,采用固定编码级次的长度的方法来设计表。

  DISTRICT:ID,CODE,PARENT_ID,NAME

  其中ID为主键,CODE:规定为4位一级。表现的数据如下:

ID CODE  PARENT_ID NAME
1 1   中国
2 10001 1            湖南
3 100010001 2 衡阳
4 100010002 2 长沙
5 0001000100020001 4 雨花

 从数据中可以看出,PARENT_ID可以直观表达层次的上下级关系

  而编码CODE可以直观表达层次关系与同一层次的顺序关系。

  如果要将长沙排在衡阳的前面,需要对调其编码即可,而外部的引用关系由于通过ID实现,不会受其影响。

  获取节点的父级别节点:

  Select * From DISTRICT Where ID=(Select PARENT_ID From DISTRICT Where ID=2)

  获取节点的子级别节点列表:

  Select * From DISTRICT Where PARENT_ID=2

  获取所有的子节点信息:

  Select level, * From DISTRICT d Start With PARENT_ID=2 Connect By d.PARENT_ID=Prior t.ID

  或 --排序模式

  Select * From DISTRICT d Where d.CODE Like ‘00010001%‘ Order By CODE

  获取某一层次(N)的节点信息(实现排序,层次码长度固定的意义):

  Select * From DISTRICT Where LENGTH(CODE)=4*N And CODE Like ‘0001%‘ Order By CODE......

原文: http://www.blogjava.net/jelver/articles/224432.html

时间: 2024-10-19 07:17:07

层次关系数据库表的设计,无限层次(转)的相关文章

树形结构的数据库表Schema设计-基于左右值编码

树形结构的数据库表Schema设计 程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门.栏目结构.商品分类等等,通常而言,这些树状结构需要借助于数据库完 成持久化.然而目前的各种基于关系的数据库,都是以二维表的形式记录存储数据信息,因此是不能直接将Tree存入DBMS,设计合适的Schema及其对 应的CRUD算法是实现关系型数据库中存储树形结构的关键. 理想中树形结构应该具备如下特征:数据存储冗余度小.直观性强:检索遍历过程简单高效:节点增删改查CRUD操作高效.无意

oracle表空间设计基本原则

1.系统数据与应用数据必须存储于不同的表空间. 2.按照应用划分数据,不同应用的数据应存储于不同的表空间. 3.表和索引分离,需存储在不同的表空间,以便分布到不同的数据文件和硬盘上,并分别进行不同的物理存储参数优化. 4.相对静态的表和频繁变动的表分开存放在不同的表空间,以便分别进行不同的物理参数优化. 5.为中间表单独设计表空间,可以不考虑备份. 6.采用临时表空间组技术,提高大批量数据处理效率. -----原链接:http://blog.itpub.net/31429550/viewspac

asp.net 微信企业号办公系统-表单设计-新建表单(属性设置)

点击表单设计工具栏上的 新建表单 按钮会弹出新表单属性设置框: 表单名称:新表单表名称. 数据连接:表单对应的数据库连接(此连接在 系统管理-->数据库连接 中维护). 数据表:表单对应的数据库表. 主键:数据库表的主键(主键只能是自增的int型,或uniqueidentifier(guid)类型). 标题字段:业务表中的哪个字段数据来作为待办任务的标题. 程序库分类:表单的分类,此分类在 数据字典 中维护. 任务标题:是否自动生成标题,如果是自动生成则会以 流程名称(发起者姓名) 的形式自动生

数据结构基础(18) --哈希表的设计与实现

哈希表 根据设定的哈希函数 H(key)和所选中的处理冲突的方法,将一组关键字映射到一个有限的.地址连续的地址集 (区间) 上,并以关键字在地址集中的"映像"作为相应记录在表中的存储位置,如此构造所得的查找表称之为"哈希表". 构造哈希函数的方法 1. 直接定址法(数组) 哈希函数为关键字的线性函数H(key) = key 或者 H(key) = a*key + b 此法仅适合于:地址集合的大小 == 关键字集合的大小 2. 数字分析法 假设关键字集合中的每个关键字

PHP,Yii部门表的设计

PHP语言中Yii框架中部门表的设计: 功能:可以添加总部门和子部门,总部门下面可以添加多个子部门,总部门和子部门都可以进行增删改查. 本来打算设计成多对多类型的数据库表,但是显得很麻烦,原来网上有很多部门表的例子,下面讲下Yii框架中部门表的设计: 1.首先是数据库中的Department部门表,如下: 1 id Department_name parent_id 2 1 总部门 null 3 2 生产部 1 4 3 设计部 1 5 4 质检部 2 6 5 车间部 2 7 6 美工部 3 8

Activiti 工作流表单设计及开发

一.前言 Activiti 5对表单的支持目前还是比较弱的,表现在对表单的开发还需要写Freemark模板,并且它的模板还需要跟class文件一起打包发布.这使得流程的表单设计必须由开发人员来开发处理.因而,开发一套易用性强的流程表单功能就显得很有必要. 二.需求 用户一般都希望能有如Microsoft的Office套件中的InfoPath那样,可以自己进行设计,并且能与工作流程绑在一起进行流转处理.如下所示: 表单中每个字段有固定的数据类型,并由不同的数据控件展示,如日期.数字.单选或多选.下

mysql数据库优化之表的设计和慢查询定位

一.数据库优化包含的方面 数据库优化是一种综合性的技术.并非通过某一种方式让数据库效率提高非常多.而是通过多方面的提高.从而使得数据库性能提高. 主要包含: 1.表的设计合理化(3范式) 2.给表加入合适的索引.怎样使用索引 3.分表技术(水平切割.垂直切割) 4.定时清除数据垃圾,定时碎片整理 5.多用存储过程和触发器 6.对mysql配置进行优化 7.读写分离 8.mysqlserver硬件升级. 二.数据库的设计 步骤: 1.收集信息:与该系统有关人员进行交流.充分了解数据库须要完毕的任务

asp.net 微信企业号办公系统-表单设计-保存与发布

表单的过程中可以随时保存,以便下次继续设计. 表单设计完成后即可点击发布按钮,发布表单,发布表单后即可在流程设计时选定该表单.

移动应用表单设计秘籍

一直想写一篇文章,关于移动应用表单设计的,可惜最近项目很忙,忙到没有时间打理博客.最近体验产品的时候,经常看到错误的的表单设计,要么信息混乱,要么步骤繁复.要么语言程序化,要么视觉焦点跳跃,要么校验顺序混乱,要么反馈不及时,如此种种的问题,让我很想认真的总结一下,思考一下,为移动应用的表单设计,提供一些个人力所能及的建议,希望更多地设计师能认真思考移动应用表单的特殊性,能最大限度的提升表单设计的体验,提升效率,提高满意度. 本文将从清晰的视觉纵线.信息的分组.极致的减法.利用选择代替输入.标签及