数据库设计三范式

news2024/7/4 5:15:18

数据库设计三范式

范式是数据库设计时遵循的一种规范,不同的规范需要遵循不同的范式,只有充分遵循了数据库设计的范式,才能设计开发出冗余较小、高效、结构合理的数据库。

通常,我们在设计数据库的时候会要求遵循三范式

第一范式(1NF)

如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式(1NF)。

在关系型数据库的设计中,满足第一范式(1NF)是数据库设计的基本要求,也就是说只有满足了第一范式(1NF)的数据库才能叫做关系数据库。

满足第一范式的目的就是确保每列保持原子性

例子1:

设计一张“员工”表,设计如下:

empIdempNameagesexaddress
1小明26m浙江省杭州市
2小李28f安徽省合肥市
3小黄31f江苏省扬州市

这张表的设计就不符合第一范式(1NF),因为“地址”这个属性可以继续拆分成“省份”和“城市”两个属性,假设有一天公司需要统计来自某个省份或者某个城市的所有员工信息的话,这样分类就非常方便了。

满足第一范式(1NF)的员工表重新设计如下:

empIdempNameagesexprovincecity
1小明26m浙江省杭州市
2小李28f安徽省合肥市
3小黄31f江苏省扬州市

第二范式(2NF)

第二范式(2NF)是在第一范式(1NF)的基础之上更进一步。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

比如有一张“学生课程成绩”表:

stuIdstuNameagesexcourseIdcourseNamescorecredit
1小王16m1数学892
1小王16m2语文993
2小李16f2语文783
3小刚16f1数学882

如果我们想从上面这张表中获取某个学生的某门成绩,只靠 stuId 或者 courseId 是没有办法唯一确定某个学生的某门课程成绩的,因此需要将 stdIdcourseId 作为“学生课程成绩表”的联合主键,通过联合主键才能唯一确定某个学生的某门课程成绩。

在应用中使用以上关系模式会存在以下问题:

  • 数据冗余:同一门课程的“学分(credit)”是和课程相关的,如果在一张表里记录了30条学生成绩,学分(credit)”也就重复了30次,造成数据冗余。
  • 更新异常:如果某一门课程的学分调整了,那么需要调整“学生课程成绩”表里涉及到的所有数据,容易造成数据的漏改、错改。
  • 插入异常:如果这时候新开了一门课程,但是由于这门课程还没有人选,学生信息只能等到有人选修的时候再插入了,会导致数据的插入异常。
  • 删除异常:如果某个学生已经结业,需要删除该学生的成绩记录,同时会删除课程信息以及该课程的学分信息,这时候如果该门课还没有新生选修就会导致课程信息丢失,造成数据保存失败。

再仔细观察这张表的信息,stuNameagesex 只与 stuId 相关,courseName 只与 courseId 相关,和第二范式(2NF)中规定的需要确保数据库表中的每一列都和主键相关这个规则相违背,所以上述这张表的设计不符合第二范式(2NF)。

那么如何调整才能让其符合第二范式(2NF)呢?

可以将上述“学生课程成绩表”拆分成“学生”表、“课程”表和“学生课程成绩”表。

“学生”表:

stuIdstuNameagesex
1小王16m
1小王16m
2小李16f
3小刚16f

“课程”表:

courseIdcourseNamecredit
1数学2
2语文3
2语文3
1数学2

“学生课程成绩”表:

stuIdcourseIdscore
1189
1299
2278
3188

调整后的模型如下:
在这里插入图片描述

通过上述将一张表拆分成多张表的方式就实现了确保表中的每列都和主键相关,一张表只保存一种数据的目的。

第三范式(3NF)

第三范式(3NF)需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关

通过数学推导公式来表达:

用 A、B、C、D 来表示表中的四个列,其中 A 为主键,其中 B → A(B依赖A), C → A,D → A,如果还有 B → C, C → D 从这两个还可以推导出 B → D, 此时虽然满足第二范式(2NF),但是不满足第三范式。

以“学生”表为例:

stdIdstdNameagesexclassIdclassNameclassInfo
1小王18m4四班45
2小李16m4四班45
3小蔡15f2二班46
4小余17m5五班48

这张表的主键是 stdId,因为这个属性能够确定这张表的其他属性,通过 stdId 就可以知道学生姓名、年龄、性别、班级编号、班级名称、班级人数信息。但是仔细观察可以发现,班级名称、班级人数还可以通过 classId 确定,而 classId 是非主属性,这样就存在了一个传递依赖,并且造成数据的冗余。

解决这个问题就需要将上述表拆成“学生”表和“班级”表,一张表记录学生信息,另一张表记录班级信息,两张表通过外键进行关联:

学生表:

stdIdstdNameagesexclassId
1小王18m4
2小李16m4
3小蔡15f2
4小余17m5

班级表:

classIdclassNameclassInfo
2二班46
4四班45
5五班48

调整后的模型如下:
在这里插入图片描述

总结

数据库连接会带来一部分的性能损失,并不是数据库范式越高越高,有时会在数据冗余与范式之间做出权衡,在实际的数据库开发过程中,往往会允许一部分的数据冗余来减少数据库连接。

参考链接

  • 数据库三范式详解
  • 数据库设计三个范式

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

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

相关文章

《强化学习周刊》第69期:ICLR2023强化学习论文推荐、MIT实现自动调整内在奖励的强化学习...

No.69智源社区强化学习组强化学习研究观点资源活动周刊订阅告诉大家一个好消息,《强化学习周刊》已经开启“订阅功能”,以后我们会向您自动推送最新版的《强化学习周刊》。订阅方法:方式1:扫描下面二维码,进入《强化学…

使用Python PySNMP模块获取设备指标

一、PySNMP模块介绍: PySNMP 是一个跨平台的纯Python SNMP 引擎实现。它具有功能齐全的 SNMP 引擎,能够充当代理/管理器/代理角色,通过 IPv4/IPv6 和其他网络传输传输 SNMP v1/v2c/v3 协议版本。目前,使用较多的是SNMP v3和v2c版…

Robust Document Image Dewarping Method Using Text-Lines and Line Segments论文学习笔记

1 摘要 传统的基于文本行的文档去扭曲方法在处理复杂布局和/或非常少的文本行时会出现问题。当图像中没有对齐的文本行时,这通常意味着照片、图形和/或表格占据了输入的大部分。因此,对于健壮的文档去扭曲变形,我们建议除了对齐的文本行之外…

Python解题 - CSDN周赛第11期 - 圆桌请客(脑筋急转弯)

本来想着没有all pass就不写题解了,但在赛后对最后一题纠结了好久,然后发现是个类似脑筋急转弯的题,自己与正确答案只差一层纸,实在有点不吐不快。另外本期考了经典的背包问题的模板题,也值得记录下来,加深…

全志科技A40i国产开发板——性能参数综合测试

本次测试板卡是创龙科技旗下,一款基于全志科技A40i开发板,其接口资源丰富,可引出双路网口、双路CAN、双路USB、双路RS485等通信接口,板载Bluetooth、WIFI、4G(选配)模块,同时引出MIPI LCD、LVDS LCD、TFT LCD、HDMI OUT、CVBS OUT、CAMERA、LINE IN、H/P OUT等音视频多媒…

宿主机与开发板网络共享

宿主机网络共享 一、关键步骤 11. 网络共享简介 目标:宿主机可以用ssh连接开发板,开发板可以上网。 步骤:宿主机与目标机用网线直连,宿主机采用IP共享的方式连接开发板; 配置项IP开发板IP192.168.0.232宿主机以太网I…

Java 序列化原理

我的网站 | 我的博客 | 序列化解析工具 概念 Java为我们提供了一种默认的对象序列化机制,通过这种机制可以将一个实例对象写入到IO流中,当然这种IO流可以是文件流、网络流或者其他什么流。 代码的写法 ObjectOutputStream 对象输出流,用…

2022新一代设备维修管理系统助力企业降本增效

设备的维修是指企业或者设备密集型单位为了保持、恢复并提升设备使用寿命而定期对设备进行状态的维护,备件的更换,发生故障后的维修和恢复,从而让设备保证良好的运营状态,提升设备的可利用性并保证产能和设备安全。 大型企业在设…

C++11标准模板(STL)- 算法(std::merge)

定义于头文件 <algorithm> 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 归并两个已排序的范围 st…

关于Mysql使用left join写查询语句执行很慢的问题解决

目录 &#xff08;一&#xff09;前言 &#xff08;二&#xff09;正文 1. 表结构/索引展示 &#xff08;1&#xff09;表结构 &#xff08;2&#xff09;各表索引情况 2. 存在性能问题的SQL语句 3. 解决思路 &#xff08;1&#xff09;执行计划思路调优 &#xff08;…

数字图像处理(入门篇)二 颜色空间

在对图像进行处理时&#xff0c;前提图像必须是以数据的形式来描述的&#xff0c;而颜色空间就是用数据来表征图像颜色的一种方法。颜色信息由三个独立的分量来综合表示&#xff0c;这三个独立的分量构成了一个三维的坐标空间&#xff0c;每种颜色信息都在该空间中被唯一地表示…

Java-泛型实验

1.定义一个学生类Student&#xff0c;具有年龄age和姓名name两个属性&#xff0c;并通过实现Comparable接口提供比较规则&#xff08;返回两个学生的年龄差&#xff09;&#xff0c; 定义测试类Test&#xff0c;在测试类中定义测试方法Comparable getMax(Comparable c1, Compar…

基于springboot农机电招平台设计与实现的源码+文档

摘要 随着农机电招行业的不断发展&#xff0c;农机电招在现实生活中的使用和普及&#xff0c;农机电招行业成为近年内出现的一个新行业&#xff0c;并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算机让复杂的销售操作变简单&#xff0c;变高…

Kubernetes资源调度之节点亲和

Kubernetes资源调度之节点亲和 Pod节点选择器 nodeSelector指定的标签选择器过滤符合条件的节点作为可用目标节点&#xff0c;最终选择则基于打分机制完成。因此&#xff0c;后者也称为节点选择器。用户事先为特定部分的Node资源对象设定好标签&#xff0c;而后即可配置Pod通过…

YOLO X 改进详解

YOLO X 主要改进&#xff1a; Anchor-Free: FCOSDecoupled detection headAdvanced label assigning strategy Network structure improvement Decoupled detection head 对比于YOLO V5, YOLO X 在detection head上有了改进。YOLO V5中&#xff0c;检测头是通过卷积同时预…

ROS2--概述

ROS2概述1 ROS2对比ROS12 ROS2 通信3 核心概念4 ros2 安装5 话题、服务、动作6 参数参考1 ROS2对比ROS1 多机器人系统&#xff1a;未来机器人一定不会是独立的个体&#xff0c;机器人和机器人之间也需要通信和协作&#xff0c;ROS2为多机器人系统的应用提供了标准方法和通信机…

时间序列:时间序列模型---自回归过程(AutoRegressive Process)

本文是Quantitative Methods and Analysis: Pairs Trading此书的读书笔记。 这次我们构造一个由无限的白噪声实现&#xff08;white noise realization) 组成的时间序列&#xff0c;即。这个由无限数目的项组成的值却是一个有限的值&#xff0c;比如时刻的值为&#xff0c; 而…

基于PHP+MySQL校园餐饮配送系统的设计与实现

随着我国国民经济的稳步发展,我国的大学生也越来越多,但是大部分学生都是没有时间和环境去自己做饭的,有很多也不会做,而很多食堂的菜品有难以下咽,所以很多人就采取了订餐的方式来进行购买美食,但是现在很多网站都是只能进行点餐,而没有智能推荐功能,本系统在原来的外卖基础上…

【Linux】文件系统

目录&#x1f308;前言&#x1f337;1、磁盘的组成&#x1f361;1.1、磁盘的物理结构&#x1f362;1.2、磁盘的存储结构&#x1f363;1.3、磁盘的逻辑结构&#x1f338;2、文件系统&#x1f364;2.1、文件系统的结构&#x1f365;2.2、inode如何与数据块建立联系&#x1f366;2…