美文网首页
唯一性索引在数据防重场景里埋的坑

唯一性索引在数据防重场景里埋的坑

作者: 花生草 | 来源:发表于2023-07-04 10:48 被阅读0次

业务场景

有一个XX的Web系统里,要求用户列表里的用户是唯一的,具体是通过用户名称的字段(简单理解,)进行判定。在最早一版迭代里,为了简单,将用户名称设置为了唯一性索引

坑一:当索引字段取值为null时数据唯一效果失效

唯一性索引的第一个坑,是被索引的字段是可以为null的。在Mysql innodb引擎中,允许在唯一索引的字段中出现多个null值。两个null是不会被判定为相等的值

ALTER TABLE t
ADD UNIQUE(n1,n2)
n1 n2
1 null
1 null

像这个例子,是可以成功创建到带有唯一索引的表中,却不符合实际用户的感知的

在业务场景中,通过限制了被归纳到唯一性索引中的所有字段,都不允许为null来规避了这个事情,接着又迎来了第二个坑

坑二:删除场景从逻辑删除变为物理删除时,无法添加新数据

随着业务规模的扩大和真实用户需求的涌入,为了提高数据安全和容灾能力,需要将删除用户的操作从物理删除修改为逻辑删除。通用做法就是增加状态字段status,例如0标识数据有效,当执行删除操作时,将status修改为1
问题在于,将某一用户删除后,系统中再次添加用户,填写了和被删除用户一样的信息,由于有唯一性索引的存在,导致这两条数据不满足约束,从而添加失败。又一次产生了不符合实际用户需求的问题

方案一

status字段的值,随着删除操作依次递增。例

  • 初始值是0,(n1,n2,status=0)
  • 当第一次删除时,该数据的status设置为1。(n1,n2,status=1)
  • 写入新数据,status=0。(n1,n2,status=0)(n1,n2,status=1)
  • 删除新数据,status设置为当前系统中最大值+1(1+1)为2。 (n1,n2,status=1)(n1,n2,status=2)
  • 写入新数据,(n1,n2,status=0)(n1,n2,status=1)(n1,n2,status=2)
  • 再次删除时,status设置为当前系统中最大值+1(2+1)为3。(n1,n2,status=1)(n1,n2,status=2)(n1,n2,status=3)

方案二

类似,也是向唯一性约束靠拢,将标识状态的status字段取值唯一,删除时将其设置为当前时间戳或者设置为primary key的值。
关于设置为时间戳,高并发时是否会导致系统出问题?可以讨论一下,目前看不会。插入或者编辑操作时,数据库保证只写入成功一次,其余会失败;删除操作时,由于操作的数据在前置条件中是保证了唯一,也不会出现问题

方案n

整体去掉数据库层的唯一约束,通过应用层的代码来判断,是否存在重复数据,即应用层在进行insert和update操作前,增加一次查询数据库的操作

结语

良好的编程习惯,从小事做起,从一开始做起

相关文章

  • 浅谈索引的优缺点和建立索引的原则

    索引的优点索引的缺点建索引的几大原则 索引的优点 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 可以...

  • 数组去重

    数组去重的方法:通过直接方法去重、通过对象的属性具有唯一性去重、通过索引值去重、先排序在去重 案例: (1)索引去...

  • 数据库索引简述

    一、数据库索引的作用 1.唯一性索引可以确保每一行数据的唯一性。 2.索引可以大大加快数据的检索速度。 3.可以加...

  • 索引

    索引 索引是什么索引(index)是帮助MySQL高效获取数据的数据结构。索引的作用提高查询速度确保数据的唯一性可...

  • 数据库索引总结(一)

    为什么要使用索引? 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 可以大大加快 数据的检索速度(大大...

  • MySQL#索引

    为什么要使用索引? 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 可以大大加快数据的检索速度(大大减...

  • 解疑:为什么要为数据库建索引

    1、数据库创建索引的好处第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。第二,可以大大加快数据的检...

  • 2.数据库中索引的作用是?它有什么缺点?

    2.数据库中索引的作用是?它有什么缺点? 优点:1.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2....

  • Java常见面试题汇总-----------数据库(数据库索引及

    54、数据库索引 索引的优缺点   优点:  1、大大加快数据的检索速度;  2、创建唯一性索引,保证数据库表中每...

  • MySQL-InnoDB索引

    1. 索引类型: 普通索引(唯一性) 唯一索引 (不为空性) 主键索引 全文索引 2. 索引数据结构演化过程:...

网友评论

      本文标题:唯一性索引在数据防重场景里埋的坑

      本文链接:https://www.haomeiwen.com/subject/ycocudtx.html