闭关修炼31天之第三天---谈谈数据库规约的那些事

本文探讨了数据库设计中的命名规约、数据类型选择、建表与索引策略,并强调了SQL语句的优化,包括如何有效利用索引、避免全表扫描以及处理分页查询。还提到了ORM映射的注意事项,如避免使用通配符查询,确保更新时间戳字段的维护。这些最佳实践旨在提升数据库性能和代码质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       说起这个数据库,作为一个科班出身的程序员来说,真的是大学中就较为头疼的一门课,尤其是涉及到的一些I/O底层啦,数据结构之类的,各种各样的底层原理,层出不穷。。。

那在日常工作中很多知识也是一直使用,今天我们就来聊聊工作中的"那些事"!话不多说,上干货!

干货:

一.建表规约

二.索引规约

三.SQL规约

四.ORM映射规约


一.建表规约 

  • 表、字段的命名:

  1. 必须使用小写字母或数字。
  2. 禁止出现数字开头。
  3. 禁止两个下划线中间只出现数字。
  4. 不使用复数名词。
  5. 禁用保留字。
  6. 是与否概念的字段,必须使用is_xxx的方式命名。
  • 数据类型: 

  1. 小数类型为decimal。
  2. 货币数据使用最小货币单位,数据类型为bigint。
  3. 字符串长度几乎相等使用char。
  4. varchar长度不要超过5000.
  • 表必备三字段: id、create_time、update_time。

  • 建表推荐规约:

  1. 表的命名最好是遵循“业务名称_表的作用”。
  2. 库名与应用名称尽量一致。
  3. 如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释。
  4. 字段允许适当冗余,以提高查询性能,但必须考虑数据一致。
  5. 单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表。 

二.索引规约

  • 索引命名:

  1. 主键索引名为pk_字段名。
  2. 唯一索引名为uk_字段名。
  3.  普通索引名为idx_字段名。
  • 创建索引规约: 

  1. 有唯一特性的字段必须建成唯一索引。 
  2. 在varchar字段上建立索引时,必须指定索引长度。
  3. 建组合索引的时候,区分度高的在最左边。
  • 创建索引时应避免的误解: 

  1. 索引宁缺毋滥:认为一个查询就应该有一个索引。
  2. 吝啬索引创建:认为索引会消耗空间,严重拖慢记录的更新以及行的新增速度。
  3. 抵制唯一索引:认为唯一索引一律需要在应用层通过“先查后插”的方式解决。 

三.SQL规约

  • 索引:

  1. 注意字段类型:防止因字段类型不同造成的隐式转换,导致索引失效。
  2. 利用覆盖索引:利用覆盖索引来进行查询操作,避免回表。
  3. 利用有序性:如果有order by的场景,请注意利用索引的有序性。
  4. 禁模糊:页面搜索禁止左模糊或者全模糊,如果需要请走搜索引擎来实现。 
  • count: 

  1. 拒绝代替:不用使用count(列名)或count(常量名)来代替count(*)。
  2. 计算不重复行数:count(distinct col)计算该列中除null外的不重复行数。
  3. 当值全是null时:当某一列的值全是null时,count(col)的返回结果为0,单sum(col)的返回结果为null。
  • 分页: 

  1. 若count为0:分页查询逻辑时,若count为0,应直接返回。
  2. 优化超多分页场景:利用延迟关联或者子查询优化超多分也场景。 
  • NULL值: 

  1. NULL<>NULL的返回结果是NULL,而不是false。
  2. NULL=NULL的返回结果是NULL,而不是false。
  3. NULL<>1的返回结果是NULL,而不是true。 

四.ORM映射规约

  • 在查询中一律不要使用*作为查询字段列表。
  • POJO类的布尔属性不能加is,而数据库字段必须加"is_"。
  • 查询返回结果都需要使用ResultMap映射。
  • 不要使用${}。
  • 不要使用MyBatis自带的queryForList方法。
  • 不允许直接使用HashMap或者HashTable直接接收结果集。
  • 更新数据表记录时,必须同时更新update_time。
  • 不要写一个大而全的数据更新接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值