数据库范式(详细介绍)

目录

第一范式(原子性)

第二范式(主键唯一性)

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

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范式的要求。

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

总结:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

未来智能座舱中的人机交互

智能车辆人机交互的发展是中国智能车辆企业品牌升级的重要突破点。通过不断整合人与车辆之间的相互作用,未来的智能车辆将能够提供更全面的沉浸式体验,推动新的互动方式和技术的成熟。这些交互技术不仅满足基本的安全需求,还能满足更深层次的…

马赛克,克星,真来了!v2.0

大家好,今天继续聊聊 AI 开源项目 AI 开源项目 1、DemoFusion AI 绘画的潜力还没有充分挖掘出来,仍然还有上升的空间。 DemoFusion 就是这么一个开源项目,继续深挖了 AI 绘画在高分辨率图片生成的效果。 提高分辨率,马赛克&a…

【JUC】二十五、ThreadLocal内存泄漏问题(强软弱虚四种引用)

文章目录 1、引用之强软弱虚2、强引用3、软引用4、弱引用5、虚引用6、ThreadLocal回顾7、ThreadLocal使用弱引用的原因8、清除脏Entry9、最佳实践 不再会被使用的对象或者变量占用的内存不能被回收,就是内存泄露(累积可能导致OOM)。 1、引用之…

Echarts小问题汇总

文章目录 Echarts小问题汇总1.柱状图第一条柱子遮挡Y轴解决方法2.在大屏渲染后 拖到小屏变模糊3.相邻柱状图中间不要有空隙4.实现echarts图表自适应5.单个柱状图最大宽度 Echarts小问题汇总 记录工作中使用Echarts的遇见的一些小问题,后续会不断进行补充 1.柱状图…

三数之和(LeetCode 15)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路方法一:暴力法方法二:排序双指针 5.实现示例参考文献 1.问题描述 给你一个整数数组 nums,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时…

P1单片机定时器配置及定时器中断——C51(超详细)

目录 1. 简介 1.1 概念解读 1.2 定时器怎么定时 1.什么是晶振 2.什么是时钟周期 3.什么是机器周期 4.加1经过了多少时间 1.3 定时器编程 1.如何算出10ms定时器的初值(TL0 TH0) 2.关于TCON ,怎么知道爆表 3.怎么开始计时(TR0) 4.定时器使用是有很多种模式的&#xf…

Gerrit的使用

项目存储配置 为了能够模拟开发人员和审核人员两个角色,需要有1台服务器模拟操作提交和审核 登陆linux服务器账户,并生成id_rsa.pub 添加git配置 Git配置一般存储的是name 和 email地址 这里的email地址需要和gerrit系统的账号的email地址一致&#…

佛山陶企再造行业新风口,开启中国陶瓷下半场

近年来,消费形态逐渐呈现年轻化、时尚化、数字化的趋势,新一地居住者对于居住环境的品质和舒适度要求日益提高。伴随着新消费势力的崛起,家居建材行业消费转型升级已成必然。“千年陶都”佛山作为我国陶瓷行业的风向标,率先推进技…

SD-WAN组网案例分享——简单高效的远程视频监控方案

在网络化和信息化建设的推动下,远程视频监控设备的应用范围已经不再局限于政府部门和金融行业。中小企业对远程视频监控设备的需求也在持续增长。 案例背景 本次案例分享的是一家大型制造业企业,该企业拥有遍布全国各地的生产厂房和仓库。然而&#xff…

GPS定位与IP地址定位的差异及应用场景

随着科技的不断发展,定位技术在日常生活和商业应用中变得越来越普遍。在定位技术中,GPS(全球定位系统)和IP地址定位是两种常见的方法。本文将探讨GPS定位与IP地址定位的差异以及它们在不同应用场景中的应用。 1. GPS定位 a. 工作…

flink-1.17.2的单节点部署

flink 简介 Apache Flink 是一个开源的流处理和批处理框架,用于大数据处理和分析。它旨在以实时和批处理模式高效处理大量数据。Flink 支持事件时间处理、精确一次语义、有状态计算等关键功能。 以下是与Apache Flink相关的一些主要特性和概念: 流处理…

故障注入测试有哪些多重作用?

在软件开发的世界中,保证系统的鲁棒性和稳定性至关重要。为了应对各种潜在的故障和异常情况,测试团队采用了各种测试方法,其中之一就是故障注入测试。这种测试方法的目标是有目的地向系统引入故障,以评估系统在面对异常情况时的表…

响应式编程一之基础夯实(初学必看!)

响应式编程一之基础夯实(初学必看!) 函数式编程常见lambda表达式求一个数组里面的最小值代码简洁的函数式编程返回指定对象的接口实例JDK8 新特性jdk8函数式接口predicate 判断hashmap是否为空consumer总结方法引用示例lambda表达式的类型推断…

解题方式篇-回溯

回溯算法 1、简介 简介:回溯法也可以叫做回溯搜索法,它是一种搜索的方式。 回溯是递归的副产品,只要有递归就会有回溯。回溯是一种暴力的搜索方式。 回溯法,一般可以解决如下几种问题:组合(无序&#xff0…

西南科技大学数字电子技术实验五(用计数器设计简单秒表)预习报告

一、计算/设计过程 说明:本实验是验证性实验,计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程,越详细越好。用公式输入法完成相关公式内容,不得贴手写图片。(注意:从抽象公式直接得出结…

Keil 编译输出信息分析:Program size: Code, RO-data , RW-data, ZI-data

一般 MCU 包含的存储空间有:片内 Flash 与片内 RAM,RAM 相当于内存,Flash 相当于硬盘。编译器会将一个程序分类为好几个部分,分别存储在 MCU 不同的存储区。 如图所示,在Keil中编译工程成功后,在下面的Bul…

AI+无代码助力企业供应链优化

内容来自演讲:潘峰 | 预见明日科技(北京)有限公司 | CEO 摘要 本文介绍了企业供应链中的挑战和解决方案。文章指出,供应链成本占企业经营成本的大部分,且存在供给端和需求端的高度不确定性。为应对这种不确定性&…

Embedding压缩之基于二进制码的Hash Embedding

推荐系统中,ID类特征的表示学习(embedding learning)是深度学习模型成功的关键,因为这些embedding参数占据模型的大部分体积。这些模型标准的做法是为每一个ID特征分配一个unique embedding vectors,但这也导致存储emb…

【QT 5 调试软件+(Linux下验证>>>>串口相关初试串口)+Windows下qt代码在Linux下运行+参考win下历程+基础样例】

【QT 5 调试软件Linux下验证>>>>串口相关初试串口参考win下历程基础样例】 1、前言2、实验环境3、先行了解4、自我总结-win下工程切到Linux下1、平台无关的代码:2、依赖的库:3、文件路径和换行符:4、编译器差异:5、构…

揭秘高效大型语言模型:技术、方法与应用展望

近年来,大型语言模型(LLMs)在自然语言处理领域取得了显著的进展,如GPT-series(GPT-3, GPT-4)、Google-series(Gemini, PaLM), Meta-series(LLAMA1&2), BLOOM, GLM等模型在各种任务中展现出惊人的能力。然而,随着模…