数据库三大范式是什么?(3NF详解)
什么是范式?
范式是数据库设计时遵循的一种规范,不同的规范要求遵循不同的范式。
最常用的三大范式
第一范式(1NF):属性不可分割,即每个属性都是不可分割的原子项。(实体的属性即表中的列)
第二范式(2NF):满足第一范式;且不存在部分依赖,即非主属性必须完全依赖于主属性。(主属性即主键;完全依赖是针对于联合主键的情况,非主键列不能只依赖于主键的一部分)
第三范式(3NF):满足第二范式;且不存在传递依赖,即非主属性不能与非主属性之间有依赖关系,非主属性必须直接依赖于主属性,不能间接依赖主属性。(A -> B, B ->C, A -> C)
举例说明3NF:
1NF
属性不可再分,即表中的每个列都不可以再进行拆分。
如下学生信息表(student):
id、name(姓名)、sex_code(性别代号)、sex_desc(性别描述)、contact(联系方式)
primary key(id)
id | name | sex_code | sex_desc | contact |
---|---|---|---|---|
001 | 张三 | 0 | 男 | 17835201234_山西省运城市xx村 |
002 | 李四 | 0 | 男 | 17735204567_山西省吕梁市yy村 |
003 | 王五 | 1 | 女 | 18835207890_山西省太原市zz村 |
如果在查询学生表时经常用到学生的电话号,则应该将联系方式(contact)这一列分为电话号(phone)和地址(address)两列,这样才符合第一范式。
修改使表满足1NF后:
id | name | sex_code | sex_desc | phone | address |
---|---|---|---|---|---|
001 | 张三 | 0 | 男 | 17835201234 | 山西省运城市xx村 |
002 | 李四 | 0 | 男 | 17735204567 | 山西省吕梁市yy村 |
003 | 王五 | 1 | 女 | 18835207890 | 山西省太原市zz村 |
判断表是否符合第一范式,列是否可以再分,得看需求,如果将电话号和地址分开才能满足查询等需求时,那之前的表设计就是不满足1NF的,如果电话号和地址拼接作为一个字段也可以满足查询、存储等需求时,那它就满足1NF。
2NF
在满足1NF的前提下,表中不存在部分依赖,非主键列要完全依赖于主键。(主要是说在联合主键的情况下,非主键列不能只依赖于主键的一部分)
如下学生成绩表(score):
stu_id(学生id)、kc_id(课程id)、score(分数)、kc_name(课程名)
primary key(stu_id, kc_id)
stu_id | kc_id | score | kc_name |
---|---|---|---|
001 | 1011 | 85 | 高数3-1 |
001 | 1022 | 79 | 计算机组成原理 |
002 | 1011 | 59.9 | 高数3-1 |
表中主键为stu_id和kc_id组成的联合主键。满足1NF;非主键列score完全依赖于主键,stu_id和kc_id两个值才能决定score的值;而kc_name只依赖于kc_id,与stu_id没有依赖关系,它不完全依赖于主键,只依赖于主键的一部分,不符合2NF。
修改使表满足2NF后:
成绩表(score) primary key(stu_id)
stu_id | kc_id | score |
---|---|---|
001 | 1011 | 85 |
001 | 1022 | 79 |
002 | 1011 | 59.9 |
课程表(kc) primary key(kc_id)
kc_id | kc_name |
---|---|
1011 | 高数3-1 |
1022 | 计算机组成原理 |
将原来的成绩表(score)拆分为成绩表(score)和课程表(kc),而且两个表都符合2NF。
3NF:
在满足2NF的前提下,不存在传递依赖。(A -> B, B -> C, A->C)
如下学生信息表(student):
primary key(id)
id | name | sex_code | sex_desc | phone | address |
---|---|---|---|---|---|
001 | 张三 | 0 | 男 | 17835201234 | 山西省运城市xx村 |
002 | 李四 | 0 | 男 | 17735204567 | 山西省吕梁市yy村 |
003 | 王五 | 1 | 女 | 18835207890 | 山西省太原市zz村 |
表中sex_desc依赖于sex_code,而sex_code依赖于id(主键),从而推出sex_desc依赖于id(主键);sex_desc不直接依赖于主键,而是通过依赖于非主键列而依赖于主键,属于传递依赖,不符合3NF。
修改表使满足3NF后:
学生表(student) primary key(id)
id | name | sex_code | phone | address |
---|---|---|---|---|
001 | 张三 | 0 | 17835201234 | 山西省运城市xx村 |
002 | 李四 | 0 | 17735204567 | 山西省吕梁市yy村 |
003 | 王五 | 1 | 18835207890 | 山西省太原市zz村 |
性别代码表(sexcode) primary key(sex_code)
sex_code | sex_desc |
---|---|
0 | 男 |
1 | 女 |
将原来的student表进行拆分后,两个表都满足3NF。
什么样的表越容易符合3NF?
非主键列越少的表。(1NF强调列不可再分;2NF和3NF强调非主属性列和主属性列之间的关系)
如代码表(sexcode),非主键列只有一个sex_desc;
或者将学生表的主键设计为primary key(id,name,sex_code,phone),这样非主键列只有address,更容易符合3NF。
数据库三大范式是什么?(3NF详解)相关推荐
- 3nf mysql表_数据库三大范式(1NF,2NF,3NF)及ER图
数据库三大范式(1NF,2NF,3NF)及ER图 百度官方解释: 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据 ...
- 数据库三大范式详解实例图文教程
title: 数据库三大范式详解实例图文教程 date: 2021-09-04 20:29:31 tags: 数据库 MySQL categories: 数据库 cover: https://cove ...
- 数据库三大范式详解,部分依赖、完全依赖、传递依赖
数据库三大范式详解以及部分.完全.传递依赖 一.第一范式 二.第二范式 三.第三范式 四.部分依赖.完全依赖.传递依赖 完结撒花 一.第一范式 数据库每一列都是不可分的基本数据项(原子数据项) 就比如 ...
- 数据库三大范式(1NF,2NF,3NF)及ER图
数据库三大范式(1NF,2NF,3NF)及ER图 百度官方解释: 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据 ...
- 数据库随笔-1NF,2NF,3NF详解
数据库随笔-1NF,2NF,3NF详解 基础概念 通过表的更新来举例说明 总结 基础概念 1. 第一范式(1NF):每一列都是不可分割的原子数据项 2. 第二范式(2NF):在1NF的基础上,非码属性 ...
- 数据库第一范式,第二范式,第三范式详解
数据库第一范式,第二范式,第三范式详解 基础知识 实体:现实世界中客观存在并可以被区别的事物.比如"一个学生"."一本书"."一门课"等等. ...
- mysql三大范式 答案_数据库三大范式定义与理解
数据库三大范式定义与理解 发布时间:2018-06-04 10:24, 浏览次数:291 一.第一范式(1NF) 要求: 要求:每一个分量必须是不可分的数据项. 特点: 1)有主键,且主键不能为空. ...
- 浅显易懂 SQLite3 笔记(08)— 数据库三大范式
文章目录 前言 一.函数依赖 1.第一定义 2.第二定义 3.第三定义 二.数据库范式 1.第一范式 2.第二范式 3.第三范式 4.范式关系图 5.范式对查询的影响 总结 前言 本篇,我们将学 ...
- 数据库三大范式(重要)
转自微信 上周四下午的VIP试听课是由芒果给大家介绍的MySQL的一些基础知识,在这里芒果给大家分享其中的一部分内容--对数据库三大范式做个小介绍: 范式(数据库的设计范式)是符合某一种级别的关系模式 ...
- 关系型数据库三大范式介绍
文章目录 一.为什么使用范式? 二.什么是数据库三大范式? 1.第一范式 2.第二范式 3.第三范式 三.数据库设计一定要遵循三大范式吗? 四.总结 一.为什么使用范式? 要想设计-个好的关系,必须使 ...
最新文章
- 程序员被公司辞退12天,领导要求回公司讲代码
- 山东华为服务器安装系统,山东云服务器平台安装
- TFS 2008 中文版安装记录
- MATLAB中的fft后为何要用fftshift?
- 图像的阈值分割(迭代法选择阈值)
- python文本关键词匹配_NLP利剑篇之模式匹配
- CentOS 7 Linux 的初始化系统(系统服务管理和控制程序/Init System) -- systemd 详解
- iOS 7.1 的 Safari 为 meta 标签新增 minimal-ui 属性,在网页加载时隐藏地址栏与导航栏...
- 正则表达式中,[\s\S]*
- (转)openlayers实现在线编辑
- 代码上传到github上
- 互联⽹名词⼤全——商业模式篇
- 2022-08-26 Unity视频播放3——VideoPlayer
- 仓库管理软件免费版选型应该注意的关键点
- scrapy爬虫简单实例
- 购买的随身WiFi扣卡日记-拆掉内置的esim流量卡
- QT 中怎样实现延时 stop
- 【记录】前端知识点 - Vue
- 【测试】测试人员部署测试环境是什么意思
- simulink实现他励直流电动机能耗制动仿真
热门文章
- 手机端学习助手的说明书需求以及团队PM选择
- 【游戏分析】《阴阳师:百闻牌》1.0.12版本 游戏体验分析总结
- MyBatis批量insert map集合
- 笔记本电脑因安装软件重启导致黑屏?
- python怎样输出字符串和数字_Python 字符串和数字
- C语言中字符串分配几个字节,浅谈C++中的string 类型占几个字节
- [sig12]《正当防卫2》的渲染技术1
- 一台计算机显示屏的面积是20,24/27/32寸电脑显示器尺寸多大?长宽多少厘米?显示屏长宽与面积的算法...
- 用英语编辑计算机学习对话60字,自我介绍用英语写作文60字
- 厉害了!小伙凭这套表情包赚了50万!你还在斗图,人家已经赚钱了