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必知必会
登录|注册

22丨反范式设计:3NF有什么不足,为什么有时候需要反范式设计?

陈旸 2019-07-31
上一篇文章中,我们介绍了数据表设计的三种范式。作为数据库的设计人员,理解范式的设计以及反范式优化是非常有必要的。
为什么这么说呢?了解以下几个方面的内容之后你就明白了。
3NF 有什么不足?除了 3NF,我们为什么还需要 BCNF?
有了范式设计,为什么有时候需要进行反范式设计?
反范式设计适用的场景是什么?又可能存在哪些问题?

BCNF(巴斯范式)

如果数据表的关系模式符合 3NF 的要求,就不存在问题了吗?我们来看下这张仓库管理关系 warehouse_keeper 表:
在这个数据表中,一个仓库只有一个管理员,同时一个管理员也只管理一个仓库。我们先来梳理下这些属性之间的依赖关系。
仓库名决定了管理员,管理员也决定了仓库名,同时(仓库名,物品名)的属性集合可以决定数量这个属性。
这样,我们就可以找到数据表的候选键是(管理员,物品名)和(仓库名,物品名),
然后我们从候选键中选择一个作为主键,比如(仓库名,物品名)。
在这里,主属性是包含在任一候选键中的属性,也就是仓库名,管理员和物品名。非主属性是数量这个属性。
如何判断一张表的范式呢?我们需要根据范式的等级,从低到高来进行判断。
首先,数据表每个属性都是原子性的,符合 1NF 的要求;其次,数据表中非主属性”数量“都与候选键全部依赖,(仓库名,物品名)决定数量,(管理员,物品名)决定数量,因此,数据表符合 2NF 的要求;最后,数据表中的非主属性,不传递依赖于候选键。因此符合 3NF 的要求。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《SQL必知必会》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(16)

  • 老毕 置顶
    一言以蔽之:反范式无处不在。😃

    最近正在基于Hadoop建设某国企的数据集市项目(地域性非全网),恰如老师所言,我们就是在遵循反范式的设计。

    简要来说,我们把数据加工链路分为四层,从下到上依次为:ODS贴源层、DWD明细层、DWS汇总层和ADS应用层。

    多源异构的业务数据被源源不断ETL到ODS贴源层之后,经过清洗、规范、转换、拼接等,生成各类宽表存储在DWD明细层;再根据业务模型设计,以这些宽表为基础,生成各类标准的指标数据存储在DWS汇总层;ADS层则基于DWS层的汇总指标再度组合,计算得出应用层数据,直接面向业务需求。

    在这样的系统设计中,反范式不仅体现在“宽表”的设计中,更体现在数据加工链路的完整生命周期中——上层都是对下层的冗余。
    2019-07-31
    4
    20
  • leslie
    个人对于反范式的理解是:它会造成数据的冗余甚至是表与表之间的冗余;不过它最大的好处是减少了许多跨表查询从而大幅减少了查询时间。早期的设计其实一直强调范式化设计,可是当memcache出现后-其实就反向在揭示范式的不足。
           互联网行业和传统行业最大的区别是要求相应时间的短暂:这就造成了效率优先,这其实也是为何互联网行业的技术更新和使用走在最前面。曾经经历过设计表的过程中尽力追求范式,可是最终发现带来的问题就是性能的不足;范式其实就是规范,可是完完全全的规范-碰到特殊场景就不能那样使用。10年前接触到非关系型数据库时就引发了这种思考,sql server和mysql的机制和查询特长的不同更加引发了自己对于范式的反思。
          其实不同数据库对于范式的操作应当是不同的不同行业对于效率的要求是不同的:我觉得范式与反范式的关系可能有点像现在关系型数据库和非关系型数据库的使用一样,已经不再是单一化,如何让二者合理结合最大发挥数据库的查询效率才是关键-只有最合适的没有最好的;当我们过度的追求标准化时反而会忽视了产品真实的功能者作用,如何充分合理发挥产品性能其实才是我们所追求的。
             老师觉得呢:没有最标准的,任何方式都有缺陷,没有最好的只有最合适的;就像Google 的SRE中有句经典的话“没有问题的程序是程序的特殊状态”。

    作者回复: 总结和阐述的很好,大家都可以看下
    “没有问题的程序是程序的特殊状态” 这个赞一下

    2019-07-31
    18
  • Yuhui
    这个数据集都是百万条记录的,如果直接导入MySQL比较慢。如果先做以下设置会大大提高导入的速度:
    SET GLOBAL unique_checks=0;
    SET GLOBAL innodb_flush_log_at_trx_commit=0;
    SET GLOBAL sync_binlog=0;

    当然这不是SQL的问题,是数据库工作方式的问题,不在本课讨论范围内,只是提供大家参考,节省准备的时间。

    导入完成以后记得把所有设置都改回1。
    2019-09-19
    2
  • 习惯沉淀
    MySQL8.0执行存储过程语句报错?[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3
    2019-08-06
    1
    1
  • 川杰
    老师您好,想问个问题;假设我在存储过程中,用到了一个临时表(作用就是保存中间数据以便后续做其他操作),先对临时表进行数据删除操作,然后对临时表进行插入操作。假设现在有两个人A,B同时调用该存储过程,是否存在如下风险,即:A执行存储过程时,正在删除数据,同一时刻,B执行存储过程时,新增数据?
    2019-08-01
    2
    1
  • olap可以用反范式,但oltp就不适合了,实时的交易和数据变化,反范式的空间换时间不适合
    2019-11-18
  • Geek_98a68c
    请问老师,冗余字段的更新有哪些方式啊?文中只是提到存储过程更新冗余字段
    2019-11-12
  • grey927
    比如用户每次更改昵称的时候,都需要执行存储过程来更新,如果昵称更改频繁,会非常消耗系统资源。
    > 其实不是不是不去同步更新昵称会比较好,就像微博的设计 ,当初我被人@的是A这个昵称,后续我改了昵称,变成了C,之前@A的这个链接就找不到我的信息了,这样是不是会好一点。
    2019-11-08
  • 峻铭
    反范式优化之前 实验结果是0.038秒,使用反范式添加user_name之后实验结果为0.002秒。怎么和老师的结果差别这么大呢

    作者回复: 不同的设备和运行环境 处理的时间不同,只要能证明这种情况下 反范式优化效率更高即可。

    2019-09-09
  • Back to the original beaut...
    选键是(管理员,物品名)和(仓库名,物品名)
    老师,你这里的意思是:管理员+物品名 组成一个候选键,然后仓库名+物品名 组成一个候选键的意思嘛?
    2019-09-02
  • 吃饭饭
    问个问题:【我们就可以找到数据表的候选键是(管理员,物品名)和(仓库名,物品名)】这里不太明白,如果我选择【候选键是(仓库名,物品名)和(管理员,物品名)】可不可以?
    2019-08-02
    2
  • ABC
    有一个问题,请问老师,如果一个字段内容存的是:

    会员ID@会员名称

    这样是不是算违反第一范式?在工作中遇到过类似方式存储的数据,但由于历史数据和牵涉过多的原因,已经无法修改。。

    在每次做统计类需求的时候,就会用反范式设计,方便查询,而且速度会很快。


    2019-08-01
    2
  • 床头猫🐱
    老师你好,有个问题,就是我这里有四张表都是1对1关联的,数据量大概四千多万,用left join和分四条sql查,哪个更好一点,oracle数据库,两种方式都会命中索引
    2019-07-31
  • 夜路破晓
    范式与反范式,正如传统与解构,规则与务实,稳定与突破,守成与创新,是阴阳动静的矛盾关系,两者一而二,二而一,即和而不同、求同存异,落脚点是务实,也就是应用场景和业务需求。
    所以说,这已经不单是数据库设计的问题,而中国哲学体系在互联网商业中实践指导。
    数据库设计提出范式的同时存在反范式的要求,符合否定之否定的螺旋上升轨迹,是数据库也是SQL语言保持强壮生命力而经久不衰的重要原因,是现实生存逻辑的映射。

    作者回复: 是的,很多设计思维都是相通的。不仅是正反两方面,有时候我们还会遇到 Exploit & Explore的问题,这个在探索未知世界,比如深度学习的收敛算法中会应用。

    2019-07-31
  • 全有
    老师你好,抛开本次课程,问一个现象:
    慢查询日志如下:
    # Query_time: 10.612971 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0
    SET timestamp=1564551836;
    commit;

    两个问题:
    1:Commit 是如何发生的,做啦什么事?
    2: 所耗时长为什么会那么久?
    2019-07-31
  • 许童童
    老师你好,问个问题。如果用记表国用户名称字段修改了,那评论表中用户名称是否要跟着改呢。这个怎么处理?
    2019-07-31
收起评论
16
返回
顶部