数据库设计注意事项

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 数据库设计注意事项

DBMS数据库管理系统

数据库设计

1、有效存储
2、高效访问

目的:

1、减少数据冗余
2、避免数据维护异常
3、节约存储空间
4、高效的访问

数据库设计过程:

1、需求分析: 分析需要存储的数据是哪些,这些数据有哪些属性,这些属性各自的特点是什么
2、逻辑设计: 使用ER图对数据库进行逻辑建模,
3、物理设计: 使用哪款数据库设计建表(oracle,myslq,sqlserver)
4、维护优化: 索引优化,大表拆分

数据库设计布置

需求分析—>逻辑设计—>物理设计—>优化

需求分析

数据内容

数据存储特性:时效性

数据生命周期:增长快、量大、非核心,分库分表,归档清理规则

实体间及实体与表的关系,1对1,1对多,多对多

实体的属性,单一属性or属性组合 可以唯一标识实体的


逻辑设计

ER图例说明:

矩形:表示实体集,矩形内写实体的名字
菱形:表示联系集
椭圆:表示实体属性
线段:将属性链接到实体集

名词解释

关系是表,
元组是行,
属性是列。
候选码是属性组,可以唯一的确定一个元祖(列)
候选码中选一个当主码
域是属性的取值范围
分量是元组中的一个属性值

常见数据库设计范式:

第一范式、所有字段不可拆分
第二范式、单关键字
第三范式、不存在传递依赖
BC范式(Boyce.Codd)、解决部分主键依赖于非主键部分
第四范式
第五范式

插入异常,更新异常,删除异常

数据冗余:重复数据

数据库物理设计

1、选择合适的数据库管理系统

-商业数据库 oracle、sqlserver

-开源数据库 mysql pgsql

2、定义数据库、表以及字段的命名规范

3、根据所选的dbms系统选择合适的字段类型

4、反范式化设计:刻意增加冗余,以空间换取时间

MySQL常用的存储引擎:

MylSAM   不支持事务  表级锁 读写效率更高
MRG_MYISAM   不支持事务,表级锁 分段归档
Innodb(推荐)  支持事务   行级锁 
Archive 行级锁  日志记录
Ndb cluster(MYSQL集群) 支持事务 行级锁 高可用

数据库表及字段的命名规则:

可读性原则(用大小写区分来提高可读性等)
表意性原则(表的名称应能体现其存储内容等)
长名原则(少用缩写)

字段类型选择原则

优先选择数字类型,其次是日期和二进制类型,最后才是字符串类型;
字符比数据处理慢;
在数据库中,数据处理以页为单位,列的长度越小,利于性能提升;
磁盘的I/O性能决定了数据库的性能。
数字的查询和排序操作优于char和varchar;

decimal 与 float 如何选择:

decimal用于存储精确数据
float只能用于存储非精确数据

char 与 varchar 如何选择:

如果列中要存储的数据长度差不多是一致的,则应该考虑用char,反之使用varchar。
如果列中的最大数据长度小于50byte(utf-8格式中大概13个字符),则一般也考虑用char。(如果这个 列很少用,内里基于节省空间和减少I/O的考虑,还是可以选择用varchar)
一般不宜定义大于50Byte的char类型列
在mysql中,utf8的一个字符占3个字节,
当某个字段的字符数大于15时,要用varchar,小于就用char

时间类型如何存储:

使用int来存储时间字段的优缺点
优点: 字段长度比datetime小。
缺点:使用不方便,要进行函数转换。
限制:只能存储到2038-1-19 11:14:07 即2^32为2147483648

注意事项:

主键: 可以存储业务主键(标识业务数据,进行标语表关联)和数据库主键(优化数据库)
避免使用外键约束: 降低数据导入效率,增加维护成本
避免使用触发器: 导致意想不到的数据异常,是业务逻辑变复杂
严禁预留字段

为什么反范式化

读 > 写
减少表的关联数量
增加数据的读取效率
反范式化一定要适度

维护数据

维护各优化中要做什么

1、维护数据字典
2、维护索引
3、维护表结构
4、在适当的时候对表进行水平拆分或垂直拆分

导出数据字典

SELECT a.table_name,b.TABLE_COMMENT,a.COLUMN_NAME,a.COLUMN_TYPE,a.COLUMN_COMMENT FROM information_schema.COLUMNS a JOIN information_schema.TABLES b ON a.table_schema = b.table_schema AND a.table_name = b.table_name WHERE a.table_name = 'customer'

如何维护索引

建立索引:出现在WHERE从句, GROUP BY从句, ORDER BY 从句中的列
可选择性高的列要放到索引的前面
索引中不要包括太长的数据类型

注意事项:

索引并不是越多越好,过多的索引不但会降低写效率而且会降低读的效率
定期维护索引碎片
在SQL语句中不要使用强制索引关键字

数据库中适合的操作

批量操作
禁止使用 select * 这样的查询
控制使用用户自定义函数
不要使用数据库中的全文索引

垂直拆分:

经常一起查询的列放在一起
text,blob等大字段拆分出到附加表中

水平拆分

表结构相同 数据不同
通过主键hash->平均分表
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
存储 设计模式 网络协议
AD域 概述以及结构与存储技术
AD域 概述以及结构与存储技术
1569 0
AD域 概述以及结构与存储技术
|
Java API 图形学
JAVA读取EMF文件并转化为PNG,JPG,GIF格式
JAVA读取EMF文件并转化为PNG,JPG,GIF格式 使用第三方库下载地址为:http://java.freehep.org/vectorgraphics/index.html 主要思路: 使用EMFInputStream读取EMF文件,然后使用EMFRenderer对象将EMF绘制到创建 好的空白的BufferedImage里面。
2209 0
|
12月前
|
JavaScript
在 Vue.js 中使用 watch 来监听对象属性的变化
在 Vue.js 中使用 watch 来监听对象属性的变化
|
10月前
|
存储 安全 关系型数据库
2024 Mysql基础与进阶操作系列之MySQL触发器详解(21)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
MySQL触发器的使用场景之数据完整性约束、如何具体创建person的日志表、触发器与存储过程的对比与选择、触发器的性能和注意事项等具体操作详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(基础篇)
从Java环境的搭建到实际代码的编写,从基本用法的讲解到底层原理的剖析,深度解析Java基础知识。本文是《Java学习路线》专栏的起始文章,旨在提供一套完整的Java学习路线,覆盖Java基础知识、数据库、SSM/SpringBoot等框架、Redis/MQ等中间件、设计模式、架构设计、性能调优、源码解读、核心面试题等全面的知识点,并在未来不断更新和完善,帮助Java从业者在更短的时间内成长为高级开发。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(基础篇)
|
存储 Shell Linux
Linux(25) 如何解决Linux终端乱码问题
Linux(25) 如何解决Linux终端乱码问题
421 1
|
存储 关系型数据库 MySQL
探讨MySQL什么情况下触发表锁,行锁
MySQL是一种流行的关系型数据库管理系统,它支持多种存储引擎,例如MyISAM和InnoDB。在并发访问数据库的环境下,为了保证数据的完整性和一致性,MySQL会使用锁机制来控制对数据的访问。MySQL中的锁分为表级锁和行级锁,它们在不同的情况下会被触发。
1503 0
|
算法 Java Go
Go语言GC:详解GC的五个阶段
【2月更文挑战第20天】
393 0
|
人工智能 测试技术
LLaMA-2-7B数学能力上限已达97.7%?Xwin-Math利用合成数据解锁潜力
【2月更文挑战第24天】LLaMA-2-7B数学能力上限已达97.7%?Xwin-Math利用合成数据解锁潜力
133 1
LLaMA-2-7B数学能力上限已达97.7%?Xwin-Math利用合成数据解锁潜力
|
存储 数据库连接 数据库
逆向学习数据库篇:表设计和数据库操作的核心概念与流程
逆向学习数据库篇:表设计和数据库操作的核心概念与流程
86 0