数据库设计规约
建表强制规约
- 必须使用小写字母或数字、
- 禁止出现数字开头
- 禁止两个下划线中间只出现数字
- 不使用负数名词
- 禁用保留字
- 是与否概念的字段,必须使用
is_xxx
的方式命名(现在不能有)
反例:id、userName
、update_1_time、3day
、members、order、accept
数据类型:
- 小数类型为decimal
- 货币数据使用最小货币单位,数据类型为
bigint
- 字符串长度几乎相等使用
char
varchar
长度不要超过5000
索引的分类
存储形式 | 聚簇、非聚簇 |
---|---|
数据约束 | 主键、唯一、非唯一 |
索引列的数量 | 单列、组合 |
innoDB 可以创建的索引 | 主键、唯一、普通 |
普通索引就是非唯一索引,如果几个字段的组合是唯一的,那么我们也要创造唯一索引
索引的特性
- 持久性:把数据保存到磁盘上,占有磁盘空间
- 有序性:适合于快速查询,能够提高查询效率
索引的数据结构:哈希,二叉查找树,btree
、b+tree
当数据量过大的时候,二叉查找树不太方便,需要使用btree
来存储索引,因为二叉树中每个节点只保存一个数据,这对于mysql
来说是浪费,因为mysql
在数据读写的时候,有一个最小的读写单元,就是数据页,这个数据页有16k
,而在btree
中,一个16k
大的磁盘块里面可以放很多数据,并且每一个数据左右两边各方一个指针,都指向下一个磁盘块。btree
是一颗又矮又胖的树,可以有效减少查找过程中的io
次数。
当需要查找范围数据的时候,btree
需要在节点指针不断来回跳转才能找到数据,而且btree
中的每一个磁盘块除了键值之外还存有数据,也会占有一定存储空间,也不能满足需求,此时我们就需要使用b+tree
存储索引,b+tree
中把数据都存在叶子数据节点中,叶子节点中每个数据都是有序的,并且每个叶子节点磁盘块之间有一个双向指针,可以在磁盘之间来回跳转,构成一个双向链表,这样使得它既适合等值查询又适合范围查询
数据插入的过程是如何维护b+tree
的?
创建索引规约
- 有唯一特性的字段必须建成唯一索引
- 在
varchar
字段上建立索引时,必须指定索引长度 - 建组合索引的时候,区分度最高的在最左边
SQL
规约-索引
- 注意字段类型:防止因字段类型不同造成的隐式转换,导致索引失效
- 利用覆盖索引:避免行查询操作,避免回表
- 利用有序性:如果有order by的场景,请注意利用索引的有序性
- 禁模糊:页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决
**回表:**在InnoDB
里面,主索引和数据是聚簇存储到一起的,像上面那个b+tree
那样索引的叶子节点都是数据,如果是普通索引,那它的叶子节点就对应这条数据的主键。而这种根据辅助索引走一遍查到主键,再根据主键走一遍主索引查找到记录,就叫做回表。很明显,回表需要走一遍辅助索引和一遍主索引,这样就会导致产生磁盘io
比较多,查询效率比较低。
超过三个表禁止join
SQL
-规约-count
- 拒绝替代:不要使用count(列名)或count(常量)来替代count(*)
- 计算不重复行数:count(distinct col)计算该列除NULL之外的不重复行数
- 当值全是NULL时:当某一列的值全是NULL时,count(col)的返回结果为0,但sum(col)的返回结果为NULL
**SQL
-规约-null值:**使用ISNULL()
来判断是否为NULL值
**SQL
-规约-分页:**若count为0应直接返回,利用延迟关联或者子查询优化超多分页场景
SQL
-规约-避坑指南:
- 不得使用外键与级联,一切外键概念必须在应用层解决
- 禁止使用存储过程,存储过程难以调试和扩展,更没有移植性
- 数据修订时,要先
select
,避免出现误删除,确认无误才能执行更新语句 - 只要涉及多个表,都需要在列名前加表的别名(或表名)进行限定
SQL
语句中表的别名前加as,并且以t1、t2、t3...
的顺序依次命名- in后边的集合元素数量,控制在1000个之内
SQL
性能优化的目标:
- Explain工具使用技巧
- 达到range级别
ORM
映射规约
- 在表查询中,一律不要使用*作为查询的字段列表
POJO
类的布尔属性不能加is,而数据库字段必须加"is_"- 查询返回结果都需要使用
ResultMap
映射 - 不要使用${}——容易引起
SQL
注入 - 不要使用
MyBatis
自带的queryForList
方法 - 不允许直接使用
HashMap
与Hashtable
接收结果集 - 更新数据表记录时,必须同时更新
update_time
- 不要写一个大而全的数据更新接口
数据库设计三大范式
- 每列属性不可拆分
- 表中的每列都和主键相关
- 每列都和主键列直接相关,而不是间接相关
分析设计 -> 画ER
图 -> 画物理图