---恢复内容开始---

1.乱穿马路 ---- > 目标 : 存储多值属性。

  1) 错误方法: 使用格式化的逗号分割列表。

     1-> 不适合查询,定位数据,无法运用聚合函数进行分组,不利于更行指定产品的账号。不利于验证指定的非法字段。

     2-> 难以选择合适的分隔符,列表的长度难以限制。

  2) 解决方案:

     1-> 创建一张交叉表。

     2-> 当一张表有指向另外两张表的外键时,我们称之为交叉表。

     3-> 使用交叉表的优势 : 能使用索引提高联结查询效率,能执行聚合查询。没有上述缺点。

2.单纯的树 ---- > 目标: 分层存储与查询 例子 : 回帖。

  1)方案1: 邻接表。

      缺陷: 无法完成 查询一个节点的所有后代。无法执行聚合函数。从一颗树中删除一个节点会变的比较复杂。丛树中获得给定节点的所有祖先开销很大。

      优势:  增加叶子节点相当简单。

  2)方案2:路径枚举

      缺陷: 拥有上一个乱穿马路中的所有缺陷。

      优势:  插入一个节点相当简单。并且容易获取子节点,父节点。

  3)方案3:嵌套集

  4)方案4:闭包表

      实现: 创建一张额外的关系表,其中存储树中所有祖先-后代关系的节点信息。

      优势: 直接获取祖先,后代节点。 插入删除节点方便。

    设计     表     查询子节点    查询树    插入      删除    引用完整性

    邻接表    1      简单      困难    简单      简单      是

    递归查询   1      简单      简单    简单      简单      是

    枚举路劲  1       简单      简单    简单      简单      否

    嵌套集    1      困难      简单    困难      困难      否

    闭包表    2      简单      简单    简单      简单      是

      邻接表是最方便的设计, 如果数据库智齿 with 或者 connect by prior 的递归查询,那使用邻接表查询更为高效。

      枚举路径能够很直观的展示出祖先到后代之间的路径。

      嵌套集 不能保证引用完整性。

      闭包表是最通用的设计。

3.需要ID 目标---- 建立主键规范。

  主键: 是数据库确保数据行在整张表中唯一性的保障,它是定位到一条记录并且确保不会重复存储的逻辑机制,主键也同时可以被外键引用来

      建立表和表之间的关系。

     mysql中提供一种与当前处理事物无关的底层方案,来确保每次都能生成全局唯一的一个整数作为主键。即使此时客户端正在发起并发操作。

    主键约束的重要性:   ×× 如果不使用主键约束,那么必须检查是否有重复行。

      1)确保一张表中数据不会出现重复行。 

      2)在查询中引用单独的一行记录。

      3)支持外键。

        注:如果两张表都有同样的列名, 就可以使用 using 进行联结查询。

        注: mysql中内置函数 获取一个序列生成的最后一个值 : last_insert_id();

    当客户端发起并发请求活取最新记录id时,如果使用当前最大值+1的做法不可靠,同样的值可能被多个客户端同时获取,要避免竞争问题必须锁住整张表。

4.目标: 简化数据库架构

  省略外键约束能使数据库设计更加简单,灵活,或者执行更加高效,但是必须增加额外代码来手动维护引用的完整性。

  注: 任何需要加锁的架构,在高并发和大数据量查询时表现都很糟糕。

  当被迫使用不支持外键约束的数据库产品, 比如mysql 的myisam存储引擎, 为了维护引用的完整性,必须使用监控脚本。

  外键的优势:

    1)不用在更新或者删除记录前执行select进行检查。

    2)在同步修改时不需要再锁住整张表。

    3)不再需要执行定期监控脚本来修正不可避免的孤立数据。

5.支持可变数据。

  1) 单表继承。

  2) 实体表继承。

  3) 类表继承。

  4) 半结构化数据模型。

  

6. 多态关联。 目标 引用多个父表

  尽可能避免多态关联, 应该使用外键约束等来确保引用完整性。 多态关联通常过度依赖上层程序代码而不是数据库的元数据。

  当使用一个面向对象框架时,多态关联似乎是不可避免的。这种类型的框架通过良好的逻辑封装可以减少使用多态关联的风险。

sql 设计反模式的更多相关文章

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

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

  2. 开发反模式 - SQL注入

    一.目标:编写SQL动态查询 SQL常常和程序代码一起使用.我们通常所说的SQL动态查询,是指将程序中的变量和基本SQL语句拼接成一个完整的查询语句. string sql = SELECT * FR ...

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

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

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

    2014-10-11 在树形结构中,实例被称为节点.每个节点都有多个子节点与一个父节点. 最上层的节点叫做根(root)节点,它没有父节点. 最底层的没有子节点的节点叫做叶(leaf). 中间的节点简 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 搭建MyBatis框架

    一.开发环境 1.JDK 1.6.0_22 2.MyEclipse 10.7.1 3.Oracle_10g_10.2.0.4 注:各软件版本不是必须的,正常任意版本都行,文件较大就不附上下载地址了,推 ...

  2. VMware下桥接设置

    操作环境 主机:Win7 X86 SP1 虚拟机:VMware station 8 虚拟机里的系统:Fedora 15 环境上,不管什么系统,什么版本的虚拟机,使用上都是大同小异的,毕竟核心是不变的. ...

  3. oc结构

    结构 在oc中只能声明变量 不能声明函数和类 结构声明 struct DateT { int month; int day; int year; }; 结构可以在起最后的分号之后定义结构变量,并且可以 ...

  4. S5700交换机配置端口镜像

    S5700交换机配置端口镜像 <Quidway>system-view    //进入系统视图 Enter system view, return user view with Ctrl+ ...

  5. 13个mysql数据库的实用SQL小技巧

    此文章为转载 使用CASE来重新定义数值类型 SELECT id,title, (CASE date WHEN '0000-00-00' THEN '' ELSE date END) AS date ...

  6. javascript 正则表达式代码

    正则表达式用于字符串处理.表单验证等场合,实用高效.现将一些常用的表达式收集于此,以备不时之需. 匹配中文字符的正则表达式: [\u4e00-\u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表 ...

  7. juce 中的WeakReference分析

    juce中的WeakReference设计得比较巧妙,巧妙就是使用delete之后就可以通知道WeakReference,原理其实也很间单,其实就是在对象里添加了一个子对象masterReferenc ...

  8. Qt5 多显示器获取不同显示器的分辨率和位置的方法

    Qt5 多显示器获取不同显示器的分辨率和位置的方法 先放官方文档链接:QDesktopWidget - Qt5 Reference 之前一直在用被我乱搞后的ShadowPlayer作为默认播放器,后来 ...

  9. PHP zip压缩文件及解压

    PHP zip压缩文件及解压 利用ZipArchive 类实现 只有有函数.界面大家自己写 ZipArchive(PHP 5.3 + 已自带不需要安装dll) /** * 文件解压 * @param ...

  10. ZRender源码分析6:Shape对象详解之路径

    开始 说到这里,就不得不提SVG的路径操作了,因为ZRender完全的模拟了SVG原生的path元素的用法,很是强大. 关于SVG的Path,请看这里: Path (英文版) 或者 [MDN]SVG教 ...