【十六】MySQL数据库设计篇

MySQL数据库设计篇

概述

         做服务端开发离不开数据库设计,虽然说服务端技术一直在革新,但是MySQL一直都是我们首选使用的关系型数据库。服务端开发一直以来都是采用数据驱动研发的思想,可见数据库设计是非常重要的,数据库设计的好坏对软件设计影响非常大。后来由埃里克·埃文斯(Eric Evans)在他的著作《领域驱动设计:软件核心复杂性应对之策》(Domain-Driven Design: Tackling Complexity in the Heart of Software,2003)中首次提出领域驱动设计思想,我们开始接触和转变软件设计思想,但是数据库设计依然是非常的重要。如下图所示展示的是两种软件设计思想:

图1 数据驱动研发,领域驱动研发

         工作了很多年依然很多人一直在crud,自我感觉工作中也都没问题,产品给出来的需求也都能得心应手,但是猛然回头却发现自己积累的只是经验,多年工作积累经验成为了一名有经验的码农,这里还有很多人会抱怨这家公司学不到东西,实则却是自己没有去思考软件设计。正如数据库设计是软件设计工作中重要的一环,如果不去思考如何提高自己的数据库设计能力,那也是自己没有理解软件研发是一项设计工作导致的。

        聊到数据库设计,大家基本都想到的是三范式,三范式是数据库设计的基本原则,我们在设计过程中都是要考虑的,那么还有其他方面要考虑吗,当然是有的,如下图所示:

        图2 mysql数据库设计

        如上图展示,是我根据阅读资料和以往经验总结的数据库设计要考虑的各方面,本文将介绍一下各模块的内容。

一、三范式

1.第一范式(确保每列保持原子性)

第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。

2.第二范式(确保表中的每列都和主键相关)

第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。

3.第三范式(确保每列都和主键列直接相关,而不是间接相关)

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

二、表类型(存储引擎)选择

        首先我们要了解存储引擎的作用,如下图所示是MySQL的逻辑架构图:

从图中可以看出存储引擎的作用,MySQL是一款支持多存储引擎的数据库,用户可以根据针对不同的存储需求可以选择最优的存储引擎,那么MySQL支持哪些存储引擎呢?

        据了解MySQL 5.0支持的存储引擎包括MyISAM、InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDB Cluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等,其中 InnoDB和BDB提供事务安全表,其他存储引擎都是非事务安全表。创建新表时如果不指定存储引擎,那么系统就会使用默认存储引擎,MySQL 5.5之前的默认存储引擎是MyISAM,5.5之后改为了InnoDB。

        在做数据库设计的时候我们需要了解如何选择合适的存储引擎,下面罗列两个常用的存储引擎的特性:

        MyISAM:适用于应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高。

        InnoDB:用于事务处理应用程序,支持外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询以外,还包括很多的更新、删除操作。

三、选择合适的数据类型

        做数据库设计很多的工作都是在思考选用哪种数据类型最合适,我总结主要就是一下几种常见情况:

        1、字符串存储数据类型选用

        字符串存储主要就是CHAR和VARCHAR,特性对比如下:

        2、大文本存储数据类型选用

        遇到需要保存较大文本时,我们就会考虑到TEXT或者BLOB。二者之间的主要差别是BLOB能用来保存二进制数据,比如照片;而TEXT只能保存字符数据,比如一篇文章或者日记。TEXT和BLOB中又分别包括TEXT、MEDIUMTEXT、LONGTEXT和BLOB、MEDIUMBLOB、LONGBLOB三种不同的类型,它们之间的主要区别是存储文本长度不同和存储字节不同,用户应该根据实际情况选择能够满足需求的最小存储类型。

        3、数值型存储数据类型选用

        如下图所示是MySQL数值类型的特性对比:

        根据以往设计经验总结,在存储数值型场景中我们主要考虑如下:

        (1)、存储的是整数还是浮点数

        (2)、存储的数据最大、最小值范围

        (3)、存储的数据精度

根据以上考虑因素我们来确定数据类型。

        4、日期型存储数据类型选用

        MySQL提供的常用日期类型有DATE、TIME 、DATETIME、TIMESTAMP,如下图展示的是日期和时间类型的特性,我们根据存储格式要求选用就可以了:

四、字符集

        字符集这块实际上是计算机层面考虑的,计算机最初由美国科学家发明出来的,他们制定了一套编码,称为ASCII编码,但是这套编码并没有考虑到全球各个国家的需求,这样肯定是行不通的,于是各地区根据需要在其基础上进行了编码扩展,这样的话就会导致一个问题乱码,所以我们在日常数据库设计中需要考虑系统的编码,避免出现编码选取不当导致系统乱码的困境。

五、索引的设计

        索引可以极大的提高数据库的查询性能,索引设计的好坏直接影响系统的性能。

MySQL索引类型主要有以下几种:

  1. 普通索引:最基本的索引类型,没有唯一性的限制。

  2. 唯一索引:与普通索引类似,但区别在于唯一索引列的每个值都必须是唯一的。

  3. 主键索引:特殊的唯一索引,不允许有空值,多用于主表的主键。

  4. 组合索引:多列值组合成一个索引。

  5. 全文索引:主要用来搜索文本类型的数据,如字符串类型的数据。

  6. 空间索引:使用空间数据类型的列上,例如GEOMETRY,可以加快空间数据的查询速度。

六、sql mode

        MySQL可以运行在不同的SQL Mode(SQL模式)下,SQL Mode定义了MySQL应支持的SQL语法、数据校验等,我们可以根据应用场景选用不同的SQL Mode,MySQL中的SQL Mode如下所示:

七、安全

        数据安全我认为是系统设计最重要一方面,保证数据安全实际就是要先保证数据库安全,这块也是很多方面需要考虑,比如SQL注入、敏感数据脱敏、数据库高可用、数据异地多中心等

总结

        紧赶慢赶文章总算是结束了,因为明天要加班,根据自己制定的每周一篇的计划,今晚必须要完成文章的书写工作,一直没有审稿的习惯,本次编写也没来得及审稿先发出了,后续阅读到有不清楚的地方再做细节调整。

        本文意在总结数据库设计各方面的思考路线,一直依赖也都是按积累的经验和数据库知识来做数据库设计的工作,并没有一套成体系的方案,近期因为有一部分工作是审核团队的系统设计,突然想到了数据库设计这一环节是非常重要的,所以考虑把审核的思路整理成体系。希望本文给读者也能带来启发,在此先感谢每一位读者阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/767135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

01.重新认识文件(Linux基本概念)

知识引入: 我们经常使用word或者wps写的论文、作业等都是文件,而我们这样对文件的认识也比较片面。我们是否思考过,如果文件里面没有写东西,那么计算机会不会保存呢?答案是,肯定会的。因为我们每次建的空文…

Linux下对线程的认识+生产消费者模型+信号量

线程的概念 线程是进程内部中更加轻量化的一种执行流。线程是CPU调度的基本单位,而进程是承担系统资源的实体。就是说一个进程中可能会有多个线程,而在Linux内核中并没有真正重新的创建线程并重新进行资源分配,因为我们每个线程指向的资源都是…

力扣---最长回文子串---二维动态规划

二维动态规划思路: 首先,刚做完这道题:力扣---最长有效括号---动态规划,栈-CSDN博客,所以会有一种冲动,设立g[i],表示以第i位为结尾的最长回文子串长度,然后再遍历一遍取最大长度即可…

【图解物联网】第8章 物联网与机器人

8.1 由设备到机器人 把我们身边形形色色的“物”都连接到互联网,这就是物联网。物联网中使用的设备随着时间的推移在不断进化,这条进化之路的前方到底有什么呢?这里我们就围绕其中一种形式,即机器人来对讨论一下这个问题。 8.1…

使用Python的scipy.integrate计算微积分

先上一个二重积分计算,来自2022年考研数学第二题 进行计算前先在终端下载 scipy包 pip install scipy 在脚本中先导入所需要的模块 import scipy.integrate as spi 定义函数f(x, y) ,所得值返回 def f(x, y): return y / (1 x**3)**0.5 定义…

基于springboot+vue的影院订票系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

LeetCode Python - 71. 简化路径

目录 题目描述解法运行结果 题目描述 给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’ 开头),请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中,一个点(.&…

一图理解递归-算法通关村

一图理解递归-算法通关村 递归是我们算法进阶的基础,是必须要掌握的内容,只有掌握了递归才算真的会算法。与递归有关的问题有: 与树和二叉树相关的大部问题二分查找相关的问题快速排序、归并排序相关的问题所有回溯的问题所有动态规划的问题 …

大数据分析-基于Python的网络爬虫及数据处理---智联招聘人才招聘特征分析与挖掘的算法实现

概要 随着科学技术的发展,人类进入了互联网时代,不仅数据量庞大,而且数据种类繁多,Python简单易学, 语法清晰,在数据操作方面有着一定优势,成为了数据采集和可视化领域的热门语言。本论文主要是使用Python来…

Kruskal最小生成树【详细解释+动图图解】【sort中的cmp函数】 【例题:洛谷P3366 【模板】最小生成树】

文章目录 Kruskal算法简介Kruskal算法前置知识sort 中的cmp函数 算法思考样例详细示范与解释kruskal模版code↓ 例题:洛谷P3366 【模板】最小生成树code↓完结撒花QWQ Kruskal算法简介 K r u s k a l Kruskal Kruskal 是基于贪心算法的 M S T MST MST 算法&#xff…

导师坚鹏:厦门火炬高新区数字化转型战略蓝图从规划到落地培训

厦门火炬高新区战略制胜:数字化转型战略蓝图从规划到落地培训 厦门国家火炬高技术产业开发区(简称“厦门国家火炬高新区”)1991年被国务院批准为全国首批国家级高新区,是全国三个以“火炬”冠名的国家高新区之一。目前&#xff0c…

Excel通过下拉菜单,显示不同图片

背景:有的时候需要通过更改下拉菜单来改变对应的 值/ 图片。 如果是数值的话就是我们常常用的Vlookup,这个可以很简单的实现这个功能。(这个如果不知道请自行百度) 但是如果是图片呢?这个就不常见了,那么…

芯片工程系列(5)2.5D 3D封装

0 英语缩写 硅通孔(Through Silicon Via,TSV)硅中介层(Silicon Interposer)物理气象沉淀法(Physical Vapor Deposition,PVD)DRIE、CVD、PVD、CMP等设备CoWoS(Chip on Wa…

【开发环境搭建篇】Nacos的安装和配置

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是&#xff0…

安卓手机系统跳过app启动广告软件

跳过广告关于此应用声明: 应用利用了安卓系统的辅助功能API,可以读取您手机屏幕上显示的所有内容,并且可以以您的名义进行屏幕点击等操作。* 轻量无广告,不联网,也不需要任何权限;* 请务必在系统设置中开启…

Redis中AOF、RDB和复制功能对过期键的处理

AOF、RDB和复制功能对过期键的处理 生成RDB文件 在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时,程序会对数据库中的键进行检查,已过期的键不会被保存到新创建的RDB文件中。 例子 举个例子,如果数据库中包含三个键k1、k2、k3&#x…

【目标检测实验系列】AutoDL线上GPU服务器租用流程以及如何用Pycharm软件远程连接服务器进行模型训练 (以Pycharm远程训练Yolov5项目为例子 超详细)

目录 1. 文章主要内容2. 租用AutoDL服务器详细教程2.1 注册AutoDL账号,并申请学生认证(学生认证有优惠,如果不是学生可以忽略此点)2.2 算力市场选择GPU,并选择初始化配置环境2.3 控制台参数解析,并使用相关参数登录Xftp(Windows与…

Office办公软件之word的使用(一)

前几天调整公司招标文件的格式,中途遇到一些问题,感觉自己还不是太熟悉操作,通过查阅资料,知道了正确的操作,就想着给记下来。如果再次遇到,也能很快地找到解决办法。 一、怎么把标题前的黑点去掉 解决办法…

[ C++ ] STL---list的模拟实现

目录 结点类的模拟实现 迭代器类的模拟实现 构造函数 前置与后置 前置- -与后置 - - 与 !运算符重载 * 运算符重载 -> 运算符重载 普通迭代器总体实现代码 list类的实现 list类的成员变量 构造函数 迭代器 insert() erase() push_front/push_back…

【SQL】1527. 患某种疾病的患者(like;通配符)

前述 知识点回顾: MySQL 使用OR在LIKE查询中比较多个字段 %:表示任意字符(包括0个或多个)_:表示任意单个字符匹配空格:直接用空格就行,例如,% DIAB1%可以匹配字符串ACNE DIAB100 …