数据库范式
前言
-------------写在前面-------------
学习数据库时,对范式总是一知半解,所以打算用故事去引导学习,希望我的舔狗经历和学习引起共鸣,所以把自己的心得体会写出来,给大家陆续分享出来,如果觉得有帮助可以点赞收藏支持一下,如果能关注一下就再好不过了ヾ(≧▽≦*)o,之后还会分享许多干货,话不多说,开始学习
一、范式的概念是什么?
范式:设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求(设计标准)被称为不同的范式。
1NF的要求是最小的,越大要遵守的条条框框就越多。
范式你可以想象为初恋和你的距离,1NF就是亲密度最低的普通关系,随着关系升温到了5NF亲密无间,
二、范式解析
第一范式(常用)
第一范式是最基本的范式,本质就是数据表的字段(注意数据表里面属性又称为字段)无法再分割。
但是地址就可以分为 省 、市、详细地址 ,又或者说是 户籍所在地、现居地址等等多种(具体问题具体看待)。所以这个表就不满足第一范式的数据库,自然而然不是关系数据库!( 如果学过非关系型数据库,例如Hbase,里面的字段就可分,例如进货字段又分为数量、单价字段)
地址拆分为 -->户籍所在地、现居地址
重新设计为
萍水相逢
女神、普通人、我、类比字段,这么多人之间有很多关系理不清,但是不重要我们相聚在一起,同时我们都是无法分割的字段,所以现在我们是1NF范式。
第二范式(常用)
第二范式:若某关系R属于第一范式,且每一个非主属性完全函数依赖于任何一个候选码,则关系R属于第二范式。(看不懂没关系)
本质就是所有的字段都和的主键有关系,(通过主键去确认其他字段)
需要解释一下关键词
候选码:候选码(字段组)确定,其他的也就确定了。例如在名字不重复的情况下,可以通过 学号、姓名确定其他字段的值,学号、姓名就是候选码。
主属性:所有候选码的属性称为主属性
非主属性:所有候选码的属性以外的称为非主属性
部分函数依赖
例如这个表
完全函数依赖
所有的非主属性都和主键相关。
Y{学号}—>姓名
Y{学号}—>手机
Y{学号}—>地址
一见倾心
女神认识我们每一个人,这种微妙的关系称为完全函数依赖,这个时候就是2NF关系。
非2NF范式例子
女神带上她的孩子找到我,我很难受,出去散散心。(这种让人0疼关系就是函数依赖)
结果女神走了,但是她的孩子找到我了,我更难过了(这种让人 00 疼关系就是部分函数依赖)
女神和他孩子都是主属性,女神的孩子和我这个非主属性的关系是部分函数传递,有这种关系就不是2NF。
第三范式(常用)
第三范式:3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。也就是说, 如果存在非主属性对于码的传递函数依赖
确保每列都和主键列直接相关,而不是间接相关,则不符合3NF的要求
这种关系称为传递函数依赖,只要有这种关系的就不是3NF。
飞鸽传书
过了几天女神给通过中间人告诉我,那个小孩是她弟弟,我是眉飞眼笑,有这种传递的关系,则就不能成为3NF。去掉这个中间人则就是3NF。
BCNF范式(常用)
BCNF: 3NF 的基础上消除主属性对于码的部分与传递函数依赖,
简单来说
若一个关系达到了第三范式,并且只有一个候选,则该关系就是到BCNF范式
一如既往
女神说完以后,就把她弟弟托付给我,(主属性之间的传递函数),我欲哭无泪,有这种关系就不能算是BCNF关系,
第四范式(少见)
第四范式:在BCNF的基础上,消除非平凡且非函数依赖的多值依赖(即把同一表内的多对多关系删除)
第五范式(少见)
第五范式:在第四范式的基础上,消除传递依赖
实战练习
某销售公司数据库的零件关系P(零件号,零件名称,供应商,供应商所在地,库存量),函数依赖集F={零件号→零件名称,(零件号,供应商)→库存量,供应商→供应商所在地)。零件关系模式P属于()。
查询各种零件的平均库存量、最多库存量与最少库存量之间差值的SQL语句如下:SELECT零件号,零件名称,( ) ,
FROM P( ) ;
问题1
A.1NF
B.2NF
C.3NF
D.4NF
相当于女神的孩子找到我,所以不能算是2NF,所以选A
问题2
A.AVG(库存量)AS平均库存量,MAX(库存量)-MIN(库存量)AS差值
B.平均库存量AS AVG(库存量),差值AS MAX(库存量)-MIN(库存量)
C.AVG库存量AS平均库存量,MAX库存量-MIN库存量AS差值
D.平均库存量AS AVG库存量,差值AS MAX库存量-MIN库存量
问题3
A.ORDER BY供应商
B.ORDER BY零件号
C.GROUPBY供应商
D.GROUPBY零件号
总结
学习数据库的范式,在我看来是为了有更好的数据表,更严格的范式,是把数据库拆解的更加原子化,避免数据冗余、删除异常、插入异常等等。
如果那有错误,欢迎斧正,我会去进行修改,如果觉得不错可以点赞、收藏、评论支持一下,每条评论我都会回复,谢谢大家!