2014-10-11

在树形结构中,实例被称为节点。每个节点都有多个子节点与一个父节点。

最上层的节点叫做根(root)节点,它没有父节点。

最底层的没有子节点的节点叫做叶(leaf)

中间的节点简单地称为非叶节点(nonleaf)

目标:分成存储于查询,比如:系统字典、组织机构、省份区域等树形结构数据或者以层级方式组织的数据。

反模式:总是依赖父节点,邻接表。

最简单的实现方式是添加ParentId字段,引用同一张表的主键ID。

邻接表维护树比较方便,但是查询很笨拙,如果要找一个节点下的所有子节点,要关联很多次,这个关联次数取决于树的深度,

所以,邻接表不能用于存储比较深的树。

如何识别反模式:当出现以下情况时,可能是反模式

(1)我们的数结构要支持多少层

(2)我们总是很害怕接触那些管理树结构的代码

   (3)我需要一个脚本来定期的清理树中的孤立节点数据

合理使用反模式:

  邻接表设计的优势在与能快速地获取一个给定节点的直接父子节点,也很容易插入新节点、维护节点、删除节点。

如果树的分层结构不是很深,可以使用这种模式。

       【 使用CTE通用表表达式来递归查询树形结构数据比较方便,详见“SQL中的CTE通用表表达式 】

解决方案:使用其他树模型

  路径枚举:

    用一个path字段保存当前节点的最顶层的祖先到自己的序列(路径)

    优点:查询方便;

    缺点:1、不能保证存储的值的有效性。

2、增、删时,要考虑对原位置下的子节点如何处理,比较麻烦。

3、如果还要维护一个排序path,那就更麻烦了。

  嵌套集:

    存储子孙节点的相关信息,而不是节点的直接祖先。用nsleft存储所有后台的nsleft中最小的数-1,

用nsright存储所有后台的nsright中最大的数+1。

    优点:删除时,原来子节点的关系自动上移。

    缺点:1、查询一个节点的直接上级或下级,很困难。

2、增、删,困难。

  闭包:记录了树中所有节点间的关系,而不仅仅是只有那些直接的父子关系。

将树中任何具有“祖先-后代”关系的节点对都存储在TreePath表中的一行,同时增加一行指向节点自己。

优点:1、能快速的查询给定节点的祖先与后代;

2、能更加简单的维护分层信息;

3、如果删除了TreePath表中的一条记录,那么并不是真正的删除具体信息表中的记录。这样设计有时候很有用:

比如在产品目录的分类或者员工组织架构的图标中,当你改变了节点关系的时候,并不是真的想要删除一个节点。

我们把关系路径存储在一个分开独立的表中,使得设计更加灵活。

缺点:查询直接父节点或子节点,需要在表中增加Path_Length字段来维护。

结论:

        每种设计各有优劣,如何选择设计依赖于应用程序中的哪种操作最需要性能上的优化。

邻接表:简单,但不适用于很深的表;

    枚举路径:无法保证引用完整性;

    嵌套集:无法保证引用完整性,太复杂;

    闭包:需要一个额外的表存储关系;

        个人推荐使用邻接表,或者用邻接表+枚举路径。

SQL反模式,系列学习汇总

1SQL反模式学习笔记1 开篇

2、SQL反模式学习笔记2 乱穿马路

3、SQL反模式学习笔记3 单纯的树

4、SQL反模式学习笔记4 建立主键规范【需要ID】

5、SQL反模式学习笔记5 外键约束【不用钥匙的入口】

6、SQL反模式学习笔记6 支持可变属性【实体-属性-值】

7、SQL反模式学习笔记7 多态关联

8、SQL反模式学习笔记8 多列属性

9、SQL反模式学习笔记9 元数据分裂

10、SQL反模式学习笔记10 取整错误

11、SQL反模式学习笔记11 限定列的有效值

12、SQL反模式学习笔记12 存储图片或其他多媒体大文件

13、SQL反模式学习笔记13 使用索引

14、SQL反模式学习笔记14 关于Null值的使用

15、SQL反模式学习笔记15 分组

16、SQL反模式学习笔记16 使用随机数排序

17、SQL反模式学习笔记17 全文搜索

18、SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题

19、SQL反模式学习笔记19 使用*号,隐式的列

20、SQL反模式学习笔记20 明文密码

21、SQL反模式学习笔记21 SQL注入

22、SQL反模式学习笔记22 伪键洁癖,整理数据

SQL反模式学习笔记3 单纯的树的更多相关文章

  1. SQL反模式学习笔记1 开篇

    什么是“反模式” 反模式是一种试图解决问题的方法,但通常会同时引发别的问题. 反模式分类 (1)逻辑数据库设计反模式 在开始编码之前,需要决定数据库中存储什么信息以及最佳的数据组织方式和内在关联方式. ...

  2. SQL反模式学习笔记5 外键约束【不用钥匙的入口】

    目标:简化数据库架构 一些开发人员不推荐使用引用完整性约束,可能不使用外键的原因有一下几点: 1.数据更新有可能和约束冲突: 2.当前的数据库设计如此灵活,以至于不支持引用完整性约束: 3.数据库为外 ...

  3. SQL反模式学习笔记2 乱穿马路

    程序员通常使用逗号分隔的列表来避免在多对多的关系中创建交叉表, 将这种设计方式定义为一种反模式,称为“乱穿马路”. 目标:  存储多属性值,即多对一 反模式:将多个值以格式化的逗号分隔存储在一个字段中 ...

  4. SQL反模式学习笔记4 建立主键规范【需要ID】

    目标:建立主键规范 反模式:每个数据库中的表都需要一个伪主键Id 在表中,需要引入一个对于表的域模型无意义的新列来存储一个伪值,这一列被用作这张表的主键, 从而通过它来确定表中的一条记录,即便其他的列 ...

  5. SQL反模式学习笔记6 支持可变属性【实体-属性-值】

    目标:支持可变属性 反模式:使用泛型属性表.这种设计成为实体-属性-值(EAV),也可叫做开放架构.名-值对. 优点:通过增加一张额外的表,可以有以下好处 (1)表中的列很少: (2)新增属性时,不需 ...

  6. SQL反模式学习笔记7 多态关联

    目标:引用多个父表 反模式:使用多用途外键.这种设计也叫做多态关联,或者杂乱关联. 多态关联和EAV有着相似的特征:元数据对象的名字是存储在字符串中的. 在多态关联中,父表的名字是存储在Issue_T ...

  7. SQL反模式学习笔记8 多列属性

    目标:存储多值属性 反模式:创建多个列.比如一个人具有多个电话号码.座机号码.手机号码等. 1.查询:多个列的话,查询时可能不得不用IN,或者多个OR: 2.添加.删除时确保唯一性.判断是否有值:这些 ...

  8. SQL反模式学习笔记9 元数据分裂

    目标:支持可扩展性.优化数据库的结构来提升查询的性能以及支持表的平滑扩展. 反模式:克隆表与克隆列 1.将一张很长的表拆分成多张较小的表,使用表中某一个特定的数据字段来给这些拆分出来的表命名. 2.将 ...

  9. SQL反模式学习笔记10 取整错误

    目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...

随机推荐

  1. Sublime Text3—自带快捷键介绍

    摘要: Sublime Text是个小巧便捷的编辑器,除了众多好用的插件外,还有它自带的快捷键,打代码事半功倍,不会用的赶紧看看吧! 其实菜单上都有,看不懂可以汉化,Key Bindings-Defa ...

  2. C语言博客作业06——结构体&文件

    C语言博客作业06--结构体&文件 1.本章学习总结 1.1思维导图 1.2.本章学习体会 在本周的学习中,我们学习了关于结构体和文件的内容.结构体的本身并不难,但以结构体为基础的链表还是让我 ...

  3. IDEA 导入 Tomcat9 源码

    源码下载(Source Code Distributions)地址:https://tomcat.apache.org/download-90.cgi tomcat 和 servlet 以及 jdk ...

  4. 实时通讯系列目录篇之SignalR详解

    一. 简单说几句 最早使用SignalR的时候大约是两年前了,记得当时是一个OA中消息的实时提醒,轮询的方式有点耗资源,WebSocket写起来又比较麻烦,最终选择了SignalR,当时是什么版本已经 ...

  5. dataTable 实战总结

    后台项目中经常会用到 dataTable 进行表格的智能绘制:总结一下项目中经常用到的 dataTable 设置 1.dataTable 属性设置: autoWidth: true, // 是否自动计 ...

  6. ReactJS虚拟DOM效应带来的一则副作用探索

    疑问 https://github.com/ruanyf/react-demos/blob/master/demo08/index.html 在如下代码中的 18 行, 需要将本类中的 方法,进行绑定 ...

  7. PHP代码审计之XSS操作

    XSS XSS是Cross Site Scripting(跨站脚本攻击), 它与sql注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除的目的,而在XSS攻击中,通过插入 ...

  8. Linux关闭You have new mail in /var/spool/mail/root提示

    终端远程登陆Linux后经常提示You have new mail in /var/spool/mail/root 这个提示是LINUX会定时查看LINUX各种状态做汇总,每经过一段时间会把汇总的信息 ...

  9. ASP.Net获取Aras连接,并获取Innovator实例

    首先需要在自己的项目bin目录下引入Aras的dll(../Aras\Innovator\Innovator\Server\bin). 注意:在引入Aras的dll时.需要注意自己的操作系统的位数.因 ...

  10. 使用antd Table + mobx 处理数组 出现的一系列问题

    在store中定义了一个数组: @observable list = [...] 若是在table组件中直接使用list: <Table className={styles.table} col ...