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

相关文章

  • idea中连接数据库时出现SSL错误的问题

    关于“idea中连接数据库时出现SSL错误的问题”,整理了以下攻略供大家参考: 问题描述 在使用idea连接MySQL数据库时,出现如下错误:SSL connection error: SSL is required but the server doesn’t support it 问题分析 出现该错误的主要原因是MySQL数据库需要SSL协议进行访问,但…

    database 2023年5月18日
    00
  • 简单谈谈centos7中配置php

    请先确认您的CentOS 7操作系统已经安装并开启了Web服务器及PHP支持,可以执行以下命令进行确认: httpd -v php -v 如果以上两个命令都能正常给出版本号,则说明您的系统已经配置好了Web服务器和PHP支持,可以跳过下面的步骤直接配置。 如果您的系统没有配置好Web服务器和PHP支持,请先按照以下步骤进行安装配置。 1. 安装Web服务器 …

    database 2023年5月22日
    00
  • ROLAP、MOLAP和HOLAP的区别

    ROLAP、MOLAP和HOLAP均是OLAP(联机分析处理)的三种不同实现方式,它们都可以用于数据立方体的构建和查询,但是它们存在着一些差异。下面详细介绍一下它们的区别。 ROLAP ROLAP是“关系型联机分析处理”的缩写,它是一种基于关系型数据库实现的OLAP技术。在ROLAP中,数据仍然保存在关系型数据库中,因此,ROLAP具有较强的兼容性和可扩展性…

    database 2023年3月27日
    00
  • SQL 计算行数

    下面是SQL计算行数的攻略以及两个实例。 什么是SQL计算行数 SQL计算行数是指在数据库中进行数据查询时,我们可以使用SQL内置的函数COUNT()计算满足条件的记录数量,也就是行数。这个功能在实际开发中非常实用,可以帮助我们快速得到某个查询条件下的记录总数。 COUNT()函数使用方法 COUNT()函数是SQL中非常常用的一个聚合函数,主要用于计算满足…

    database 2023年3月27日
    00
  • redis requires ruby version2.2.2的解决方案

    针对“redis requires ruby version2.2.2”的解决方案,以下是完整攻略及两条示例说明: 问题描述 当我们在使用 Redis 的某些功能时,可能会出现以下错误提示: redis requires Ruby version 2.2.2 or newer. 这是因为 Redis 在某些操作时需要运行在指定版本的 Ruby 环境下,而当前…

    database 2023年5月22日
    00
  • oracle中decode函数的使用方法

    当我们处理一些数据时,经常会发现需要根据某个字段的值来决定程序中的处理逻辑。这时候,我们可以使用Oracle中的DECODE函数,它能快速地实现这一目的。本文将详细讲解DECODE函数的使用方法。 DECODE函数的基本语法 DECODE函数的基本语法如下: DECODE(expr, search1, result1, search2, result2, .…

    database 2023年5月21日
    00
  • Linux下编译安装Mysql 5.5的简单步骤

    以下是详细的Linux下编译安装MySQL 5.5的攻略: 准备工作 确保系统中已经安装了必要的依赖项,包括 cmake 和 gcc。如果没有安装,请使用以下命令安装: sudo apt-get install cmake gcc 下载并解压MySQL的源代码,可以从官网下载。解压后的文件夹名称为mysql-5.5.**,其中**代表版本号。 编译并安装 进…

    database 2023年5月22日
    00
  • MongoDB管理数据关系的3种方法

    MongoDB是一种非关系型数据库,用于存储和管理大量的、格式不固定的数据。MongoDB提供了一种灵活的数据模型,使得您可以轻松地存储和访问数据,而无需事先定义表结构。 在MongoDB中,关系的管理不同于传统的关系型数据库,因为它是基于文档的存储模型。 本文将详细介绍MongoDB中的关系管理,包括文档嵌套、引用和聚合等技术。 文档嵌套 文档嵌套是Mon…

    MongoDB 2023年3月14日
    00
合作推广
合作推广
分享本页
返回顶部