MySQL——数据库设计三范式

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键, 不要产生部分依赖。

image.png


数据库设计范式共有3个


第一范式:要求任何一张表必须有主键,每一个字段原子性不可再分。


第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键, 不要产生部分依赖。


第三范式:建立在第二范式的基础之上,要求所有非主键字段直接依赖主键, 不要产生传递依赖。


设计数据库表的时候,按照以上的范式进行,可以避免表中数据的冗余,空间的浪费。


第一范式


最核心,最重要的范式,所有表的设计都需要满足。必须有主键,并且每一个字段都是原子性不可再分。


学生编号 学生姓名 联系方式
------------------------------------------
1001    张三    zs@gmail.com,1359999999
1002    李四    ls@gmail.com,13699999999
1001    王五    ww@163.net,13488888888
以上是学生表,满足第一范式吗?
  不满足,第一:没有主键。第二:联系方式可以分为邮箱地址和电话
学生编号(pk) 学生姓名 邮箱地址      联系电话
----------------------------------------------------
1001    张三    zs@gmail.com  1359999999
1002    李四    ls@gmail.com  13699999999
1003    王五    ww@163.net    13488888888


第二范式


4.4、第二范式:建立在第一范式的基础之上, 要求所有非主键字段必须完全依赖主键,不要产生部分依赖。


学生编号 学生姓名 教师编号 教师姓名

1001 张三 001 王老师 1002 李四 002 赵老师 1003 王五 001 王老师 1001 张三 002 赵老师


这张表描述了学生和老师的关系:(1个学生可能有多个老师,1个老师有多个学生) 这是非常典型的:多对多关系!


分析以上的表是否满足第一范式? 不满足第一范式。


怎么满足第一范式呢?修改


学生编号+教师编号(pk) 学生姓名  教师姓名


1001 001 张三 王老师 1002 002 李四 赵老师 1003 001 王五 王老师 1001 002 张三 赵老师


学生编号 教师编号,两个字段联合做主键,复合主键(PK: 学生编号+教师编号) 经过修改之后,以上的表满足了第一范式。但是满足第二范式吗? 不满足,“张三”依赖1001,“王老师”依赖001,显然产生了部分依赖。 产生部分依赖有什么缺点? 数据冗余了。空间浪费了。“张三”重复了,“王老师”重复了。


为了让以上的表满足第二范式,你需要这样设计: 使用三张表来表示多对多的关系!!!! 学生表


学生编号(pk) 学生名字


1001 张三 1002 李四 1003 王五


教师表


教师编号(pk) 教师姓名


001 王老师

002 赵老师


学生教师关系表


id(pk) 学生编号(fk) 教师编号(fk)

1 1001 001 2 1002 002 3 1003 001 4 1001 002


背口诀: 多对多怎么设计?多对多,三张表,关系表两个外键!


第三范式


第三范式建立在第二范式的基础之上 要求所有非主键字典必须直接依赖主键,不要产生传递依赖。


学生编号(PK) 学生姓名 班级编号  班级名称


1001 张三 01 一年一班 1002 李四 02 一年二班 1003 王五 03 一年三班 1004 赵六 03 一年三班


以上表的设计是描述:班级和学生的关系。很显然是1对多关系! 一个教室中有多个学生。


分析以上表是否满足第一范式? 满足第一范式,有主键。


分析以上表是否满足第二范式? 满足第二范式,因为主键不是复合主键,没有产生部分依赖。主键是单一主键。


分析以上表是否满足第三范式? 第三范式要求:不要产生传递依赖! 一年一班依赖01,01依赖1001,产生了传递依赖。 不符合第三范式的要求。产生了数据的冗余。


那么应该怎么设计一对多呢?


班级表:一


班级编号(pk) 班级名称


01 一年一班 02 一年二班 03 一年三班


学生表:多


学生编号(PK) 学生姓名 班级编号(fk)


1001 张三 01 1002 李四 02 1003 王五 03 1004 赵六 03


背口诀:一对多,两张表,多的表加外键!!


表的设计总结


总结表的设计?


一对多: 一对多,两张表,多的表加外键


多对多: 多对多,三张表,关系表两个外键


一对一: 一对一放到一张表中不就行了吗?为啥还要拆分表? 在实际的开发中,可能存在一张表字段太多,太庞大。这个时候要拆分表。 一对一怎么设计? 没有拆分表之前:一张表 t_user id login_name login_pwd real_name email


1 zhangsan 123 张三 zhangsan@xxx 2 lisi 123 李四 lisi@xxx


这种庞大的表建议拆分为两张:t_login 登录信息表 id(pk) login_name login_pwd


1 zhangsan 123 2 lisi 123


t_user 用户详细信息表


id(pk) real_name email login_id(fk+unique)


100 张三 zhangsan@xxx 1 200 李四 lisi@xxx 2


口诀:一对一,外键唯一


数据库设计实际中要注意的


数据库设计三范式是理论上的。


实践和理论有的时候有偏差。


最终的目的都是为了满足客户的需求,有的时候会拿冗余换执行速度。


因为在sql当中,表和表之间连接次数越多,效率越低。(笛卡尔积)


有的时候可能会存在冗余,但是为了减少表的连接次数,这样做也是合理的, 并且对于开发人员来说,sql语句的编写难度也会降低。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
13天前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
52 3
|
7天前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
8天前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
7天前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
13天前
|
Ubuntu 安全 关系型数据库
安装与配置MySQL 8 on Ubuntu,包括权限授予、数据库备份及远程连接指南
以上步骤提供了在Ubuntu上从头开始设置、配置、授权、备份及恢复一个基础但完整的MySQL环境所需知识点。
188 7
|
13天前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
59 1
|
13天前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
28天前
|
安全 关系型数据库 MySQL
MySQL安全最佳实践:保护你的数据库
本文深入探讨了MySQL数据库的安全防护体系,涵盖认证安全、访问控制、网络安全、数据加密、审计监控、备份恢复、操作系统安全、应急响应等多个方面。通过具体配置示例,为企业提供了一套全面的安全实践方案,帮助强化数据库安全,防止数据泄露和未授权访问,保障企业数据资产安全。
|
19天前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
2月前
|
存储 运维 关系型数据库
从MySQL到云数据库,数据库迁移真的有必要吗?
本文探讨了企业在业务增长背景下,是否应从 MySQL 迁移至云数据库的决策问题。分析了 MySQL 的优势与瓶颈,对比了云数据库在存储计算分离、自动化运维、多负载支持等方面的优势,并提出判断迁移必要性的五个关键问题及实施路径,帮助企业理性决策并落地迁移方案。

推荐镜像

更多