数据库设计三大范式

2023-09-18 10:51:36

目录

什么是范式

1. 第一范式(1NF)

2. 第二范式(2NF)

3. 第三范式(3NF)


数据库三大范式包含:1、第一范式(1NF);2、第二范式(2NF);3、第三范式(3NF)。其中,第一范式(1NF)的要求是属性不可分割,,第二范式(2NF)的要求是满足第一范式,且不存在部分依赖;第三范式(3NF)的要求是满足第二范式,且不存在传递依赖。

什么是范式

范式是数据库设计时遵循的一种规范,不同的规范要求遵循不同的范式。

1. 第一范式(1NF)

所谓第一范式(1NF)是指在关系模型中,对于添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域。

在任何一个关系数据库中,第一范式(1NF)是对关系模式的设计基本要求,一般设计中都必须满足第一范式(1NF)。不过有些关系模型中突破了1NF的限制,这种称为非1NF的关系模型。换句话说,是否必须满足1NF的最低要求,主要依赖于所使用的关系模型。

特点:属性不可分割,即每个属性都是不可分割的原子项。(实体的属性即表中的列)

2. 第二范式(2NF)

在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)。

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。例如在员工表中的身份证号码即可实现每个一员工的区分,该身份证号码即为候选键,任何一个候选键都可以被选作主键。在找不到候选键时,可额外增加属性以实现区分,如果在员工关系中,没有对其身份证号进行存储,而姓名可能会在数据库运行的某个时间重复,无法区分出实体时,设计辟如ID等不重复的编号以实现区分,被添加的编号或ID选作主键。(该主键的添加是在ER设计时添加,不是建库时随意添加)。

第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。

特点:

  • 满足第一范式;
  • 第二范式需要确保数据表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言),每张表只描述一件事情;
  • 消除部分依赖,要求一张表中的每一列都完全依赖于主键(针对于组合主键),也就是不会出现某一列只和部分主键相关。

3. 第三范式(3NF)

在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)。

第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传递依赖于主属性。

特点:

  • 前提:满足第一范式和第二范式;
  • 第三范式需要确保数据表中的每一列数据表和主键直接相关,而不能间接相关;
  • 消除传递依赖,要求一张表中的每一列都和主键是直接依赖的,不是间接依赖。
更多推荐

EFLAGS寄存器与JCC指令

EFLAGS寄存器EFLAGS寄存器有32位,EFLAGS寄存器的标志位可以通过各种指令进行操作和判断,例如条件分支指令、算术指令和控制指令等。程序可以根据标志位的值来进行条件判断和控制流程,从而实现不同的逻辑和功能。EFLAGS寄存器的各个位和标志位含义如下:CF(CarryFlag):进/借位标志位。用于表示某些算

java学习平台springboot004

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路,向着优秀程序员前行!🍅更多优质项目👇🏻👇🏻可点击下方获取🍅文章底部或评论区获取🍅Java项目精品实

【SpringCloud微服务全家桶学习笔记-服务调用Ribbon/openFeign】

SpringCloud微服务全家桶学习笔记内容:SpringCloud+SpringCloudalibaba技术栈:Java8+maven+git,github+Nginx+RabbitMQ+SpringBoot2.0仓库:链接服务调用Ribbon是什么?Ribbon是Netflix发布的开源项目,主要功能是提供客户端

【LeetCode每日一题合集】2023.9.11-2023.9.17(⭐反悔贪心&拓扑排序&Floyd)

文章目录630.课程表III解法——反悔贪心⭐⭐⭐⭐⭐1462.课程表IV⭐解法1——拓扑排序预处理解法2——Floyd算法判断是否存在路径2596.检查骑士巡视方案(方向模拟)1222.可以攻击国王的皇后(方向模拟)LCP50.宝石补给(简单模拟)198.打家劫舍(经典线性DP)213.打家劫舍II(循环打家劫舍)代

成功入选 2023 谷歌出海创业加速器,Tapdata 乘势远航

9月6日,2023Google开发者大会的收官之行于上海拉开帷幕。会间,官方正式公布了最新一期谷歌出海创业加速器入营名单,Tapdata成功入选:长期以来,Google开发者大会为开发者提供了一个独一无二的学习和合作机会,这是一场汇聚全球创新者的聚会,鼓励创新思维。从中能够深入了解最新的技术趋势、工具和平台,与行业内顶

Linux学习-HIS系统部署(2)

GitLab服务器搭建使用rpm包本地部署GitLab服务器#确认GitLab主机硬件配置,注GitLab服务器至少要有4G内存,关闭SWAP分区[root@gitlab~]#free-mtotalusedfreesharedbuff/cacheavailableMem:40211163786161183720Swap

【文末送书】计算机网络编程 | epoll详解

欢迎关注博主Mindtechnist或加入【智能科技社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关注公粽号《机器和智能》回复关键词“python项目实战”即可获取美哆商城视频资源

【无公网IP】安装Wnmp并结合内网穿透,实现灵活可靠的外网访问内网服务!

文章目录前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1注册账号3.2下载cpolar客户端3.3登录cpolarwebui管理界面3.4创建公网地址4.固定公网地址访问前言WNMP是Windows系统下的绿色Nginx+Mysql+PHP环境集成套件包,安装完成后即可得到一个Nginx+My

erlang练习题(二)

题目一替换元组或列表中指定位置的元素,新元素作为参数和列表或元组一起传入函数内解答replaceIdx(List,Index,Val)->replaceIdx(List,Index,Val,1,[]).replaceIdx([],_,_,_,Acc)->lists:reverse(Acc);%%到达替换位置的处理rep

期权如何交易?期权如何做模拟交易?

买卖期权的第一步就是要有期权账户,国内的期权品种有商品期权和ETF期权以及股指期权,每种的开户方式和要求都不同,下文为大家介绍期权如何交易?期权如何做模拟交易?一、期权交易需要开立一个期权账户,可以交易期权的平台有证券/期货公司、三方的期权平台。期权交易从方向上可以分为看涨期权和看跌期权,对于这两种期权在交易上又都可以

排序算法:归并排序(递归和非递归)

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关排序算法的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!C语言专栏:C语言:从入门到精通数据结构专栏:数据结构个人主页:stackY、​目录1.归并排序1.1递归版本代码演示:1.2非递归版本代码演示:测试排序:改正代码1:测试排序:

热文推荐