范式
参考链接:https://developer.aliyun.com/article/1467681
第一范式1NF:
特点:属性具有原子性,不可再分割;属性值不重复,确保数据完整性和一致性,避免数据冗余(列名是唯一的)
举例:

第二范式:
-
要求:非主属性必须完全依赖于候选码,不能部分依赖于候选码。
-
部分依赖:如果存在某个非主属性,只需要候选键的一部分就能确定,就是部分依赖。如在复合主键下,非主属性可能存在部份依赖。
-
举例解析

解析:候选码为{学生ID,课程ID},非主属性有:
学生姓名:依赖学生ID,ID决定姓名,不需要课程ID,所以非主属性学生姓名部分依赖于候选码,不符合2NF。
课程名称:依赖课程ID,课程ID决定课程名称,不需要学生ID,所以非主属性课程名称部分依赖候选码,不符合2NF。
成绩:依赖于学生ID和课程ID(谁考的哪门课,得出来成绩。要知道一个学生某门课的成绩,必须同时知道是哪个学生(学生ID)和哪门课(课程ID)),所以非主属性成绩完全依赖于候选码,符合2NF。
- 规范化作用
通过分解表消除非主属性对候选码的部分依赖,能减少数据冗余,保持数据一致性。
规范2NF-分解消除部分依赖
接以上,学生姓名部分依赖候选码;课程名称部分依赖候选码;均不符合2NF,通过拆分表的方式规范化。
表A(学生ID,学生姓名)
表B(课程ID,课程名称)
表C(学生ID,课程ID,成绩)
这样,三张表都与各自的候选码之间形成完全依赖关系,符合2NF。通过分解的方式消除部份依赖,达到每张表都符合2NF的规范。
第三范式
-
要求:在满足2NF的基础上,消除非主属性之间的传递依赖,使得非主属性必须完全依赖候选码,而不能依赖其他非主属性。即:非主属性之间是独立的,不能存在依赖关系。
-
3NF的作用:
减少数据冗余,在数据完整性和一致性上达到很好的平衡;提高查询效率。
- 举例
员工编号-姓名-部门编号-部门名称-部门简介
此时:员工编号是主属性,姓名/部门编号/部门名称/部门简介 均完全依赖主属性。即:确定了一个ID后,就可以确定姓名、所在部门编号、部门名称、部门简介。所以满足2NF。
但,非主属性之间存在传递依赖,部门名称/部门简介依赖于部门编号。即:确定了部门编号后,就可以确定部门名称、部门简介。即:
员工编号------>部门编号------>部门名称;
员工编号------>部门编号------>部门简介;
3NF的要求是非主属性之间不能有依赖,需要把后面两个传递依赖消除,通过拆分表的方式消除传递依赖,减少数据冗余,提高查询效率。
拆分为:员工编号------姓名------部门编号;部门编号------部门名称------部门简介。
规范化3NF-分解消除非主属性之间传递依赖

判断范式:当前属性具有原子性、没有重复属性值,符合1NF;非主属性商品类比id、商品类比名称、商品名称、商品价格完全依赖商品主键id,不存在部份依赖,满足2NF;商品类别名称依赖于商品类别id,存在传递依赖,不满足3NF,会造成大量数据冗余;因此应该拆分表的方式消除非主属性之间的传递依赖,以满足3NF。拆分如下:
表1:商品主键id-商品名称-商品价格-商品类别id
表2:商品类别id-商品类别名称
小结范式优缺点
3NF:消除数据冗余,在数据完整性、一致性上达到很好平衡;但在数据查询上可能需要关联多张表,造成查询效率低。
从关系模型写SQL查询
ER图转关系模型,不多说。
1-N,在N端加入1端主码和联系的属性;
1-1,在任一端加入另一端主码和联系的属性;
M-N,联系作为单独的关系模式,将双方主码加入,联合作为外码,同时联系属性不能缺。
根据关系模型,查询SQL时:
(1)将每个关系模式看作一张表,主码作为表的主键,外码作为表的外键
(2)看查询语句中查的是哪个属性,限制条件分别是哪个属性
(3)(2)中的几个属性分别在哪几个关系模式中(哪几张表中)
(4)这几张表之间有联系吗(外码作为另一个主码),若有,多表查询即可;若么有,引入一个能作为中间桥梁的表就行。
【举例说明】

补全关系模式 参会(会议编号,工号,参会身份);使用(会议编号,资料编号,使用数量);接触(工号,资料编号,接触方式)
(2) 要查询的是人员姓名属性;限制条件1 2022-09-03的会议日期属性;限制条件2 列席的参会身份属性。这三个属性分别属于人员表、会议表、参会表三张表。刚好参会表可以把这三张表串起来,即:多表查询即可。
sql
SELECT 人员.姓名 FROM 人员,会议,参会
WHERE 人员.工号=参会.工号 AND 会议.会议编号=参会.会议编号
AND 会议日期="2022-09-03" AND 参会身份="列席"
todo SQL查询
sql
where
having + 聚合函数
avg count+distinct sum
in(,)
between and