A记录依赖B记录,B记录又依赖C记录。。。这就是层次结构。
树状结构
树状结构VS主从关系
树状结构的保存只需要一张表
代表层次结构的树,其所有节点类型完全相同。叶节点(没有子节点的节点)的类型有时可能不同--例如文件系统的文件夹(普通节点)和文件(叶子节点),我们暂不考虑这种情况。而且所有节点类型完全相同,我们可以用相同方法描述,而且用同一个表来代表节点。换句话说,表与它分身之间有种主从关系,而不是两个类型不同的表的关系。
深度
层次结构中,与根节点的距离本身是重要信息。而在主从关系中,不是主表、就是明细表。
所有权
主从关系统,可以有明确对的外键完整性约束,例如,每个order_detail表中的订单id,必须与orders表中已存在的id对应。但层次结构,例如虽然经理标志号必会参照已存在的员工标志号,但总经理向董事会汇报,他不是想员工报告。这给我们造成了困难,也就是NULL的问题。可能会有多个‘特例’记录,需要在相同表中描述多个独立的树,每个数都有自己的根,这种情况称为森林。
多重父节点
层次结构的实际案例
风险暴露
计算金融机构面临的风险,如对冲基金,就呈现出层次式的复杂性。这些金融机构会投资基金,而基金本身可能又投资了其他基金。
档案位置
档案夹、箱子、架子形成层次结构。
原料使用
如果页节点的数量固定,我们只需要把表自连接多次,连接的次数与层数相同。以档案位置为例:
用SQL数据库描述树结构
在SQL 的世界中,树通常可用三种模型描述。
邻接模型:
层次中的父记录id作为子记录的属性,树种两个相邻的几点因而被明确关联在一起。经理的员工编号被指定为管理员的属性,就是邻接模型常见的例子。经理与员工直接 关联,实际上是不良的设计,因为经理的识别数据,应该是他所管理的部门的属性。当更换部门经理时,不应该更所有部门员工的记录。
物化路径模型
把树中的每个节点,与它在书中位置的描述数据结合。从树根往下直到它的父节点。
嵌套集合模型
每个几点被赋予一对数字,最终,父节点的两个数据定义的间隔总是将其所有子孙所定义的间隔包含在其中。
树的实际实现
在每个例子中,记录会以相同顺序插入表(依commander排序),以对比记录的物理顺序与预期结果。
邻接模型
物化路径模型
嵌套集合模型
用SQL访问树结构
自顶向下访问:Vandamme查询