详解MySQL 数据库范式

yizhihongxing

详解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日

相关文章

  • pgsql之pg_stat_replication的使用详解

    pg_stat_replication的使用详解 什么是pg_stat_replication pg_stat_replication是PostgreSQL的一个系统视图(View),它展示了当前所有的流复制(replication)的信息。 如何查询pg_stat_replication 直接查询pg_stat_replication即可,如下所示: SE…

    database 2023年5月22日
    00
  • 基于springboot和redis实现单点登录

    接下来我将详细讲解“基于springboot和redis实现单点登录”的完整攻略,过程中将包含两个示例说明。 1. 基础知识 1.1 什么是单点登录? 单点登录(Single Sign-On,简称SSO)是一种允许用户使用一个帐户和密码访问多个应用程序的技术。在实现SSO时,用户只需要在一个应用程序中进行身份验证,然后就可以访问其他应用程序,而无需再次输入身…

    database 2023年5月22日
    00
  • 探讨:MySQL中如何查询当前正在运行的SQL语句

    MySQL中查询当前正在运行的SQL语句的方法是通过查看系统表来实现的。可以使用以下步骤进行查询: 步骤1:连接到MySQL服务器 使用以下命令以管理员身份连接到MySQL服务器: mysql -u root -p 输入你的密码以获得管理员权限。 步骤2:选择数据表 进入MySQL数据库,并使用以下命令来选择包含正在运行SQL语句的系统表: USE info…

    database 2023年5月22日
    00
  • CentOS系统中安装MySQL和开启MySQL远程访问的方法

    下面是CentOS系统中安装MySQL和开启MySQL远程访问的方法的完整攻略: 安装MySQL 步骤1:添加MySQL Yum存储库 在终端中以root用户身份运行以下命令: yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm 步骤2:安…

    database 2023年5月22日
    00
  • Centos7使用yum安装Mysql5.7.19的详细步骤

    下面我将详细讲解“CentOS7使用yum安装MySQL5.7.19”的详细步骤,包含以下几个步骤: 1. 更新yum源 在进行任何软件安装之前,都要先更新系统的yum源,以避免因为使用旧版本的软件源而导致安装失败或是存在安全漏洞的情况。在终端中输入以下命令: sudo yum update 2. 添加MySQL Yum Repository 由于CentO…

    database 2023年5月22日
    00
  • MySQL利用UNION连接2个查询排序失效详解

    MySQL中的UNION操作符可以将两个或多个SELECT语句的结果集合并在一起,而且不会重复。在使用UNION连接两个查询进行排序时,需要注意以下问题: UNION前后查询的字段数必须相等,且类型也要一致; UNION连接查询的结果集会自动去重,需要使用UNION ALL才能保留重复的记录; UNION操作会对所有的查询进行排序,而且会消耗更多的资源。 下…

    database 2023年5月22日
    00
  • 基于Morphia实现MongoDB按小时、按天聚合操作方法

    下面是详细讲解基于Morphia实现MongoDB按小时、按天聚合操作的完整攻略: 1. 安装Morphia 首先需要安装Morphia,可以通过以下方式进行安装: <dependency> <groupId>org.mongodb.morphia</groupId> <artifactId>morphia&l…

    database 2023年5月21日
    00
  • docker容器如何优雅的终止详解

    下面是关于“docker容器如何优雅的终止”的详细讲解及示例说明。 什么是优雅的终止 在docker容器运行中,需要进行终止操作。但是,如果直接使用docker stop 命令终止容器,在终止时,容器会直接被强制关闭,可能会导致数据丢失或意外错误发生。为了优雅地终止容器,可以使用一种更加安全和有效的方式,也就是所谓的“优雅终止(Graceful Termin…

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