SQL必知必会
陈旸
清华大学计算机博士
立即订阅
10179 人已学习
课程目录
已完结 49 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词丨SQL可能是你掌握的最有用的技能
免费
第一章:SQL语法基础篇 (19讲)
01丨了解SQL:一门半衰期很长的语言
02丨DBMS的前世今生
03丨学会用数据库的方式思考SQL是如何执行的
04丨使用DDL创建数据库&数据表时需要注意什么?
05丨检索数据:你还在SELECT * 么?
06丨数据过滤:SQL数据过滤都有哪些方法?
07丨什么是SQL函数?为什么使用SQL函数可能会带来问题?
08丨什么是SQL的聚集函数,如何利用它们汇总表的数据?
09丨子查询:子查询的种类都有哪些,如何提高子查询的性能?
10丨常用的SQL标准有哪些,在SQL92中是如何使用连接的?
11丨SQL99是如何使用连接的,与SQL92的区别是什么?
12丨视图在SQL中的作用是什么,它是怎样工作的?
13丨什么是存储过程,在实际项目中用得多么?
14丨什么是事务处理,如何使用COMMIT和ROLLBACK进行操作?
15丨初识事务隔离:隔离的级别有哪些,它们都解决了哪些异常问题?
16丨游标:当我们需要逐条处理数据时,该怎么做?
17丨如何使用Python操作MySQL?
18丨SQLAlchemy:如何使用Python ORM框架来操作MySQL?
19丨基础篇总结:如何理解查询优化、通配符以及存储过程?
第二章:SQL性能优化篇 (18讲)
20丨当我们思考数据库调优的时候,都有哪些维度可以选择?
21丨范式设计:数据表的范式有哪些,3NF指的是什么?
22丨反范式设计:3NF有什么不足,为什么有时候需要反范式设计?
23丨索引的概览:用还是不用索引,这是一个问题
24丨索引的原理:我们为什么用B+树来做索引?
25丨Hash索引的底层原理是什么?
26丨索引的使用原则:如何通过索引让SQL查询效率最大化?
27丨从数据页的角度理解B+树查询
28丨从磁盘I/O的角度理解SQL查询的成本
29丨为什么没有理想的索引?
30丨锁:悲观锁和乐观锁是什么?
31丨为什么大部分RDBMS都会支持MVCC?
32丨查询优化器是如何工作的?
33丨如何使用性能分析工具定位SQL执行慢的原因?
34丨答疑篇:关于索引以及缓冲池的一些解惑
35丨数据库主从同步的作用是什么,如何解决数据不一致问题?
36丨数据库没有备份,没有使用Binlog的情况下,如何恢复数据?
37丨SQL注入:你的SQL是如何被注入的?
第三章:认识DBMS (7讲)
38丨如何在Excel中使用SQL语言?
39丨WebSQL:如何在H5中存储一个本地数据库?
40丨SQLite:为什么微信用SQLite存储聊天记录?
41丨初识Redis:Redis为什么会这么快?
42丨如何使用Redis来实现多用户抢票问题
43丨如何使用Redis搭建玩家排行榜?
44丨DBMS篇总结和答疑:用SQLite做词云
第四章:SQL项目实战 (3讲)
45丨数据清洗:如何使用SQL对数据进行清洗?
46丨数据集成:如何对各种数据库进行集成和转换?
47丨如何利用SQL对零售数据进行分析?
结束语 (1讲)
结束语 | 互联网的下半场是数据驱动的时代
SQL必知必会
登录|注册

21丨范式设计:数据表的范式有哪些,3NF指的是什么?

陈旸 2019-07-29
在日常工作中,我们都需要遵守一定的规范,比如签到打卡、审批流程等,这些规范虽然有一定的约束感,却是非常有必要的,这样可以保证正确性和严谨性,但有些情况下,约束反而会带来效率的下降,比如一个可以直接操作的任务,却需要通过重重审批才能执行。
实际上,数据表的设计和工作流程的设计很像,我们既需要规范性,也要考虑到执行时的方便性。
今天,我来讲解一下数据表的设计范式。范式是数据表设计的基本原则,又很容易被忽略。很多时候,当数据库运行了一段时间之后,我们才发现数据表设计得有问题。重新调整数据表的结构,就需要做数据迁移,还有可能影响程序的业务逻辑,以及网站正常的访问。所以在开始设置数据库的时候,我们就需要重视数据表的设计。
今天的课程你需要掌握以下几个方面的内容:
数据库的设计范式都有哪些?
数据表的键都有哪些?
1NF、2NF 和 3NF 指的是什么?

数据库的设计范式都包括哪些

我们在设计关系型数据库模型的时候,需要对关系内部各个属性之间联系的合理化程度进行定义,这就有了不同等级的规范要求,这些规范要求被称为范式(NF)。你可以把范式理解为,一张数据表的设计结构需要满足的某种设计标准的级别。
目前关系型数据库一共有 6 种范式,按照范式级别,从低到高分别是:1NF(第一范式)、2NF(第二范式)、3NF(第三范式)、BCNF(巴斯 - 科德范式)、4NF(第四范式)和 5NF(第五范式,又叫做完美范式)。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《SQL必知必会》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(29)

  • 夜路破晓
    数据库设计三重境:
    第一重:山无棱,天地合,乃敢与君绝。(1NF:不可分)
    第二重:玲珑骰子安红豆,入骨相思知不知。(2NF:完全性)
    第三重:问世间,情为何物,直教人生死相许?(3NF:直接性)
    2019-07-29
    4
    47
  • 老毕
    2NF和3NF都强调非主属性对主属性的依赖关系,2N针对完全依赖,3NF针对直接依赖,都是为了保持表的原子性。


    学生选课表,包含的属性有学号、姓名、课程名称、分数、系别和系主任,可拆分成以下表:

    1. 学生表:学号、姓名
    2. 课程表:课程号、课程名称
    3. 系别表:系别、系主任
    4. 学生-课程表:学号、课程号、分数
    5. 学生-系别表:学号、系别

    拆分之前,“姓名”违反了2NF,“系主任”违反了3NF。

    2019-07-29
    1
    17
  • Monday
    1NF:列的原子性,不可拆分
    2NF:针对于联合主键,非主属性完全依赖于联合主键,而非部分
    3NF:非主属性只能直接依赖于主键
    2019-08-11
    9
  • XIAOXIN
    又思考了一下课后练习题,感觉可以把“学生选课表”拆分成4个表。
    1.学生表:学号(主键),姓名,系别编号(外键)。
    2.课程表:课程编号(主键),课程名称。
    3.成绩表:学号,课程编号,分数(学号和课程编号,一起构成“联合主键”)。
    4.院系表:系别编号(主键),系别(名称),系主任。
    2019-07-29
    8
  • 未来的胡先森
    我所理解的第二范式和第三范式的不同:

    1、首先第三范式是第二范式的更进一步(要求更严格),要想满足第三范式首先要满足第二范式。

    2、而什么情况下能够满足第二范式呢?候选码能确定一条记录的所有信息。以老师文中的例子来对照:知道球员的编号是可以知道球员信息的,但是比赛编号、比赛时间是无法来通过球员信息来确定的。这张表需要两个候选码(球员编号、比赛编号)才能确定一条记录的信息。类似于这样的关系我们称为「部分依赖」,消除后才能算「第二范式」。

    3、第三范式的核心 —— 消除传递依赖。老师文中的图已经画的很清晰了,A->B,B->C,A->C,类似于这样依靠中间人串起的关系我们称之为「传递依赖」

    学生选课表我的修改:

    学生信息表:学号、姓名、系别编号

    课程信息表:课程编号、课程名称

    课程成绩表:学号、课程编号、分数

    系别信息表:系别编号、系别名称、系主任
    2019-08-13
    6
  • 发条
    对于理解1-3NF,CSDN的这篇文章作为辅助阅读挺好的:https://blog.csdn.net/wyh7280/article/details/83350722
    2019-08-06
    4
  • Cue
    第四范式这家公司起名来源难不成是和这个第四范式有关😄

    作者回复: 哈哈 你也可以起一个叫做 完美范式

    2019-07-29
    3
  • law
    建议课后习题,老师给出标准答案,或者对一些答案进行点评。
    2019-08-03
    2
  • grey927
    1.学号,姓名,系别
    2.学号,分数,课程名称
    3.系别,系主任
    2019-08-02
    1
  • cricket1981
    1. 学生表:学号、姓名、系别
    2. 课程表:课程名称
    3. 系别表:系别、系主任
    4. 成绩表:学号、课程名称、分数
    2019-07-30
    1
    1
  • Ronnyz
    作业:
    3NF区别于2NF是在于:字段非主属性不直接依赖主属性,而是通过依赖于其他非主属性而传递到主属性,解决办法就是让依赖非主属性的字段与依赖字段独立成表

    拆分1
    学生选课表,包含的属性有学号、姓名、课程名称、分数、系别和系主任
    - 姓名和系别都是依赖于学号
    - 系主任依赖系别
    - 系主任间接依赖学号
    院系表:系别(主键) 系主任
    学生表:学号 姓名 课程名称 分数 系别
    拆分2
    学生表,包含的属性有学号 姓名 课程名称 分数 系别
    选课那就会有课程表
    - 课程名称依赖于学号
    - 分数依赖于课程名称和学号
    学生表:学号(主键) 姓名 系别(外键)
    课程表:课程名称 学号 分数 //主键(课程名称,学号)
    2019-07-29
    1
  • 爬行的蜗牛
    表1: 学号, 姓名,课程名称, 分数 : 满足2NF , 学号或则姓名作为候选键与非主属性(课程和分数)拥有安全依赖关系; 满足3NF , 非主属性(课程名称和分数不传递依赖姓名)
    表2: 课程名称,系别,系主任
    2019-12-10
  • 小唐
    有的NoSQL最多只允许有两个key做primary key,但是业务要求三个才能保证unique,这时候把两个key用“-”连起来当成一个key是不是就违反了1NF?比如学号StudentId,课程courseId和小测testId,三个才能决定分数,那我把(学号, courseId + “-” + testId)当候选键,是不是就违反了1NF?
    2019-10-28
  • 爱思考的仙人球
    第三范式可以这样理解吗?假设表1有学号,姓名,分数等字段;然后修改表设计,增加了id和科目字段,结果id成了主键,但是姓名和分数还依赖于学号?
    2019-10-20
  • Henry
    感觉这一篇讲的有点复杂了,读起来有点拗口。

    作者回复: 哈哈 是稍微有些复杂,慢慢来

    2019-10-15
  • 莎吧啦
    学生表:学号(主键),姓名,课程ID,系ID。
    课程表:课程ID,课程名称。
    学院表:系ID,系别,系主任。
    2019-09-17
  • 森鱼
    依赖关系,我感觉很难看出来,有什么诀窍吗?
    2019-09-09
  • 吃饭饭
    区分 2NF 和 3NF 的关键点在于
    2NF:非主键列是否完全依赖于主键,还是依赖于主键的一部分;
    3NF:非主键列是直接依赖于主键,还是直接依赖于非主键列
    2019-08-02
  • 野马
    对于非计算机专业人来说,名词太多了,已经被这些名词吓到了,希望老师用大白话讲解每一个知识点,让三岁小孩儿或者八十岁老太太都能听懂的讲解方式讲解,谢谢!
    2019-07-30
  • cricket1981
    为什么不把BCNF称为第4范式?难道BCNF是后来发现的?
    2019-07-30
收起评论
29
返回
顶部