系列文章目录
MySQL存储过程和触发器_mysql 存储过程-CSDN博客
目录
前言
本文介绍了MySQL数据库设计的关键步骤和规范。主要内容包括:1)数据库设计的4个步骤:需求分析、概念设计、逻辑设计和物理设计;2)三大范式(1NF、2NF、3NF)的定义及作用,重点分析了不满足范式可能引发的数据冗余、更新异常等问题;3)三种关系(一对一、一对多、多对多)的实现方式;4)E-R图的使用方法;5)数据库扩展性设计考虑,如冗余字段和预留字段的应用。文章为数据库设计提供了系统性的指导思路。
提示:以下是本篇文章正文内容,下面案例可供参考
一、数据库设计的主要步骤
数据库设计分为 4 个步骤:
1. 需求分析:阅读需求文档,提取概念类以及类的属性;
2. 概念设计:绘制 ER 图,和需求方进行沟通;
3. 逻辑设计:确定数据库的名字,表的名字,表中字段的名字,类型和约束,以及数据库设计的其它规范,类如还需设计哪些公共字段等,编写 SQL 代码;
4. 物理设计:考虑当前系统数据库服务器的分配;
二、数据库中的范式
数据库设计中常用的有三大范式:第一范式,第二范式和第三范式;
第一范式:
满足表中的列是不可分割的原子数据项,即天然满足第一范式;
如果表中的列是一个类,还可再拆分成更多的列,那么就不满足第一范式;
反例:学生表中有一个学校的列,学校还可以拆分成学校地址,学校电话,那么就不满足第一范式;
第二范式:
满足第一范式的基础上,不存在非关键字段对任意候选键的部分函数依赖,即满足第二范式;
候选键指的是可以唯一标识一行数据的列或者列的组合,可以从候选键中选一个或者多个当作表的主键;
部分依赖指的是多个列作为表的主键时,非关键字段依赖主键的某个列,不依赖于全部列;
当主键只有一列时,天然就满足第二范式;
反例:学生课程成绩表中,学号和课程作为主键,学生的个人信息都只依赖于学号,课程相关的信息都只依赖于课程,那么这就属于部分依赖,不满足第二范式;
第三范式:
在满足第二范式的基础上,不存在非关键字段,对任一候选键的传递依赖;
反例:例如在学生表中存在“学院”,“学院电话”,“学院地址”等字段,“学院电话”和“学院地址”是依赖“学院”的,而不是依赖主键,这就是传递依赖,不满足第三范式;
三、数据库范式解决的问题
主要涉及第二范式,不满足第二范式,可能会出现以下问题:
1. 数据冗余
不满足第二范式,多个列组合成一个主键,可能会存在部分依赖。
这种情况下会出现大量的冗余字段,造成大量的数据冗余;
例如:学生表中,学生 ID 和 课程组合称为主键,每个学生信息后面都会出现课程相关的字段,比如学分,重复出现造成了大量的数据冗余;
2. 更新异常
如果要调整冗余字段,就会涉及到表中的所有相关行,一旦执行中断,数据就会更新失败,造成了行与行数据不一致的情况;
例如:学生表中,如果要更新课程相关的学分,就会涉及到修改多行数据,如果更新终端,那么就会出现同一门课程,学分不一致的情况;
3. 插入异常
例如:学生课程成绩表中,学生只有参加考试获得成绩,才会生成一条记录。当一门新课,还没有学生参加考试取得成绩,这门课程在数据库中就不存在,因为成绩为空的时候,记录没有意义;
4. 删除异常
例如:学生课程成绩表中,如果将所有学生的成绩都删除,课程和学生的信息也会被删除,数据库中没有学生和课程的信息;
四、数据的完整性与安全性
数据完整性是通过数据库的一些约束,比如非空,外键约束,默认值等,进行数据校验,避免非法数据,保证数据的完整性;
数据的安全性是通过权限分级,避免所有人都可以访问数据库,对数据造成破坏;
五、一对一,一对多,多对多关系在数据库中的实现方式
一对一:
创建两个数据表,在其中一个表中创建一个关联字段,实现建立关联关系;
例如:用户表和账户表,在和用户表中增加一个账户ID字段,或者在账户表中增加一个用户ID字段,都可以将两张表关联起来;
一对多:
创建两个数据表,在多的一方增加一个关联字段,实现建立关联关系;
例如:班级表和学生表,在学生表中增加一个班级ID字段,将两张表关联起来;同时也可以建立一个外键关系;
多对多:
建立两张数据表,再建立一个关联表,实现建立关联关系;
例如:学生表和课程表,可以在建立一个关联表,包含学生ID和课程ID字段,将两张表关联起来;
六、如何使用E-R图进行数据库设计
E-R 图是实体关系图,包含实体,属性和关系,实体指类,用矩形表示,属性指列,用椭圆表示,关系指实体之间的关系,用菱形表示;
一对一:
一对多:
多对多:
七、在数据库设计阶段考虑扩展性
冗余字段:由于考虑到数据库的性能,往往会反范式设计,增加一些关键字段的冗余字段,避免频繁的联表查询;
预留字段:后续迭代需求时,可以对数据库结构进行小的改动;