目标:整理数据,使不连续的主键Id数据记录变的连续。

反模式:填充断档的数据空缺。

  1、不按照顺序分配编号

在插入新行时,通过遍历表,找到的第一个未分配的主键编号分配给新行,来代替原来自动分配的伪主键机制。

使用Select Max(Id) + 1 这种查询语句,会出现并发访问的问题。

  2、为现有数据行重新编号:通常做法是找到主键最大的行,然后用最小的未被使用的值来更新它。

    缺点:(1)SQL语句比较麻烦;

         (2)必须同时更新所有引用了你重新分配了主键的行的子记录;

       (3)无法避免产生新的断档。

  3、制造数据差异

    如果别的外部系统依赖于数据库中的主键来定义数据,那么你的更新操作就会导致那个系统中的引用失效。

    重用主键不是一个号的注意,因为断档往往是由于一些合理的删除或者回滚数据所造成的。

    别因为那些伪键看上去是没用的而重新分配他们。

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

  1、在我回滚了一个插入操作后,要怎么重用囊而自动生成的标识?

伪键一旦生成后不会回滚。如果非要回滚,RDBMS就必须在一耳光事务的声明周期内生成一个伪键,

而这在多个客户端并发地插入数据时,会导致竞争或者死锁。

  2、bugId为3的这条记录怎么了?

  3、如何找到第一个未使用的Id?

  4、自增长整形id的数字标识如果达到了最大值怎么办?

合理使用反模式

  没有理由要去改变伪键的值,由于它的值本身并没有什么重要的意义。如果这个主键列有实际的意义,那么这就是一个自然键,而不是伪键。

解决方案

  主键的值必须是唯一且非空的,因而你才能使用主键来唯一确定一行记录,但这是主键的唯一约束,

他们不需要一定非得是连续值才能用来标记行。

  1、定义行号:使用Row_Number()或者Limit等关键字来实现;

  2、使用Guid:数据库全局唯一标识符。

优点:(1)可以再多个数据库服务器上并发地生成伪键,而不用担心生成同样的值。

(2)不存在断档的问题。

缺点:(1)Guid的值太长,不方便输入;

       (2)Guid的值是随机的,因此找不到任何规则或者依靠最大值来判断哪一行的最新插入的;

       (3)Guid的存储需要16字节,这比传统的4自检整形伪键占用更多的控件,并且查询的速度更慢

结论:将伪键当做行的唯一性标识,但它们不是行号。

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反模式学习笔记22 伪键洁癖,整理数据的更多相关文章

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

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

  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. http请求contentype详解

    请求头 在http请求头中有一项重要的参数就是contentype,用来告诉浏览器,我服务器传送过来的数据是什么格式,这样浏览器才知道怎么去解析服务器传过来的数据 urlencoded 通常我们for ...

  2. for循环里使用查询如何优化(代码库)

    for循环里的查询,只是为了赋值对象中的一个字段,如果每一个都重新查一下数据库,影响效率 应该先进行查询,然后再循环里组装自己需要的业务数据 如下代码:list1 查询出对象的一部分内容,list2 ...

  3. vue实战记录(六)- vue实现购物车功能之地址列表选配

    vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(六) GitHub:sue ...

  4. Django 2.0.4 微博第三方登录

    三方登录逻辑 理解第三方登录的流程: 用户向本地应用商城发起请求,我要用微博进行登录 我们的商城凑一个url让用户跳转到第三方应用的url(微博的登录页面) 用户在该界面点击输入用户名密码之后,点击授 ...

  5. laravel 图片验证码

    今天看见一个网站登录页面有个图片验证码,想想自己以前好像真没弄过这个玩意,正好现在有时间,准备用laravel来弄个图片验证码出来,不多BB,直接上代码 1.直接使用别人封装好的,composer下载 ...

  6. WinForm文件说明

    以上位置,双击即可. 界面可以通过拖动控件,也可以通过背后的界面代码去布局. 如果删除了事件代码,界面可能报错,因为界面代码中有未删除的残余(波浪线提示处代码,直接删除即可). 对于多个窗体,Prog ...

  7. 20175209 《Java程序设计》第四周学习总结

    20175209 2018-2019-2 <Java程序设计>第四周学习总结 教材知识点总结 1.子类和父类: 子类的继承性:子类与父类在同一包中——子类继承父类中不是private的变量 ...

  8. oldboy s21day11

    #!/usr/bin/env python# -*- coding:utf-8 -*- # 1.列举 str.list.dict.set 中的常用方法(每种至少5个),并标注是否有返回值.'''str ...

  9. redis发布/订阅

    发布订阅简介 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息,消息之间通过channel传递. 准备工作 两台安装了redis的机器(虚拟 ...

  10. RT-SA-2019-005 Cisco RV320 Command Injection Retrieval

    Advisory: Cisco RV320 Command Injection RedTeam Pentesting discovered a command injection vulnerabil ...