数据库范式使用规范

好的设计会尽可能少的引入冗余数据,或做有损拆分,而是使用规范的方法找到正确的分解。而范式则是关系数据库实现设计优化的通用手段。范式与关系数据库的关系可以参考笔者之前的WIKI。

【强制】数据库设计优先满足第三范式(3NF),如果无法满足,则尽量满足第二范式(2NF)

在进行数据库设计时,如果能够满足第三范式,要尽量保证第三范式,如果因为性能考虑,需要冗余字段,无法满足第三范式的时候,也要尽量保证第二范式。

第一范式

当关系模式满足第一范式时,该关系模式所有属性的域都是原子的。第一范式要求表中列的值具有原子性,也就是说表中列的值为不可再次拆分的最小数据单位。常见的非原子域的情况有:
(1) 组合属性具有非原子域。如包含子属性street、city、state的属性address。
(2) 使用以集合为值的属性会导致冗余存储数据的设计,进而会进一步导致不一致。如数据库设计者可能不将教师和课程安排之间的联系表示为一个单独的关系teaches,而是尝试为每一个教师存储一个课程段标志号的集合,并为每一个课程段存储一个教师标志号的集合。每当关于哪位教师讲授哪个课程段的数据发生变化时,就需同时更新两个地方:课程表的教师集合和教师表课程集合。

第二范式

关系模式R属于第二范式,如果R中的每个属性A都满足如下准则之一:
(1) 它出现在一个候选码中。
(2) 它没有部分依赖于一个候选码。
函数依赖α → \rightarrow β称为部分依赖(partial dependency)的条件是,存在α的真子集γ使得γ → \rightarrow β。我们称β部分依赖于α。
第二范式要求表中的每条记录都有唯一标识,且不存在部分依赖。所谓部分依赖,就是指所有非唯一标识字段,都必须完全依赖唯一标识,不能只依赖唯一标识的一部分。如果知道唯一标识属性的值,就可以检索到任何表记录的任何属性的任何值。
假设有关系模型R,包含如下属性(学号、课程号、课程名、姓名、学分、成绩),表示学生的课程得分,以学号和课程号为唯一标识,这里姓名属性只依赖学号,学分属性只依赖课程号,所以这里存在部分依赖,不符合第二范式的要求。
第二范式的核心思想是关系模型的内聚,也即拆分思想。对于上面的关系模型,可以进一步细分为如下几个关系模型:
学生表:(学号、姓名)
课程表:(课程号、课程名、学分)
学生课程成绩表:(学号、课程号、成绩)

第三范式

第三范式是比BC范式弱的范式。任何满足BC范式的关系模式也满足第三范式。具有函数依赖集F的关系模式R属于第三范式(third normal form)的条件是:对 F + F^+ F+中所有形如α → \rightarrow β的函数依赖(α ⊆ \subseteq R且β ⊆ \subseteq R),下面至少有一项是成立:
(1) α → \rightarrow β是平凡的函数依赖(即β ⊆ \subseteq α)。
(2) α是模式R的一个超码。
(3) β - α中的每一个属性A都包含于R的一个候选码中。
第三范式要求表中的每一个非主键字段都和主键字段直接相关,也就是说,表中的所有非主键字段不能依赖于其他非主键字段。举例来说,不能存在非主属性A依赖于非主属性B,非主属性B依赖于主键C的情况,即存在"A->B->C"的依赖关系。也就是说,所有非主键属性之间不能有依赖关系,必须相互独立。
假设有关系模型R,包含如下属性(学号、姓名、年龄、学院、学院电话),因为存在传递依赖:(学号) -> (姓名) -> (学院) -> (学院电话),所以不符合第三范式的要求。
第三范式的核心思想是消除所有基于函数依赖能够发现的冗余并保持函数依赖。对于上面的关系模型,可以进一步细分为如下几个关系模型:
学生:(学号、姓名、年龄、学院)
学院:(学院、学院电话)

【建议】在遵循范式规则的同时,也要考虑反范式设计

软件设计没有银弹,并不是说在进行数据库设计时,一定要遵循范式,在特定的场景下,可以考虑反范式设计。

违反第一范式

第一范式强调属性的域的原子性,但是特殊情况下违反第一范式也有其价值。如在含有复杂结构的实体域中,强制使用第一范式会给应用程序带来不必要的负担,如必须编写代码把数据转换成原子形式。从原子形式来回转换数据也会有运行时额外开销。所以,这种场景支持非原子的值很有用。事实上,现代数据库的确支持很多类型的非原子值。如支持创建复合属性、集合、数组等复杂数据类型。

违反第三方式

第三范式强调的是没有冗余数据,因为如果存在冗余,就意味着要保证冗余数据的一致性。但是没有冗余的数据库未必是好的数据库。有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据,达到以空间换时间的目的。

参考

https://zhuanlan.zhihu.com/p/617424106 【MySQL】数据库的设计规范(重点:三大范式)
https://blog.csdn.net/kenhins/article/details/51084815 数据库建表规则(三大范式)
https://cloud.tencent.com/developer/article/2123662 三范式与反范式
https://blog.csdn.net/Systemoutprintl/article/details/108209291 数据库的三大范式
https://www.cnblogs.com/gdwkong/p/9012262.html MySQL设计之三范式的理解

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

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

相关文章

go vet中的那些检测项

go vet 是 Go 语言自带的一个工具,用于分析 Go 代码中的常见错误和潜在问题。它可以检查代码中可能存在的各种问题,例如: 未使用的变量、函数或包 可疑的函数调用 错误的函数签名 程序中的竞态条件 错误的类型转换等 本文意图指令当前go vet所…

排序算法-选择排序(Java)

选择排序 选择排序 (selection sort)的工作原理非常直接:开启一个循环,每轮从未排序区间选择最小的元素,将其放到已排序区间的末尾。 算法原理 排序数组:(2 4 3 1 5 2) &#xf…

如何编译打包OpenSSH 9.4并实现批量升级

1 介绍 openssh 9.4版本已于8月10号发布,安全团队又催着要赶紧升级环境里的ssh版本,本文主要介绍Centos5、Centos6、Centos7下openssh 9.4源码编译rpm包以及批量升级服务器openssh版本的方法。关注公众号后台回复ssh可获取本文相关源码文件。 https://w…

QT 消息对话框按钮显示

前言 搞QT嘛,大多数都是军工。都要国产化,而且消息对话框的按钮的英文也不是很得劲,所以需要汉化。使用静态函数的按钮就是显示英文,汉化的代码如下。 void Widget::on_pushButton_clicked() {QMessageBox box(QMessageBox::Inf…

Linux安装NVM(简洁版)

安装目录 mkdir /opt/nvm && cd /opt/nvm 安装包下载 wget https://github.com/nvm-sh/nvm/archive/refs/tags/v0.39.5.tar.gz 注意:https://github.com/nvm-sh/nvm/tags获取下载链接并替换 安装包解压 for file in *.tar.gz; do tar -zxvf "$file&quo…

ES基础操作

1.创建索引 在 Postman 中,向 ES 服务器发 PUT 请求 : http://127.0.0.1:9200/shopping 后台日志 重复发送 PUT 请求添加索引 : http://127.0.0.1:9200/shopping ,会返回错误信息 : 2.获取单个索引相关信息 在 Postman 中&#…

android11,12 Launcher3编译什么

1首先看看手机里的是什么 adb shell pm path com.android.launcher3 package:/system_ext/priv-app/Launcher3QuickStep/Launcher3QuickStep.apk 然后就编译Launcher3QuickStep 2push apk 没什么说的,push到对应的文件夹 /system_ext/priv-app/Launcher3Quick…

Springboot+mybatis-plus+dynamic-datasource+Druid 多数据源 分布式事务

Springbootmybatis-plusdynamic-datasourceDruid 多数据源事务,分布式事务 文章目录 Springbootmybatis-plusdynamic-datasourceDruid 多数据源事务,分布式事务0.前言1. 基础介绍ConnectionFactoryAbstractRoutingDataSource 动态路由数据源的抽象类 Dyn…

CSS学习笔记01

CSS笔记01 什么是CSS CSS(Cascading Style Sheets ):层叠样式表,也可以叫做级联样式表,是一种用来表现 HTML 或 XML 等文件样式的计算机语言。字体,颜色,边距,高度,宽度…

5 群起集群

1.在启动集群之前,先配置workers,有几个节点就配置几个 [atguiguhadoop102 hadoop]$ vim /opt/module/hadoop-3.1.3/etc/hadoop/workers在该文件中增加如下内容: hadoop102 hadoop103 hadoop104 注意:该文件中添加的内容结尾不允许有空格&a…

成都瀚网科技:抖店如何经营?

作为热门的短视频分享平台,抖音不仅是一种娱乐工具,更是一个蕴藏着无限商机的电商平台。开店、抖音下单成为很多人的选择。那么,抖音如何开店、下单呢? 1、如何在抖音上开店和下单? 注册账号:首先&#xff…

vue 后台管理系统登录 记住密码 功能(Cookies实现)

安装插件 import Cookies from js-cookie 组件引入 import Cookies from js-cookie; 存值: Cookies.set(username, state.account, { expires: 30 }); // username 存的值的名字,state.account 存的值 expires 存储的时间,30天Cookies…

Python图像处理基础

文章目录 一、图像处理概二、图像分类三、openCV图像处理基础3.1 OpenCV 读取与显示图像3.2 openCV像素处理3.3 openCV创建图像、复制图像3.4 openCV保存图像3.5 openCV 绘制各种几何图形四、图像算术与逻辑运算4.1 图像加法运算4.2 图像减法运算4.3 图像与运算4.4 图像或运算4…

mysql sql_mode数据验证检查

sql_mode 功能 sql_mode 会影响MySQL支持的sql语法以及执行的数据验证检查。通过设置sql_mode ,可以完成不同严格程度的数据校验,有效地保障数据准确性 sql_mode 严格模式 VS 宽松模式 宽松模式 比如,插入的数据不满足 表的数据类型,也可能…

2023年高教社杯 国赛数学建模思路 - 案例:ID3-决策树分类算法

文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法,就是频繁模…

opencv 车牌号的定位和识别+UI界面识别系统

目录 一、实现和完整UI视频效果展示 主界面: 识别结果界面:(识别车牌颜色和车牌号) 查看历史记录界面: 二、原理介绍: 车牌检测->图像灰度化->Canny边缘检测->膨胀与腐蚀 边缘检测及预处理…

Vue3(开发h5适配)

在开发移动端的时候需要适配各种机型&#xff0c;有大的&#xff0c;有小的&#xff0c;我们需要一套代码&#xff0c;在不同的分辨率适应各种机型。 因此我们需要设置meta标签 <meta name"viewport" content"widthdevice-width, initial-scale1.0">…

第十四课:采用 Qt 开发翻页/分页/多页窗体组件

功能描述&#xff1a;采用 Qt 开发一个翻页/分页/多页的窗体组件&#xff0c;封装为 QWidget 的子类&#xff0c;在你的应用程序中可直接使用。 一、最终演示效果 本次制作的翻页/分页/多页窗体组件是基于 Qt 开发&#xff0c;整个程序封装成 PageWidget 类&#xff0c;继承于…

如何以CPU方式启动Stable Diffusion WebUI?

默认情况下Stable Diffusion WebUI采用GPU模式运行&#xff0c;但是稍微运行起来就知道至少需要4G的显存&#xff0c;2G显存虽然能够通过带--lowvram运行起来&#xff0c;但是能够炼出来的图基本都是512x512的&#xff0c;不能够炼大图&#xff0c;如果你刚好和我一样家境贫寒&…

node+mysql+express基础应用

介绍 1.express 为不同 URL 路径中使用不同 HTTP 动词的请求&#xff08;路由&#xff09;编写处理程序。集成了“视图”渲染引擎&#xff0c;以便通过将数据插入模板来生成响应。设置常见 web 应用设置&#xff0c;比如用于连接的端口&#xff0c;以及渲染响应模板的位置。在…