数据库范式(详细介绍)

目录

第一范式(原子性)

第二范式(主键唯一性)

第三范式(原子性+主键唯一性)

BC范式(3NFplus)


第一范式(原子性

确保每列保证原子性,保证这个属性(字段)不能在被分割。

不符合第一范式:

订单
--------------------------------------------------------------
| 订单编号 | 产品名称       | 产品价格          |
--------------------------------------------------------------
| 1      | 手机, 电脑, 鼠标 | 3000, 6000, 100    |
| 2      | 相机, 耳机       | 2000, 300          |
--------------------------------------------------------------
 

在这个例子中,"产品名称"和"产品价格"字段都包含了多个值,使用逗号分隔。这样的设计违反了第一范式(1NF),因为一个字段应该只包含一个值。

为了符合第一范式(1NF),我们可以将每个产品拆分成单独的行,如下所示:

订单
-----------------------------------
| 订单编号 | 产品名称 | 产品价格 |
-----------------------------------
| 1      | 手机   | 3000    |
| 1      | 电脑   | 6000    |
| 1      | 鼠标   | 100     |
| 2      | 相机   | 2000    |
| 2      | 耳机   | 300     |
-----------------------------------
在上述例子中,每个产品都被拆分成了单独的行,每行分别包含一个产品名称和对应的产品价格。这样就符合了第一范式(1NF),每个字段都是原子性的,不可再分。

第二范式(主键唯一性

第二范式在第一范式的基础上,消除了非主属性对于码的部分函数依赖。且增加了一列,这一列为主键列,非主属性都依赖主键列。且没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分,也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

例子:一个不符合第二范式可以是一个包含重复数据的数据库表。举个简单的例子,假设我们有一个存储订单信息的数据库表,其中包含订单号、顾客姓名和顾客地址等字段:

OrderDetails
-----------------------------------
| OrderID   | CustomerName | CustomerAddress |
-----------------------------------
| 1         | Alice        | 123 Main St     |
| 2         | Bob          | 456 Park Ave  |
| 3         | Alice        | 123 Main St     |
-----------------------------------

在这个例子中,可以看到同一个顾客的姓名和地址信息出现了多次。这种情况下,就不符合第二范式(2NF),因为有部分字段依赖于订单号,而另一部分字段依赖于顾客姓名。这样的表结构存在以下问题:

  1. 数据冗余:同一个顾客的姓名和地址信息重复出现,会导致数据冗余,增加了存储空间的消耗。

  2. 更新异常:如果需要更新顾客的地址,那么就需要同时更新多条记录,容易出现更新异常,导致数据不一致。

第三范式(原子性+主键唯一性

第三范式在第二范式的基础之上,消除了非主属性对于码的传递函数依赖。就是说任何非主属性不依赖于其它非主属性。

一个不符合第三范式(3NF)的例子可以是一个存储产品信息的数据库表,其中包含了产品编号、产品名称、供应商编号、供应商名称和供应商地址等字段:

Products
-------------------------------------------------
| ProductID   | ProductName  | SupplierID | SupplierName | SupplierAddress |
-------------------------------------------------
| 1           | Laptop       | 101        | ABC Inc      | 123 Main St     |
| 2           | Smartphone   | 102        | XYZ Ltd      | 456 Park Ave    |
| 3           | Tablet       | 101        | ABC Inc      | 123 Main St     |
-------------------------------------------------

在这个例子中,可以看到存在以下问题:

  1. 数据冗余:同一个供应商的名称和地址信息重复出现,会导致数据冗余,增加了存储空间的消耗。

  2. 更新异常:如果需要更新某个供应商的地址,那么就需要同时更新多条记录,容易出现更新异常,导致数据不一致。

为了符合第三范式,我们可以将上述表拆分成两个表:

Products
---------------------------------
| ProductID   | ProductName  |
---------------------------------
| 1           | Laptop       |
| 2           | Smartphone   |
| 3           | Tablet       |
---------------------------------

Suppliers
---------------------------------
| SupplierID | SupplierName | SupplierAddress |
---------------------------------
| 101        | ABC Inc      | 123 Main St     |
| 102        | XYZ Ltd      | 456 Park Ave    |
---------------------------------
这样就将产品信息和供应商信息分离开来,避免了数据冗余和更新异常,使得数据库表符合第三范式

BC范式(3NFplus)

BC范式(Boyce-Codd Normal Form)是关系数据库设计中的一种标准化范式。它建立在第三范式(3NF)的基础上,通过进一步消除非主属性对候选键的部分依赖来减少数据冗余。

简单来说,BC范式要求:

  1. 每个非主属性都完全依赖于候选键。也就是说,如果一个属性只依赖于候选键的一部分而不是全部,那么它就不符合BC范式。

  2. 所有的函数依赖都应该是候选键的超键。也就是说,任何非候选键的属性都不应该决定其他非候选键的属性。

BC范式的目标是消除数据冗余,并且确保数据的一致性和完整性。通过将关系数据库设计满足BC范式,可以提高数据库的性能和可维护性。

需要注意的是,BC范式是对关系数据库设计的理论指导,并不是必须遵守的绝对规则。在某些情况下,根据实际需求和性能考虑,可能需要在范式化和反范式化之间做出权衡。

举个例子:假设我们有一个关系数据库用于存储员工信息,包含以下字段:员工编号、姓名、部门、工资。

  1. 员工编号是主键(候选键),每个员工的编号唯一标识其身份。

  2. 姓名、部门和工资都完全依赖于员工编号。

在第三范式(3NF)下,我们可以将数据设计如下:

员工表
------------------------------------------------
| 员工编号 | 姓名     | 部门      | 工资      |
------------------------------------------------
| 001    | 张三   | 技术部   | 5000    |
| 002    | 李四   | 销售部   | 6000    |
| 003    | 王五   | 财务部   | 7000    |
------------------------------------------------

这个设计符合第三范式(3NF),因为每个非主属性(姓名、部门、工资)都完全依赖于候选键(员工编号),没有冗余数据

然而,如果我们进一步考虑BC范式,我们可能会发现在这个设计中存在一些函数依赖问题。假设每个部门都有一个负责人,那么我们可以将负责人作为一个新的实体来设计:

员工表
------------------------------------------------
| 员工编号 | 姓名     | 部门编号  | 工资      |
------------------------------------------------
| 001    | 张三   | 001      | 5000    |
| 002    | 李四   | 002      | 6000    |
| 003    | 王五   | 003      | 7000    |
------------------------------------------------

部门表
---------------------------------
| 部门编号 | 部门名称 | 负责人    |
---------------------------------
| 001    | 技术部   | 张三    |
| 002    | 销售部   | 李四    |
| 003    | 财务部   | 王五    |
---------------------------------
 

通过这种设计,我们将部门信息从员工表中分离出来,避免了部门信息的冗余。在部门表中,负责人属性只取决于部门编号,符合BC范式的要求。

这样的设计提高了数据的一致性和完整性,并且减少了冗余数据。根据实际需求和性能要求,我们可以在范式化和反范式化之间做出权衡,选择适合的数据库设计。

总结:

符合三大范式的数据库设计有助于保证数据的一致性、完整性和可维护性,提高查询效率,并节省数据存储空间。然而,在实际应用中,我们需要根据具体的业务需求和性能要求进行权衡,有时也需要适度地进行反范式化设计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot AOP切面实现对自定义注解的属性动态修改

文章目录 需求问题解决方案示例代码 需求 项目中共用了一个redis,而项目中部分代码使用了JetCache的Cached注解。所以需要给Cached动态配置area属性值,用来区分dev和test环境。 问题 自定义注解的属性值需要常量值,即static final修饰&…

学习-面试java基础-(集合)

String 为什么不可变? 1线程安全 2支持hash映射和缓存。因为String的hash值经常会使用到,比如作为 Map 的键,不可变的特性使得 hash 值也不会变,不需要重新计算。 3出于安全考虑。网络地址URL、文件路径path、密码通常情况下都是以…

Python之Requests库使用总结

概述 Requests是python中一个很Pythonic的HTTP库,用于构建HTTP请求与解析响应 Requests开发哲学 Beautiful is better than ugly.(美丽优于丑陋) Explicit is better than implicit.(直白优于含蓄) Simple is better than complex.(简单优于复杂) Complex is bett…

回顾【数学基础】找出断层,继续前进, 使用chatGPT学习并解决实际问题:微积分

已经学过的算术、代数、几何。跳过。 从微积分开始 想象一下,你在画一条曲线,或者在一个大草地上奔跑。微积分就是一种数学工具,帮助我们了解这条曲线的形状,或者你奔跑的方式。 微分(就像研究曲线上的每一小点&…

FFmpeg的AVIOPROBE

文章目录 定义 可能你一直有疑问,ffmpeg的avformat是怎么提前知道码流是编码格式或者容器?恭喜你,看到这里,你找到答案了,在这里,ffmpeg通过这些probe函数来提前获取码流的编码格式。 看到下面的avs2_prob…

C++1114新标准——统一初始化(Uniform Initialization)、Initializer_list(初始化列表)

系列文章目录 C11&14新标准——Variadic templates(数量不定的模板参数) C11&14新标准——Uniform Initialization(统一初始化)、Initializer_list(初始化列表) 文章目录 系列文章目录1. 定义2. I…

装饰者模式(Decorator Pattern)

1 什么是装饰者模式? 1.1 Head First Design Pattern 定义 装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 1.2 大佬博客 设计模式是什么鬼(装饰) 2 装饰者模式 2.1 基本介绍 …

Goby 漏洞发布| 亿赛通电子文档安全管理系统 LinkFilterService 接口权限绕过漏洞

漏洞名称:亿赛通电子文档安全管理系统 LinkFilterService 接口权限绕过漏洞 English Name:Esafenet Electronic Document Security Management System LinkFilterService API Permission Bypass Vulnerability CVSS core: 9.3 影响资产数:…

MySQL BinLog 数据还原恢复

博文目录 文章目录 查看状态查看 binlog 开关及存储路径查看 binlog 配置 如 存储格式 binlog_format查看当前还存在的日志查看当前正在使用的日志 切换日志确定日志确定日志文件日志格式改写日志简要说明确定日志位置以事件为单位查看日志分析日志 还原数据 查看状态 查看 b…

智能优化算法应用:基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.花授粉算法4.实验参数设定5.算法结果6.参考文…

设计模式(2)--对象创建(1)--抽象工厂

1. 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 2. 四种角色 抽象产品(Product)、具体产品(Concrete Product)、抽象工厂(Abstract Factory)、具体工厂(Concrete Factory)。 3. 优点 3.1 分离了具体的类。Client只需使用抽象工厂类…

解析代理IP在跨境电商和社媒营销中的关键作用

跨境电商和社媒营销领域的从业者深知,代理IP的价值愈发凸显。在推广营销的过程中,频繁遇到因IP关联而封禁账号的情况,或因使用不安全IP而导致异常问题。 这些问题促使人们开始高度重视代理IP的作用。但实际上,代理IP究竟是何物&a…

(数据结构)单链表的定义

#include<stdio.h> typedef struct LNode {int data;struct LNode* next; }LNode,*LinkList; //LNode为结构体类型&#xff0c;LinkList为指向单链表的指针 //初始化一个空的单链表 void InitList(LinkList L) {L NULL; //空表&#xff0c;暂时没有任何节点 } //判断单…

SCUM私人服务器搭建部署教程

以下是搭建SCUM私服的步骤&#xff1a; 1. 下载并安装SteamCMD。SteamCMD是一个命令行工具&#xff0c;用于从Steam下载和更新游戏服务器。你可以从Steam官网下载并安装它。 2. 创建一个文件夹来存储服务器文件。在你的计算机上创建一个文件夹&#xff0c;用于存储SCUM服务器文…

面试拼多多前端开发岗,已拿到offer,这些知识点该放出来了

一面&#xff1a; CSS 1.盒模型 2.css文件中开头加*号/上下盒子重叠问题&#xff08;为正值如何/负值如何&#xff09; 3.伪类和伪元素的了解&#xff0c;伪类有什么作用 JS 4.原型链 5.继承 6.为什么3.tostring()会报错 7.var先使用会怎样 8.函数表达式和函数声明有…

MistralAI发布全球首个MoE大模型-Mixtral 8x7B,创新超越GPT-4

引言 MistralAI&#xff0c;一家法国的初创企业&#xff0c;近期在AI界引发了轰动&#xff0c;刚刚发布了全球首个基于MoE&#xff08;Mixture of Experts&#xff0c;混合专家&#xff09;技术的大型语言模型——Mistral-8x7B-MoE。这一里程碑事件标志着AI技术的一个重要突破…

第一次提交代码到git仓库

本地搭建VUE项目&#xff0c;相关配置后&#xff0c;需要把项目代码推到github仓库上。 领导建好仓库后&#xff0c;在vscode执行以下命令&#xff0c;把项目推上去。 git init // 1. 初始化项目文件夹git add . // 2. 将所有文件添加到暂存区git commit -m "first co…

flex布局,换行的元素上下设置间距

要生成的效果图如下&#xff1a; display:flexflex-direction: row;flex-wrap: wrap;当我们使用弹性盒子布局后&#xff0c;默认元素是没有外边距的&#xff0c;紧挨着样式就有点丑&#xff0c;如果想使换行后&#xff0c;元素的外边距有个距离&#xff0c;可以用如下方法解决…

【无标题】树莓派 4B 多串口配置

0. 实验准备以及原理 0.1 实验准备 安装树莓派官方系统的树莓派 4B&#xff0c;有 python 环境&#xff0c;安装了 serial 库 杜邦线若干 屏幕或者可以使用 VNC 进入到树莓派的图形界面 0.2 原理 树莓派 4B 有 UART0&#xff08;PL011&#xff09;、UART1&#xff08;mini UAR…

散点图,何须图,折线图混放在一个echarts

散点图&#xff0c;何须图&#xff0c;折线图混放在一个echarts option {tooltip: {trigger: axis,axisPointer: {type: cross,crossStyle: {color: #999}}},legend: {data:[盒须图1,盒须图2,折线图,散点图]},xAxis: [{type: category,data: [周一,周二,周三,周四,周五,周六…