目标:简化数据库架构

一些开发人员不推荐使用引用完整性约束,可能不使用外键的原因有一下几点:

1、数据更新有可能和约束冲突;

2、当前的数据库设计如此灵活,以至于不支持引用完整性约束;

3、数据库为外键建立的索引会影响性能;

4、当前使用的数据库不支持外键。比如MySQL的MyISAM存储引擎,或者比SQLite3.6.19早的版本;

5、定义外键的语法并不简单,还需要查阅。

反模式:无视约束,即不使用约束

省略外键约束能使得数据库设计更加简单、灵活,或者执行更加高效,但是你不得不在其他方面付出相应的代价,

必须增加额外的代码来手动维护引用完整性。

1、假设无暇代码:要避免在没有外键约束的情况下产生引用的不完整状态,需要再任何改变生效前执行额外的Select查询,

以此来确保这些改变不会导致引用错误。比如在查询一条记录之前,需要检查对应的被引用记录是否存在。

2、检查错误:开发人员使用外部脚本来检查错误的数据。

3、修改代码时,无法保证系统中的所有部分都被同时修改。

4、可能有些用户直接操作了数据库,修改或删除被引用的字段值,导致其他表引用发生未知错误;

而且你不能确定所有的应用程序或者脚本在访问数据库时所做的操作都是正确合理的。

5、当你Update更新一条被其他记录依赖的记录时,在没有更新父记录前,你不能更新子记录,

而且也不能在更新父记录前更新子记录。你需要同步执行两边的更新,但是使用2个独立的更新语句是不显示的。

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

1、我要怎么写这个查询来检查一个值是否没有被同时存在2张表中?(通常这样的需求是为了查找那些孤立的行数据)

2、有没有一种简单的方法来判断在一张表中的数据是否也在第二张表中存在?

(这么做是用来确认父记录切实存在。外键会自动完成这些,并且外键会使用这父表的索引尽可能的高效完成)

3、有人说不要用外键,外键影响数据库效率。

合理使用反模式:

       如果数据库产品不支持外键约束功能,则不得不使用别的方法来保持引用完整性,比如使用监控脚本。

同样也存在一些极度灵活的数据库设计,外键无法用来表示其对应的关系。

解决方案:声明约束

       1、通过使用外键来确保应用完整性;

使用约束时:(1)数据库本身会拒绝所有不合理的改变,无论这个改变是通过什么方式造成的。

(2)能够避免编写不必要的代码,同时还能确保一旦修改了数据库中的内容,所有的代码依旧能够用同样的方式执行。

(3)外键的特性:级联更新,比如:On Update Cascade、On Delete Restrict等。

在执行更新和删除2个操作中的任意1个是,数据库都会自动修改多张表中的数据,

外键的引用状态在操作之前和之后都保持完好。

2、外键约束的确需要多那么一点额外的系统开销,但相比于其他的一些选择,外键确实更高效一点:

(1)不需要在更新或删除记录前执行Select检查;

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

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

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反模式学习笔记5 外键约束【不用钥匙的入口】的更多相关文章

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

    目标:整理数据,使不连续的主键Id数据记录变的连续. 反模式:填充断档的数据空缺. 1.不按照顺序分配编号 在插入新行时,通过遍历表,找到的第一个未分配的主键编号分配给新行,来代替原来自动分配的伪主键 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. NOI2009 管道取珠 神仙DP

    原题链接 原题让求的是\(\sum\limits a_i^2\),这个东西直接求非常难求.我们考虑转化一下问题. 首先把\(a_i^2\)拆成\((1+1+...+1)(1+1+...+1)\),两个 ...

  2. 在不同DPI屏幕环境下,让图标显示的尺寸保持不变,使用 LoadImage() 加载图标

    之前写过的一个客户端程序中,需要在状态栏上显示图标: 我当时使用的是:HICON LoadIcon(HINSTANCE hInstance, LPCTSTR lpIconName); 在DPI:125 ...

  3. CSS上下左右居中的几种方法

    1.absolute,margin: auto .container { position: relative; } .content { position: absolute; margin: au ...

  4. spring的事件驱动模型

    在工作中会遇到这样的业务,生成一个订单后需要给指定的用户发送短信或者邮件,但是短信或者邮件发送失败又不会影响正常的业务: 这里介绍通过ApplicationContext和spring的@EventL ...

  5. 树莓派的系统安装,并且利用网线直连 Mac 进行配置

    最近单位给了我一个新的树莓派3B+让我自己玩.下面是我记录的我如何安装 Raspbian Stretch Lite 系统,然后如何成功不用独立显示屏而利用 MacBook 对其进行配置. 安装 Ras ...

  6. Python认识到放弃

    基础入门 计算机硬件基础 变量 数据类型 基本运算符 变量常量 流程控制 数据类型 数字,字符串,列表 元组,字典,集合 字符编码 python2 python3 文件处理 文件读写 指针移动 函数 ...

  7. Win10+Ubuntu18.04双系统安装

    Win10+Ubuntu18.04 亲测UEFI启动模式双硬盘+双系统成功安装经验 https://blog.csdn.net/xrinosvip/article/details/80428133 分 ...

  8. Koa与Node.js开发实战(1)——Koa安装搭建(视频演示)

    学习架构: 由于Koa2已经支持ES6及更高版本,包括支持async方法,所以请读者保证Node.js版本在7.6.0以上.如果需要在低于7.6的版本中应用Koa的async方法,建议使用Babel ...

  9. jvm经典文章整理

    Java中JVM虚拟机详解 Java GC的那些事(上)(博主还有很多文章都很经典) CMS垃圾收集器介绍

  10. 微信小程序中使用 <web-view> 内嵌 H5 时,登录问题的处理方法

    在微信小程序的开发中,经常遇到需要使用 <web-view></web-view> 内嵌 H5 的需求.在这种需求中比较棘手的问题应该就是登录状态的判断了,小程序中的登录状态怎 ...