详解MySQL 数据库范式

详解MySQL 数据库范式

什么是数据范式

数据范式是一种设计数据库表的标准,它能够减少数据冗余,提高数据管理的效率,降低了数据修改所造成的风险。

数据范式根据数据之间的关系,分为不同级别。较低级别的范式被包含在较高级别的范式之中。

目前最广泛使用的范式有6个级别,分别是第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF,也叫做完全性范式)。

为什么要使用数据范式

当设计数据库表时,数据冗余的存在会带来以下问题:

  • 数据修改异常:如果数据的多个实例之间存在不一致性,进行修改时需要在多处修改,容易造成错误。
  • 数据插入异常:由于表中某些数据需要依赖于其它数据,如果某些数据未插入,会导致不能插入它依赖的数据的问题。
  • 数据删除异常:如果删除某个数据会导致其它数据无法被检索到的问题。

使用数据范式能够有效的避免这些冗余和异常。

常见的数据范式

第一范式(1NF)

第一范式就是指要求数据库表的所有字段都是不可分割的原子值。

举例来说,存在以下一张 Order 表:
| 订单ID | 顾客信息 | 订单日期 | 金额 |
|-------|---------|--------|------|
| 1 | {"姓名":"Tom", "手机号":"12345678"} | 2020-12-01 | 100 |
| 2 | {"姓名":"Jerry", "手机号":"87654321"} | 2020-12-02 | 200 |

顾客信息这个字段不是原子值,而且存在多个信息项,应该拆分为两个字段:姓名和手机号。修改后的表结构如下:
| 订单ID | 姓名 | 手机号 | 订单日期 | 金额 |
|-------|------|-------|--------|------|
| 1 | Tom | 12345678 | 2020-12-01 | 100 |
| 2 | Jerry | 87654321 | 2020-12-02 | 200 |

第二范式(2NF)

第二范式是在第一范式的基础上,要求表中的非主键列完全依赖于主键。

举例说明,以下是一张班级成绩表:
| 班级ID | 学生ID | 学生姓名 | 课程名称 | 成绩 |
|-------|---------|--------|--------|-----|
| 1 | 1001 | Tom | 语文 | 80 |
| 1 | 1002 | Jerry | 语文 | 90 |
| 1 | 1003 | Mary | 数学 | 70 |
| 2 | 1004 | Peter | 语文 | 85 |

在该表中,主键是由班级ID和学生ID构成的联合主键,但是存在非主键列课程名称和成绩仅依赖于班级ID,裂解该表为两张表:

班级信息表:
| 班级ID | 学生ID | 学生姓名 |
|-------|---------|--------|
| 1 | 1001 | Tom |
| 1 | 1002 | Jerry |
| 1 | 1003 | Mary |
| 2 | 1004 | Peter |

成绩信息表:
| 班级ID | 学生ID | 课程名称 | 成绩 |
|-------|--------|--------|-----|
| 1 | 1001 | 语文 | 80 |
| 1 | 1002 | 语文 | 90 |
| 1 | 1003 | 数学 | 70 |
| 2 | 1004 | 语文 | 85 |

第三范式(3NF)

第三范式是在第二范式的基础上,要求表中的所有非主键列都不传递依赖于主键。

举例说明,以下是一张订单详情表:
| 订单ID | 商品ID | 商品名称 | 商品价格 | 商品品牌 | 供应商ID | 供应商名称 |
|-------|-------|--------|-------|-------|-------|-------|
| 1 | 1001 | 红富士 | 5.5 | 优选 | 2001 | 陈糖糖 |
| 2 | 1002 | 二哥 | 2.5 | 好吃 | 2002 | 宋老板 |
| 3 | 1003 | 福建石油茶 | 15 | 贵 | 2003 | 马金翠 |

在该表中,商品品牌和供应商名称对于商品和供应商来说不是原子值。商品品牌和供应商名称依赖于供应商ID,而商品品牌同时还依赖于商品ID,因此需拆分为多个表:

商品信息表:
| 商品ID | 商品名称 | 商品价格 | 供应商ID |
|--------|-------|--------|-------|
| 1001 | 红富士 | 5.5 | 2001 |
| 1002 | 二哥 | 2.5 | 2002 |
| 1003 | 福建石油茶 | 15 | 2003 |

供应商信息表:
| 供应商ID | 供应商名称 |
|--------|-------|
| 2001 | 陈糖糖 |
| 2002 | 宋老板 |
| 2003 | 马金翠 |

商品与供应商关系表:
| 商品ID | 供应商ID | 商品品牌 |
|--------|-------|-------|
| 1001 | 2001 | 优选 |
| 1002 | 2002 | 好吃 |
| 1003 | 2003 | 贵 |

总结

通过使用数据范式可以有效的规避数据冗余和异常,提高了数据库管理的效率和安全性。在设计数据表时,要根据实际需求和数据之间关系确定适用的范式。

以上就是关于MySQL数据库范式的简要介绍,还有其他更高级别的数据范式需要读者自行了解与实践。

如果您对数据范式有进一步的问题或者需要更详细的介绍,可以参考MySQL 官方文档或者其他相关资料。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解MySQL 数据库范式 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • MySQL查看视图方法详解

    MySQL中查看视图主要是通过SHOW FULL COLUMNS语句来实现,具体的步骤如下: 打开MySQL服务器并登录。 在MySQL shell或者工具中输入以下命令: SHOW FULL COLUMNS FROM 视图名称; 视图名称是你想要查看的视图名称。 执行该命令后,MySQL服务器将返回视图的字段信息,包括字段名称、数据类型、默认值、是否允许为…

    MySQL 2023年3月10日
    00
  • php在linux下检测mysql同步状态的方法

    以下是“php在linux下检测mysql同步状态的方法”的完整攻略: 1. 确认mysql主从同步状态 在开始检测mysql主从同步状态前,需要确认当前mysql主从同步是否已经正常运行。 可以通过以下命令查看mysql主从同步的状态: SHOW SLAVE STATUS\G 如果主从同步正常,那么Slave_IO_Running和Slave_SQL_Ru…

    database 2023年5月22日
    00
  • 怎么永久激活Navicat for MongoDB 附激活教程+注册机下载

    怎么永久激活Navicat for MongoDB 一、下载Navicat for MongoDB注册机 首先,我们需要下载Navicat for MongoDB的注册机,可以在百度上搜索“Navicat for MongoDB注册机下载”或在下载网站上进行搜索,如草窝网和天翼云盘等。 下载完注册机后,解压缩并运行软件。 二、下载Navicat for Mo…

    database 2023年5月22日
    00
  • MySQL中create table语句的基本语法是

    MySQL中create table语句是用于创建新表的关键字,其基本语法如下: create table table_name( column1 datatype, column2 datatype, column3 datatype, … ); 其中table_name是要创建的表的名称,column1, column2, column3, …是…

    database 2023年5月22日
    00
  • JDBC数据库的使用操作总结

    JDBC数据库的使用操作总结 什么是JDBC? JDBC(Java Database Connectivity)是Java语言操作数据库的标准规范之一,是一种用于执行SQL语句的Java API,可以访问各种关系型数据库,如Oracle、MySQL、SQL Server等。 使用JDBC可以连接数据库、执行SQL语句、处理结果集等,它能够让Java程序与各种…

    database 2023年5月19日
    00
  • Mysql中的Datetime和Timestamp比较

    当在MySQL中使用日期和时间数据时,Datatime和Timestamp是两种最常见的数据类型。虽然它们都可以用于存储日期和时间,但是它们在存储和比较方面有着不同的表现。 Datetime和Timestamp介绍 Datetime Datetime可以存储的日期和时间的范围是从 ‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:…

    database 2023年5月22日
    00
  • springboot使用alibaba的druid数据库连接池错误的问题及解决

    下面我来详细讲解“springboot使用alibaba的druid数据库连接池错误的问题及解决”的完整攻略。 问题描述 在使用Spring Boot项目中使用阿里巴巴的druid连接池进行数据库访问时,可能会遇到以下错误: com.alibaba.druid.pool.GetConnectionTimeoutException: timeout 该错误的原…

    database 2023年5月18日
    00
  • Linux oracle 9i图文安装教程六 完结篇

    Linux Oracle 9i图文安装教程六 完结篇 本篇为Linux Oracle 9i图文安装教程系列的最后一篇,主要讲解安装完成后的一些后续操作。 数据库服务启动 使用以下命令启动Oracle 9i数据库服务: # su oracle $ sqlplus /nolog SQL> connect / as sysdba SQL> startu…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部