精华内容
下载资源
问答
  • 层次模型所满足的两个条件: 有且只有一个结点没有双亲结点,这个结点称为根结点。 根节点以外的其他结点有且只有一个双亲结点 在层次模型中,每个结点表示一个记录类型,每个记录类型可包含若干个字段,记录类型...

    在格式化模型中,实体用记录表示,实体的属性对应记录的数据项(或字段)。

     

    层次模型所满足的两个条件:

    1. 有且只有一个结点没有双亲结点,这个结点称为根结点。
    2. 根节点以外的其他结点有且只有一个双亲结点

     

    在层次模型中,每个结点表示一个记录类型,每个记录类型可包含若干个字段,记录类型描述的是实体,字段描述的是实体的属性。

     

    层次数据模型的存储结构

    1. 邻接法:

    按照层次树前序穿越的顺序把所有记录值依次邻接存放,即通过物理空间的位置相邻来体现层次顺序。

    1. 链接法:

    用指针来反映数据之间的层次联系。

     

    层次模型的优点:

    1. 层次模型的数据结构比较简单清晰
    2. 层次数据库的查询效率高(因为层次模型中记录之间的联系用有向边表示,这种联系在DBMS中用指针来实现,当要存取某个结点的记录值,DBMS就沿着这一条路径很快找到该记录值,所以层次数据库的性能优于关系系数据库,不低于网状数据库)
    3. 层次数据模型提供了良好的完整性支持

     

    层次模型的缺点:

    1. 现实世界中很多联系是非层次性的,如结点之间具有多对多联系
    2. 一个结点具有多个双亲等,对插入删除操作的限制比较多,因此应用程序的编写比较复杂
    3. 查询子女结点必须通过双亲结点
    4. 由于结构严密,层次命令趋于程序化

     

    层次模型对具有一对多的层次联系的部门描述非常自然、直观,容易理解。这是层次数据库的突出优点。

    展开全文
  • 层次模型

    2020-07-22 16:05:27
    层次模型树形结构来表示各类实体以及实体间的联系。 层次模型的数据结构 在数据库中定义满足下面两个条件的基本层次联系的集合为层次模型。 有且只有一个节点没有双亲结点,这个节点称为根节点; 根以外的其他...

    层次模型

    层次模型是数据库系统中最早出现的数据模型,层次模型系统采用层次模型作为数据的组织形式。层次数据库系统的典型代表IMS是IBM公司1968年推出的第一个大型商用数据库管理系统。层次模型用树形结构来表示各类实体以及实体间的联系。

    层次模型的数据结构

    在数据库中定义满足下面两个条件的基本层次联系的集合为层次模型。

    1. 有且只有一个节点没有双亲结点,这个节点称为根节点;
    2. 根以外的其他节点有且只有一个双亲节点。

    在层次模型中,**每一个节点表示一个记录类型,记录类型之间的联系用节点之间的连线(有向边)表示,这种联系是父子之间的一对多的联系。**这就使得层次数据库系统只能处理一对多的实体联系。
    每个记录类型可包含若干个字段,这里记录类型描述的是实体,字段描述实体的属性。各个记录类型及其字段都必须命名。各个记录类型、同一记录类型中各个字段不能同名。每个记录类型可以定义一个排序字段,也称为码字段,如果定义该排序字段的值是唯一的,则它就能唯一地标识一个记录值。一个层次模型在理论上可以包含任意有限个记录类型和字段,但任何实际的系统都会因为存储容量或者实现复杂度而限制层次模型中包含的记录类型数和字段的个数。在这里插入图片描述
    从上图可以看出层次模型像一颗倒立的树,结点的双亲是唯一的。层次模型的一个基本的特点是,任何一个给定的记录值只能按其层次路径查看,没有一个子女记录值能够脱离双亲记录值而独立存在。

    层次模型的数据操纵与完整性约束

    层次模型的数据操纵主要有查询、插入、删除和更新。进行插入、删除、更新操作时要满足层次模型的完整性约束条件。在进行插入操作时,如果没有相应的双亲结点值就不能插入它的子女节点值。在进行删除操作的时候,如果删除双亲结点值,则相应的子女节点值也将被同时删除。

    层次模型的优缺点

    层次模型的优点主要有:

    1. 层次模型的数据结构比较简单清晰;
    2. 层次数据库的查询效率高。因为层次模型中记录之间的联系用有向边表示,这种联系在DBMS中常用指针来实现。因此这种联系也就是记录之间的存取路径。
    3. 层次数据模型提供了良好的完整性支持。

    层次模型的缺点主要有:

    1. 现实世界中很多联系是非层次性的,如节点之间具有多对多的联系,不适合用层次模型表示。
    2. 如果一个节点具有多个双亲结点等,用层次模型表示这类联系就很笨拙只能通过引入冗余数据(易产生不一致性)或者创建自然的数据结构(引入虚拟节点)来解决。
    3. 查询子女节点必须通过双亲结点。
    4. 由于结构严密,层次命令趋于程序化。
    展开全文
  • 1.2.5 层次模型

    千次阅读 2019-05-22 19:33:31
    层次模型树形结构来表示各类实体以及实体间的联系。 1.层次模型的数据结构 在数据库中定义满足下面两个条件的基本层次联系的集合为层次模型: (1)有且只有一个结点没有双亲结点,这个结点成为根节点; (2)...

    层次模型用树形结构来表示各类实体以及实体间的联系。

    1. 层次模型的数据结构

    在数据库中定义满足下面两个条件的基本层次联系的集合为层次模型:

    (1)有且只有一个结点没有双亲结点,这个结点成为根节点;

    (2)根以外的其他结点有且只有一个双亲结点

    2. 层次模型的数据操纵与完整性约束

    数据操纵主要有查询、插入、删除、更新。

    进行插入操作时,若没有相应地双亲节点值就不能插入它的子女节点值。

    进行删除操作时,若删除双亲结点值,则相应的子女节点值也将被同时删除。

    3. 层次模型的优缺点:

    优点:(1)层次模型的数据结构比较简单清晰。(2)层次数据库的查询效率高(3)层次数据模型提供了良好的完整性支持。

    缺点:(1)现实世界中很多联系是非层次性的,如结点之间具有多对多联系,不适合用层次模型。(2)如果一个结点具有多个双亲结点等,用层次模型表示这类联系就很笨拙(3)查

    询子女结点必须通过双亲结点(4)由于结构严密,层次命令趋于程序化。

    展开全文
  • 处理不确定深度的层级结构,比如组织机构,一个常用的设计是在一张表里面保存 ID 和 Parent_ID ,并且通过自联结的办法构造一颗。这种方式对写数据的过程很友好,但是查询过程就变得相对复杂。在不引入MPTT模型的...

    背景

    处理不确定深度的层级结构,比如组织机构,一个常用的设计是在一张表里面保存 ID 和 Parent_ID ,并且通过自联结的办法构造一颗树。这种方式对写数据的过程很友好,但是查询过程就变得相对复杂。在不引入MPTT模型的前提下,必须通过递归算法来查询某个节点和下级子节点。

    Oracle提供的connect by扩展语法,简单好用。但是其他的RDBMS就没这么人性化了(或者我不知道)。最近在项目中使用PostgreSQL来查询树形数据,记录一下。

    构造样本数据

    drop table if exists demo.tree_data;
    create table demo.tree_data (
        id integer,
        code text,
        pid integer,
        sort integer
    );
    
    insert into demo.tree_data values(1, '中国', null, 1);
    insert into demo.tree_data values(2, '四川', 1, 1);
    insert into demo.tree_data values(3, '云南', 1, 2);
    insert into demo.tree_data values(4, '成都', 2, 1);
    insert into demo.tree_data values(5, '绵阳', 2, 2);	
    insert into demo.tree_data values(6, '武侯区', 4, 1);
    insert into demo.tree_data values(7, '昆明', 3, 1);	
    复制代码

    connectby函数

    如果安装了 tablefunc 扩展,就可以使用PG版本的connectby函数。这个没有Oracle那么强大,但是可以满足基本要求。

    -- API 如下
    connectby(text relname, 			-- 表名称
              text keyid_fld, 			-- id字段
              text parent_keyid_fld		-- 父id字段	
              [, text orderby_fld ], 	-- 排序字段
              text start_with, 			-- 起始行的id值
              int max_depth				-- 树深度,0表示无限
              [, text branch_delim ])	-- 路径分隔符
    复制代码
    -- 基本用法如下,必须通过AS子句定义返回的字段名称和类型
    select * 
    	from connectby('demo.tree_data', 'id', 'pid', 'sort', '1', 0, '~')
    	as (id int, pid int, lvl int, branch text, sort int);
    	
    -- 查询结果
    id | pid | lvl | branch  | sort
    ----+-----+-----+---------+------
      1 |     |   0 | 1       |    1
      2 |   1 |   1 | 1~2     |    2
      4 |   2 |   2 | 1~2~4   |    3
      6 |   4 |   3 | 1~2~4~6 |    4
      5 |   2 |   2 | 1~2~5   |    5
      3 |   1 |   1 | 1~3     |    6
      7 |   3 |   2 | 1~3~7   |    7
    (7 rows)
    复制代码
    -- 仅仅使用基本用法,只能查询出id的相关信息,如果要查询code等其他字段,就需要通过额外的join操作来实现。
    select 
    	t.id, n.code, t.pid, p.code as pcode, lvl, branch
    from (
    	select * from connectby('demo.tree_data', 'id', 'pid', 'sort', '1', 0, '~')
    		as (id int, pid int, lvl int, branch text, sort int)
    ) as t
    	left join demo.tree_data as n on (t.id = n.id)
    	left join demo.tree_data as p on (t.pid = p.id)
    order by t.sort ;	
    
     id |  code  | pid | pcode | lvl | branch
    ----+--------+-----+-------+-----+---------
      1 | 中国   |     |       |   0 | 1
      2 | 四川   |   1 | 中国  |   1 | 1~2
      4 | 成都   |   2 | 四川  |   2 | 1~2~4
      6 | 武侯区 |   4 | 成都  |   3 | 1~2~4~6
      5 | 绵阳   |   2 | 四川  |   2 | 1~2~5
      3 | 云南   |   1 | 中国  |   1 | 1~3
      7 | 昆明   |   3 | 云南  |   2 | 1~3~7
    (7 rows)
    复制代码

    PS:虽然通过join可以查询出节点的code,但是branch部分不能直接转换成对应的code,使用上还是不太方便。

    CTE语法

    使用CTE语法,通过 with recursive 来实现树形数据的递归查询。这个方法虽然没有connectby那么直接,但是灵活性和显示效果更好。

    -- 
    with recursive cte as
    (
      -- 先查询root节点  
      select
        id, code, pid, '' as pcode,
        code as branch
      from  demo.tree_data where id = 1
      union all
      -- 通过cte递归查询root节点的直接子节点  
      select
        origin.id, origin.code, cte.id as pid, cte.code as pcode,
        cte.branch || '~' || origin.code
      from cte
      join demo.tree_data as origin on origin.pid = cte.id
    )
    select
      id,code, pid, pcode, branch, 
      -- 通过计算分隔符的个数,模拟计算出树形的深度
      (length(branch)-length(replace(branch, '~', ''))) as lvl
    from cte;
    
    -- 
     id |  code  | pid | pcode |        branch         | lvl
    ----+--------+-----+-------+-----------------------+-----
      1 | 中国   |     |      | 中国                 |   0
      2 | 四川   |   1 | 中国  | 中国~四川            |   1
      3 | 云南   |   1 | 中国  | 中国~云南            |   1
      4 | 成都   |   2 | 四川  | 中国~四川~成都        |   2
      5 | 绵阳   |   2 | 四川  | 中国~四川~绵阳        |   2
      7 | 昆明   |   3 | 云南  | 中国~云南~昆明        |   2
      6 | 武侯区 |   4 | 成都  | 中国~四川~成都~武侯区   |   3
    (7 rows)
    复制代码

    执行过程说明

    从上面的例子可以看出,WITH RECURSIVE语句包含了两个部分

    • non-recursive term(非递归部分),即上例中的union all前面部分
    • recursive term(递归部分),即上例中union all后面部分

    执行步骤如下

    1. 执行non-recursive term。(如果使用的是union而非union all,则需对结果去重)其结果作为recursive term中对result的引用,同时将这部分结果放入临时的working table中
    2. 重复执行如下步骤,直到working table为空:用working table的内容替换递归的自引用,执行recursive term,(如果使用union而非union all,去除重复数据),并用该结果(如果使用union而非union all,则是去重后的结果)替换working table

    以上面的query为例,来看看具体过程

    1. 执行non-recursive query
    -- step 1 执行
      select
        id, code, pid, '' as pcode,
        code as branch
      from  demo.tree_data where id = 1
      
    -- 结果集和working table为
     id | code | pid | pcode | branch
    ----+------+-----+-------+--------
      1 | 中国 |     |       | 中国
    复制代码
    1. 执行recursive query
    -- step 2 执行递归,此时自引用cte中的数据是step 1的结果
      select
        origin.id, origin.code, cte.id as pid, cte.code as pcode,
        cte.branch || '~' || origin.code
      from cte
      join demo.tree_data as origin on origin.pid = cte.id
      
     -- 结果集和working table为
      id |  code  | pid | pcode |        branch        
    ----+--------+-----+-------+---------------------
      2 | 四川   |   1 | 中国  | 中国~四川            
      3 | 云南   |   1 | 中国  | 中国~云南            
    复制代码
    1. 继续执行recursive query,直到结果集和working table为空

    2. 结束递归,将前三个步骤的结果集合并,即得到最终的WITH RECURSIVE的结果集。

    严格来讲,这个过程实现上是一个迭代的过程而非递归,不过RECURSIVE这个关键词是SQL标准委员会定立的,所以PostgreSQL也延用了RECURSIVE这一关键词。

    转载于:https://juejin.im/post/5cdac101e51d453d022cb666

    展开全文
  • 采用左右值编码来存储无限分级树形结构的数据库表设计 该设计方案的优点是:只用一条查询语句即可得到某个根节点及其所有子孙节点的先序遍历。由于消除了递归,在数据记录量较大时,可以大大提高列表效率。...
  • 想要读取生成树形结构、添加子节点、查找修改数据的代价最小。 看知乎上牛人的答案: 一般比较普遍的就是四种方法:(具体见 SQL Anti-patterns这本书) Adjacency List:每一条记录存parent_id Path ...
  • 树形结构表示实体之间联系的模型叫层次模型层次模型是最早用于商品数据库管理系统的数据模型。 层次型数据库管理系统是紧随网状数据库模型而出现的。 现实世界中很多事物是按层次组织起来的。层次数据模型的...
  • 层次模型树形结构来表示各类实体以及实体之间的联系。 满足下面两个条件的基本层次联系的集合为层次模型:1.有且只有一个结点没有双亲结点,这个结点称为根节点;2.根以外的其它结点有且仅有一个双亲结点。 在层次...
  • 之前我介绍过一种按位数编码保存树形结构数据的表设计方法,详情见: 浅谈数据库设计技巧(上) 该设计方案的优点是:只用一条查询语句即可得到某个根节点及其所有子孙节点的先序遍历。由于消除了递归,在数据记录量...
  • DOM 基本结构层次

    2018-12-18 17:01:57
    DOM (Document Object Model) ,即为文档对象模型,是 HTML 和 XML 文档的应用程序接口(API)。 HTML DOM 定义了访问和操作 HTML 文档的标准方法,提供了文档中独立元素的结构化和面向...DOM 以树结构表达 HTML 文...
  • 该博客所有的文章都是自己的学习记录,方便后续复习,达到快速回顾知识点的作用。 文章目录 ...文件系统的树形结构便于为不同的应用分配独立的命名空间(namespace) 数据结构 ZooKeeper的层次模型...
  • J2EE 层次 模型 组件 服务

    千次阅读 2009-04-21 11:01:00
    以下陈述均摘自网络的文章,自己总结归并J2EE的层次结构 早期的网络系统设计常常采用三层结构。最常见的结构,就是表示( presentation )层 , 领域( domain )层 , 以及基础架构( infrastructure )层。 n层结构...
  • 概念模型(1)用途与基本要求(2) 信息世界中的基本概念(3)两个实体型之间的联系① 一对一联系(1:1)② 一对多联系(1:n)③ 多对多联系(m:n)(4)两个以上实体型之间的联系① 一对多联系(1:m||1:n)② 一对一联系...
  • DOM模型的概念和结构

    千次阅读 2019-05-07 16:58:44
    了解DOM模型的概念和结构...文档对象模型采用层次化的树形结构,以树节点的方式表示文档中的各种内容 3、document 该对象表示整个html文档,可以用来获取文档本身的信息并访问页面中的所有的元素 该对象主要包括标签...
  • 层次数据模型 层次模型是数据库系统中最早出现的数据模型,采用层次模型的数据库的典型代表是IBM公司的IMS(Information...层次模型采用树形结构来表示实体以及实体间的联系。从图的观点可以给树下各种定义,但在...
  • 层次、网状、关系模型

    万次阅读 多人点赞 2017-11-18 17:12:44
    格式化模型层次模型和网状模型统称为格式化模型。格式化模型中数据结构基本单位是基本层次联系,基本层次联系指的是两个记录以及他们之间的一对多(包括一对一)的联系。它是单记录的操作方式。 格式化模型中实体...
  • 数据结构基本概念

    2016-09-08 00:56:14
    数据结构是一门讨论“描述现实世界实体的数学模型(非数值计算)及其上的操作在计算机中如何表示和实现”的科学。数据结构的内容包括三个“层次”的五个“要素”。 层次\要素 数据表示 数据处理 抽象 逻辑结构 ...
  • 数据结构基本类型

    2019-11-18 16:29:06
    树形结构中的数据元素之间存在一对多的层次关系 图形结构 图形结构的数据元素是多对多的关系 物理结构 顺序存储结构 是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的 链式存储结构 ...
  • 数据模型与数据库结构 ...数据模型三要素,即在描述数据时要包括数据的基本结构、数据的约束条件(这两个属于静态特征)和定义在数据上的操作(属于动态特征)三个方面。   第一层是概念层数据模型主要
  • 网络拓扑结构 ,网络模型

    千次阅读 2019-10-22 11:21:23
    一网络拓扑结构 局域网常用的拓朴结构有:总线型结构、环型结构、星型结构。 图1 l 总线型结构:网络上的所有计算机都通过一条电缆相互连接起来 特点:其中不需要插入任何其他的连接设备。网络中任何一台...
  • 1数据模型与数据库系统结构

    千次阅读 2018-03-12 20:47:18
    今天在网上买了一套计算机专业的书,但还没到,就学了一下数据库系统概论,数据模型与数据库系统结构。感觉路上会挺辛苦的,希望自己能坚持下来,给自己加油打气。写的比较乱。还不愿意画图。特别懒的一个人儿。数据...
  • zookeeper入门-基本结构

    2018-04-08 23:53:15
    zookeeper拥有一个层次的命名空间,它的数据模型和文件系统非常相似,都是采用树形结构,其中的每一个节点称之为ZNode,如下图所示: 其中/表示根节点,而且每一个路径都要是绝对路径,必须保证唯一性。在...
  • 感觉学过数据结构后有必要再区分一下基本的概念,这样才能更加容易深层次理解后续的内容。那么要搞清楚什么是数据结构那么首先来看一下数据结构的一些基本概念: 数据 数据对象 数据元素
  • 03. zookeeper基本数据模型

    千次阅读 2018-04-19 08:35:41
    是一个树形结构,类似于前端开发中的tree.js组件 zookeeper的数据模型也可以理解为linux/unix的文件目录:/usr/local 每一个节点都称之为znode,它可以有子节点,也可以有数据 每个节点分为临时节点和永久节点,...
  • 数据结构学习--绪论
  • 1、数据的()包括集合、线性结构、树形结构和图形结构四种基本类型。 答案:逻辑结构 (1)逻辑上,数据结构可分为线性结构和非线性结构。 (2)线性结构包括线性表、栈、对列、字符串。 (3)非线性...
  • 尼采:人们无法理解他没有经历过的事。既然要认真学了,就还是在手里过一遍吧,这样印象比较深刻,也算是一种记录(笔记内容摘自《大话数据结构》)。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,467
精华内容 8,586
关键字:

层次模型的基本结构是树形结构