Mysql数据库设计规范和技巧

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Mysql数据库设计规范和技巧

1. 数据库设计的目的

   有效的存储

   高效的操作

2. 数据库设计的四个步骤

2.1 需求分析

  1. 了解数据的属性,有哪些字段,主键的可选项
  2. 了解数据之间的对应关系,一对一、一对多、多对多  
  3. 了解数据的生命周期,是临时存储、是永久存储、还是定期归档

2.2 逻辑设计

2.2.1 逻辑设计失败会导致的问题:

  插入异常:如果某个实体随着另一个实体的存在而存在,即缺少某个实体无法表示这个实体,那么这个表就存在插入异常

  更新异常:如果更改表的某个单独属性时,需要更新多行数据,那么这个表存在更新异常

  删除异常:如果删除表的某一行来反映实体失效时导致另一个不同实体实例信息丢失,那么这个表中就存在删除异常

  数据冗余:相同的数据在多个地方存在,或者说表中的某个列可以由其他列计算得到,那么这个表就存在数据冗余

PS:一般存在插入异常的表都存在更新异常和删除异常

2.2.2 逻辑设计的方法:

用ER图表示表与表之间的对应关系及表中的字段属性

     矩形:表示实体集,代表一张表

     菱形:表示表与表之间的联系

     椭圆:表示实体的属性

     线段:表示对象之间存在关联

2.2.3 逻辑设计的原则:

第一范式:列不可再分,数据属性尽量拆分到不可再分

第二范式:所有非主键字段只能依赖主键,而不能依赖主键的一部分,即所有的单主键表都满足第二范式

第三范式:非主键字段之间不能相互依赖,如果存在非主键字段之间的依赖,应当拆表

BC范式:联合主键之间的字段不 能相互依赖,如果存在,就不应该使用联合主键。

第四范式:一个表的非主键属性相互独立时,非主键属性不能有多个值。例如,职工表(职工编号,职工孩子姓名,职工选修课程),在这个表中,同一个职工可能会有多个职工孩子姓名,同样,同一个职工也可能会有多个职工选修课程,即这里存在着多值事实,不符合第四范式。如果要符合第四范式,只需要将上表分为两个表,使它们只有一个多值事实,例如职工表一(职工编号,职工孩子姓名),职工表二(职工编号,职工选修课程),两个表都只有一个多值事实,所以符合第四范式。

第五范式:尽可能将表拆分成较小的表,以减少数据冗余

PS: 数据库范式层层往后依赖,即后一范式一定满足前一范式,设计通常满足第三范式即可,越往后付出价值越大,若追求性能,不一定遵循这些范式。

反范式设计

完全符合范式化的设计真的完美无缺吗?很明显在实际的业务查询中会大量存在着表的 关联查询,而大量的表关联很多的时候非常影响查询的性能。所谓得反范式化就是为了性能和读取效率得考虑而适当得对数据库设计范式得要求进行违反。允许存在少量得冗余,换句话来说反范式化就是使用空间来换取时间。

2.3 物理设计

   目的:建立数据库的表结构

2.3.1 存储引擎的选择:

功能

MyISAM

Innodb

Memory

Archive

存储限制

256TB

64TB

RAM

None

支持事务

No

Yes

No

No

支持全文索引

Yes

Yes

No

No

支持数索引

Yes

Yes

Yes

No

支持哈希索引

No

Yes

Yes

No

支持数据缓存

No

Yes

N/A

No

支持外键

No

Yes

No

No

  MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引。从InnoDB 1.2.x版本开 始,InnoDB存储引擎开始支持全文检索,对应的MySQL版本是5.6.x系列。

选择原则:

  1. 绝大多数情况下使用Innodb
  2. 如果一个表需要支持事务,考虑并发的安全和性能,选择InnoDB
  3. MyISAM,只支持表级锁,InnoDB在走索引时使用行级锁。InnoDB支持事务,在读写时需要损耗更多的性能和磁盘资源开销。综上特点,在不考虑并发上锁的前提下,MyISAM的查询和插入效率高于InnoDB,并发时则性能差异不大。如果一个表不需要支持事务,也不需要考虑并发场景下的安全和性能影响,选择MyISAM,如数据字典、用户角色、菜单表等系统结构表优先选择MyISAM。
  4. 临时表并数据量不大优先考虑Memory
  5. Archive虽不安全,但支持高并发的插入操作。如果一个表只要插入和查询操作,没有修改。优先考虑Archive,如日志信息记录

2.3.2 主键的设计

自增主键:

  1. 因为按顺序存储数据,存储时能大概率避免数据的移动,存储空间小,性能较好。
  2. 主键容易被探测,不安全,分表和合表数据容易发生冲突。
  3. 很多文章说高并发下,使用自增主键会导致间隙锁的竞争,这个结论是不对的。间隙锁的竞争问题是Innodb引擎层面产生的,与是否使用自增主键没有关系。

UUID:

  1. 全球唯一性,数据随机插入,导致mysql产生磁盘随机IO,每次插入数据必然引起数据的移动,也可能导致mysql的页分裂,存储空间大,性能较差。

设计原则:

  1. 如果并发量较大、没有分表、合表需求时优先考虑自增主键。反之选择UUID主键。
  2. 尽量不使用业务相关字段。
  3. 同一个表中主键不重用。
  4. 只要是约束就会影响性能,对于MyISAM存储引擎,如果表不与其他表做关联查询,则不需要创建主键。对于Innodb存储引擎,最好自定义主键,不然mysql会为表自动生成一个6B的主键。

2.3.3 字段类型的选择

    1. 根据业务的需要先确定大的字段类型方向,如是使用字符串?还是整形?还是浮点型?还是时间类型。确定后再来细化选择。

    2.  如果一个字段既各种类型都可以满足业务需求,优先选择数字类型,其次是时间类型,最后考虑字符串类型。因为相对而言,计算机更擅长数字计算。

    3.  在满足业务的前提下尽量使用存储空间较小的数字类型,适当考虑日后数据的增长。如果没有负数,应使用无符号数字类型。

    4. 对于有小数的字段,优先考虑decimal定点型,它的精确度更高。但相对于float、double来讲,它的存储空间更大。

     5. 日期尽量用日期类型,不要用数字类型,避免带来不必要的麻烦。

 更多细节参考:MYSQL字段类型

   

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
20天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
|
20天前
|
存储 关系型数据库 MySQL
12:企业规范约束-MySQL
12:企业规范约束-MySQL
47 0
|
9天前
|
数据库 Python
在数据库中的规范设计
【5月更文挑战第16天】关系数据库规范化理论涉及函数依赖和超键概念。函数依赖如X->Y表示X能唯一确定Y。超键是能唯一标识元组的属性集合,候选键是最小超键,无冗余。主键是用户选定的候选键,外键关联不同表的主键。Armstrong公理用于推导函数依赖。数据库范式从1NF到5NF,消除部分和传递依赖,确保数据完整性。实际操作中,反规范化有时用于优化,如增加冗余列、派生列、重组表和分表策略,以提升查询效率和性能。
147 51
在数据库中的规范设计
|
12天前
|
SQL 关系型数据库 MySQL
MySQL中的12个SQL编写规范
SQL良好习惯提升查询清晰度、效率和安全性,包括使用EXPLAIN分析查询计划、DELETE/UPDATE时加LIMIT限制影响范围、为表和字段添加注释、关键字大写缩进、指定INSERT字段名、先测试后执行、表含主键及时间戳字段、Update/Delete需Where条件、用InnoDB引擎、避免SELECT *,选择UTF8字符集和规范索引命名。
MySQL中的12个SQL编写规范
|
13天前
|
关系型数据库 数据库
关系型数据库设计规范第三范式(3NF)
【5月更文挑战第14天】关系型数据库设计规范第三范式(3NF)
27 3
|
13天前
|
关系型数据库 数据库
关系型数据库设计规范第二范式(2NF)
【5月更文挑战第14天】关系型数据库设计规范第二范式(2NF)
30 7
|
13天前
|
存储 关系型数据库 数据库
关系型数据库设计规范第一范式(1NF)
【5月更文挑战第14天】关系型数据库设计规范第一范式(1NF
36 8
|
20天前
|
安全 关系型数据库 MySQL
linux配置核查MySQL 配置规范 (Linux)_S3A3G3
linux配置核查MySQL 配置规范 (Linux)_S3A3G3
14 0
|
20天前
|
存储 SQL 关系型数据库
数据库设计规范
数据库设计规范
131 0
|
20天前
|
SQL 关系型数据库 MySQL
MySQL数据库设计规范总结
该文档是一份MySQL数据库设计和SQL编写规范,旨在帮助技术团队遵循最佳实践,确保数据库设计合理、高效。规范涵盖数据库命名、表结构、数据类型优化、索引设计、分库分表、字符集、DAO设计建议和SQL编写规则。其中强调了强制性要求,如使用InnoDB存储引擎,主键和索引设计,以及避免全表扫描和使用JOIN等。此外,还提供了SQL示例和性能优化建议,以确保数据库系统的稳定性和性能。
80 2