SQL反模式学习笔记22 伪键洁癖,整理数据
目标:整理数据,使不连续的主键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反模式,系列学习汇总
18、SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题
成在管理,败在经验;嬴在选择,输在不学! 贵在坚持!
个人作品
BIMFace.SDK.NET
开源地址:https://gitee.com/NAlps/BIMFace.SDK
系列博客:https://www.cnblogs.com/SavionZhang/p/11424431.html
系列视频:https://www.cnblogs.com/SavionZhang/p/14258393.html
技术栈
1、Visual Studio、.NET Core/.NET、MVC、Web API、RESTful API、gRPC、SignalR、Java、Python
2、jQuery、Vue.js、Bootstrap、ElementUI
3、数据库:分库分表、读写分离、SQLServer、MySQL、PostgreSQL、Redis、MongoDB、ElasticSearch、达梦DM
4、架构:DDD、ABP、SpringBoot、jFinal
5、环境:跨平台、Windows、Linux、Nginx
6、移动App:Android、IOS、HarmonyOS、微信小程序、钉钉、uni-app、MAUI
分布式、高并发、云原生、微服务、Docker、CI/CD、DevOps、K8S;Dapr、RabbitMQ、Kafka、RPC、Elasticsearch。
欢迎关注作者头条号 张传宁IT讲堂,获取更多IT文章、视频等优质内容。
出处:www.cnblogs.com/SavionZhang
作者:张传宁 技术顾问、培训讲师、微软MCP、系统架构设计师、系统集成项目管理工程师、科技部创新工程师。
专注于企业级通用开发平台、工作流引擎、自动化项目(代码)生成器、SOA 、DDD、 云原生(Docker、微服务、DevOps、CI/CD);PDF、CAD、BIM 审图等研究与应用。
多次参与电子政务、图书教育、生产制造等企业级大型项目研发与管理工作。
熟悉中小企业软件开发过程:可行调研、需求分析、架构设计、编码测试、实施部署、项目管理。通过技术与管理帮助中小企业实现互联网转型升级全流程解决方案。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如有问题,可以通过邮件905442693@qq.com联系。共同交流、互相学习。
如果您觉得文章对您有帮助,请点击文章右下角【推荐】。您的鼓励是作者持续创作的最大动力!