【数据库-通用知识系列-01】数据库规范化设计之范式,让数据库表看起来更专业

news2024/12/27 3:24:49

我们在设计数据库时考虑的因素包括读取性能,数据一致性,数据冗余度,可扩展性等,好好学习数据库规范化的知识,设计的数据库表看起来才专业。

范式一览

在这里插入图片描述

“键”理解:

  • 超键:在关系中能唯一标识元组的属性集称为关系模式的超键
  • 候选键:不含有多余属性的超键称为候选键。也就是在候选键中,若再删除属性,就不是键了。
  • 主键:用户选作元组标识的一个候选键称为主键。
  • 外键:如果关系模式R中属性K是其它模式的主键,那么K在模式R中称为外键。

主键为候选键的子集,候选键为超键的子集,而外键的确定是相对于主键的!

0NF(Not Normal Form)

一个员工有多个电话,用“,”分割,我们常常这样设计,的确这样设计没毛病,干嘛再设计一个写的电话表,还要关联,浪费时间。的确,我们有些情况下确实这样设计。但是他不符合数据库的规范,为什么呢:

  1. 首先看Phone,字段长度不明确,我们应该定义多长,长了浪费,短了业务不允许。
  2. 统一每个人有多少电话,没法统计。
  3. 可维护性差,我删除个电话,更换个电话不好弄。
  4. 扩展性差,哪个是主,哪个是次,哪个是家庭,哪个是工作电话怎么搞。

所以就有了1NF,设计上还是不要有分割,保持原子性。

EmployeeIdPersonPhone
1John Jones27716602, 26153215,
2Peter Janes47716602, 36153215, 52321262
3Michael Juines17716602

1NF(First Normal Form)

定义:第一范式是指数据库的每一列都是不可分割的基本数据项,强调列的原子性。

我们改造一下上边的表结构,这样就符合了第一范式:

EmployeeIdPersonPhone
1John Jones27716602
1John Jones26153215
2Peter Janes47716602
2Peter Janes36153215
2Peter Janes52321262
3Michael Juines17716602

上边第一范式的设计好吗?不太优雅吧,我们有太多的冗余,如果现在Peter有3个电话占了三行,若有Peter有100个电话呢,是不是要有100行一样的EmployeeId和Person。可能你会说,也占用不了太多的空间呀,那我要问你Peter还有100多个属性呢,所以说,第一范式是没有考虑数据冗余的。我们要消灭数据冗余,就要考虑2NF。

2NF(Second Normal Form )

定义:第二范式建立在第一范式的基础上,即满足第二范式一定满足第一范式,第二范式要求数据表每一个实例或者行必须被唯一标识。除满足第一范式外还有两个条件,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。

上表的主键现在是什么,竟然是EmployeeId和Phone组成的联合主键,而Name只依赖于EmployeeId。这就不符合Employee的建表目的了,name只依赖于EmployeeId就好,Phone在这凑什么热闹,把Phone单独建张表吧:

EmployeeIdName
1John
2Peter
3Michael
PhoneIdPhone
127716602
226153215
347716602
436153215
552321262
617716602
EmployeeIdPhoneId
11
12
23
24
25
36

3NF(Third Normal Form)

定义: 若某一范式是第二范式,且每一个非主属性都不传递依赖于该范式的候选键,则称为第三范式,即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。

第三范式其实也和第二范式一个目的,减少数据冗余。为了说明第3范式,我们增加个邮编地址,如下表所示。

EmployeeIdNameZIPCity
1John8000Aarhus C
2Peter8200Aarhus N
3Michael8520Lystrup

上表明显满足第二范式,但是是不是感觉City多余,明明非主属性ZIP知道了就知道非主属性EmployeeId在哪个城市了。好了,这里出来了一个传递依赖,消灭掉如下:

EmployeeIdNameZIP
1John8000
2Peter8200
3Michael8520
ZIPCity
8000Aarhus C
8200Aarhus N
8520Lystrup

BCNF(Boyce and Codd Normal Form)

下表满足:

  1. 1个学生可以选择多门课程,比如101选了java和C++。
  2. 一个教授教一门课程,可以有多个教授教一门课程,比如Java对应三个教授。
studentIdsubjectprofessor
101JavaP.Java
101C++P.Cpp
102JavaP.Java2
103C#P.Chash
104JavaP.Java

该设计满足3NF,因为主键为studentId和subject,满足1NF,所有值都是原子;满足2NF,不存在部分依赖。满足3NF,不存在传递依赖。但是不是BCNF,原因如下:

professor->subject

subject是一个主属性,而professor为非主属性,所以不满足BCNF。修改如下:

Student Table

student_idp_id
1011
1012

Professor Table

p_idprofessorsubject
1P.JavaJava
2P.CppC++

原文:[实践派]-数据库规范化

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

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

相关文章

送什么礼物给小学生比较有纪念意义?适合送小学生的小礼物

送给小学生的礼物哪种比较有意义呢?送给学生的礼物,基本上是对学习有所帮助的,但是像送钢笔、练习册这些,有一部分学生是抗拒的,作为大人就是希望对视力、对成长有用的东西,我认为保护视力是现在许多家庭的…

isNotEmpty() 和 isNotBlank() 的区别,字符串判空, StringUtils工具包 StringUtil工具类,isEmpty() 和 isBlank() 的区别

目录1.StringUtils 和 StringUtilStringUtils 的依赖:StringUtils 的用法:StringUtil 工具类2. isNotEmpty() 和 isNotBlank()1.StringUtils 和 StringUtil 注:StringUtils 和 StringUtil 的区别(StringUtil为自定义工具类&#…

以表达式作为template参数

目录 一.template参数的分类&#xff1a; 二.非类型参数与默认参数值一起使用 三.应用 一.template参数的分类&#xff1a; ①.某种类型&#xff1a; template<typename T>; ②.表达式(非类型)&#xff1a; template<int length,int position>; 其中length…

Liunx中shell命令行和权限的理解

文章目录前言1.shell外壳的理解2.关于权限理解1.Linux下的用户2.角色划分3.文件和目录的权限3.粘滞位3.总结前言 Linux中的操作都是通过在命令行上敲指令来实现的&#xff0c;本文将简单的介绍Linux中的外壳程序shell以及浅谈一下对Linux中的权限理解。 1.shell外壳的理解 Lin…

微信小程序开发(一)

1. 微信小程序的开发流程 2. 注册小程序 小程序注册页&#xff1a;https://mp.weixin.qq.com/wxopen/waregister?actionstep1 如已注册&#xff0c;直接登录 小程序后台 https://mp.weixin.qq.com/ 即可。 在小程序后台的 【开发管理】→ 【开发设置】下可以查看AppID&…

算法训练营DAY45|322. 零钱兑换、279.完全平方数

两道题思路上有相似之处&#xff0c;都是求得最少的种类方法&#xff0c;也就是说在完全背包里给定容量时&#xff0c;用最少的物品去装满背包。它和用最多的方法去装满背包也有一些相似&#xff0c;也就是说两者实际上是互通的。 322. 零钱兑换 - 力扣&#xff08;LeetCode&a…

HTML零散知识

1、代码规范与思路 参考凹凸实验室代码规范&#xff1a;Aotu.io - 前端代码规范 CSS编写顺序的思路 先确定盒子本身是如何布局 position: absolutefloat: left/rightdisplay: flex 盒子的特性和可见性 display: block/inline-block/inline/nonevisibility/opacity 盒子模型…

【Pytorch项目实战】之生成式模型:DeepDream、风格迁移、图像修复

文章目录生成式模型&#xff08;算法一&#xff09;深度梦境&#xff08;DeepDream&#xff09;&#xff08;算法二&#xff09;风格迁移&#xff08;Style Transfer&#xff09;&#xff08;算法三&#xff09;图像修复&#xff08;Image Inpainting&#xff09;&#xff08;一…

(13)工业界推荐系统-小红书推荐场景及内部实践【用户行为序列建模】

&#xff08;1&#xff09;工业界推荐系统-小红书推荐场景及内部实践【业务指标、链路、ItemCF】 &#xff08;2&#xff09;工业界推荐系统-小红书推荐场景及内部实践【UserCF、离线特征处理】 &#xff08;3&#xff09;工业界推荐系统-小红书推荐场景及内部实践【矩阵补充、…

Docker搭建LNMP+Wordpress

一、服务器环境 容器操作系统IP地址主要软件nginxCentOS 7172.18.0.10Docker-NginxmysqlCentOS 7172.18.0.20Docker-MysqlmysqlCentOS 7172.18.0.20Docker-Mysql 二、Linux系统基础镜像 systemctl stop firewalld setenforce 0 docker pull centos:7 #从公有仓库中下载cento…

cubeIDE开发, stm32人工智能开发应用实践(Cube.AI).篇三

一、cube.AI实际项目应用 接篇二&#xff0c;前文都是采用FP-AI-SENSING1案例和配套的B-L475E-IOT01A开发板来阐述的&#xff0c;而实际项目中&#xff0c;我们都是基于自身项目硬件平台来训练模型及部署模型的&#xff0c;我们仅仅需要cube.AI软件包&#xff08;作为可调用库&…

技术大佬说我对「压测目标」的分析不够细

前言 前面总结压测类型的时候有简单描述了不同压测类型的从准备-脚本设计-压测的整体过程&#xff0c;但是对于压测对象没有更深入的进行分析总结&#xff0c;导致在压测执行结束后&#xff0c;出现压测结果不准确的情况。所以这边就压测的对象进行单独的总结分析。 在执行压测…

lego-loam学习笔记(三)

前言&#xff1a; 对于lego-loam中点云聚类源码的学习&#xff0c;它使用了广度优先算法&#xff0c;并且使用了数组双指针技巧。 主要分为两个部分&#xff1a; 第一个是labelComponents函数&#xff0c;它的功能是为每个点及其相邻的4个点运算角度&#xff0c;在对角度小于…

微信小程序开发

微信小程序开发 | 前言&#xff1a;本文章中的很大一部分内容的图片&#xff0c;文字信息来源于微信小程序官方文档和网络资源&#xff0c;感谢大家的支持&#xff0c;如文章中有不足和错误的地方&#xff0c;请及时联系作者-白泽。并协同修改&#xff0c;相信大家的帮助会使这…

屏蔽360阻止远程执行变更注册表自启动数据的办法

屏蔽360阻止远程执行变更注册表自启动数据的办法 运程服务器上的程序&#xff0c;由于需要。我在服务器中&#xff0c;加入更新升级自身&#xff08;exe&#xff09;文件&#xff0c;并变更操作系统自启动数据的代码。 实践证明&#xff0c;通过客户端&#xff0c;调用运程服务…

spring 声明式事务 @Transactional 运行原理

注意&#xff1a;如果想要理解spring 的声明式事务&#xff0c;必须先理解AOP 的原理。 一、spring注册 InfrastructureAdvisorAutoProxyCreator 通过 EnableTransactionManagement 可以看到先把TransactionManagementConfigurationSelector通过Import注册到spring。同时注意…

VULNCMS靶机

环境准备 靶机链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;i3j0 虚拟机网络链接模式&#xff1a;桥接模式 攻击机系统&#xff1a;kali linux 2022.03 信息收集 1.查看靶机ip地址 2.探测目标靶机开放端口和服务情况。 nmap -p- -sV -A 192.168.1.108 漏洞…

嵌入式串行接口标准

在嵌入式系统中&#xff0c;经常使用UART接口实现通讯、调试日志数据等功能&#xff0c;但UART是一种异步通信协议&#xff0c;并未定义物理层的电气接口标准。 在板件通信时&#xff0c;UART接口之间通常基于IO直接连接进行通信&#xff08;TTL/CMOS电平标准&#xff0c;3.3V电…

梦熊杯-十二月月赛-白银组题解-B.契约

B. Problem B.契约&#xff08;contract.cpp&#xff09; 内存限制&#xff1a;256 MiB 时间限制&#xff1a;1000 ms 标准输入输出 题目类型&#xff1a;传统 评测方式&#xff1a;文本比较 题目描述&#xff1a; 「璃月」是「契约」的国度。 摩拉克斯认为&#xff0c…

Lua 字符串

Lua 字符串 参考至菜鸟教程。 字符串或串(String)是由数字、字母、下划线组成的一串字符。 Lua 语言中字符串可以使用以下三种方式来表示&#xff1a; 单引号间的一串字符。双引号间的一串字符。[[ 与 ]] 间的一串字符。 以上三种方式的字符串实例如下&#xff1a; string1 …