前言
本篇,我们将学习关系数据理论——数据库三大范式。了解什么是函数依赖,什么是数据库三大范式,以及范式对查询的影响。
一、函数依赖
- 在数据库范式中,有一个重要的概念叫做函数依赖,具体包括完全函数依赖、部分函数依赖和传递函数依赖。
1.第一定义
设R(U)是一个属性集U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称 “X函数唯一确定Y” 或 “Y函数依赖于X” ,记作X→Y。
【例】请分析以下各个关系存在的函数依赖集。
(1)关系S = {学号,姓名,性别,年龄}
答:函数依赖集F = {学号→姓名,学号→性别,学号→年龄}。
(2)关系SC = {学号,课程号,成绩}
答:函数依赖集F = {(学号,课程号)→ 成绩}。
2.第二定义
在R(U)中, 如果X→Y,并且对于X的任何一个真子集X’,都有X’→Y,则称Y对X完全函数依赖
。若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖
。
【例】请指出关系R = {学号,姓名,性别,系名,课程号,课程名,成绩} 的主码,并分析非主属性对主码的函数依赖的类别。
答:R的主码为(学号,课程号),成绩 完全依赖
(学号,课程号),姓名、性别、系名、课程名部分依赖
(学号,课程号)。
3.第三定义
R(U)中,如果X→Y,Y→X,Y→Z ,则称Z对X传递函数依赖。
【例】请分析关系中存在的传递函数依赖。
(1)关系R = {学号,姓名,系名,住处}
(2)关系Z = {职工号,职务,小时工资}
二、数据库范式
- 关系型数据库设计时为确保数据存储规范化,通常需要按照范式设计数据。
- 满足最低要求的叫第一范式,简称1NF;在第一范式中满足进一步要求的为2NF,以此类推。
- 一个低一级范式的关系模式通过
模式分解
可以转换为若干个高一级范式,这种过程叫做规范化
。
1.第一范式
- 定义:如果一个关系模式的所有属性都是不可分的基本数据项,则R∈1NF。
- 不符合1NF:
符合1NF:
2.第二范式
- 定义:若R∈1NF,且每一个非主属性完全函数依赖于码(任何一个候选码),则R∈2NF。
- 作用:2NF消除了非主属性对码的部分函数依赖。
【例】已知关系S-L-C的主码为(sno,cno) ,其中sloc为学生的住处,每个系的学生住在同一个地方。
问题分析:
关系S-L-C的每个字段表意明确,满足1NF。但存在非主属性sname、ssex、sdept、sloc、ccredit对码(sno,cno)的部分函数依赖,所以该关系不满足2NF。
解决办法:
将S-L-C分成三个关系模式:SC(sno,cno,grade),S-L(sno,sname,ssex,sdept,sloc),C(cno,ccredit)。
- 新关系包括三个关系模式,它们之间通过SC中的外码cno、sno相联系,需要时再进行自然联接,恢复了原来的关系。
- 新关系有效地减少了数据冗余、更新异常、插入异常和删除异常。
3.第三范式
- 定义:若R∈2NF,且每一个非主属性不传递函数依赖于码,则R ∈3NF。
- 作用:3NF消除了非主属性对码的部分和传递函数依赖。
【例】S-L-C分成三个关系模式:SC(sno,cno,grade),S-L(sno,sname,ssex,sdept,sloc),C(cno,ccredit)。
问题分析:
在关系S-L中,存在sno→sdept,sdept→sno,sdpet→sloc,即非主属性sloc传递依赖于主码sno,因此,S-L达不到3NF。
解决办法:
关系S-L分解如下 S(sno,sname,ssex,sdept),L(sdept,sloc)。
- 新关系S和L均为3NF,不存在上述的数据冗余、更新异常问题。
- 关系S和L通过属性sdept进行连接,可以恢复到原来的关系。
4.范式关系图
5.范式对查询的影响
- 对查询的利:
(1)减少数据冗余,数据更为紧凑。
(2)表的行数少,排序、索引更为迅速。
(3)表的行数少,排序、索引更为迅速。
- 对查询的弊:
使得查询数据分离在多张表中,增加了查询的复杂性,降低查询性能。
总结
以上就是浅显易懂 SQLite3 笔记(08)— 数据库三大范式的所有内容,希望大家阅读后都能有所收获!原创不易,转载请标明出处,若文章出现有误之处,欢迎读者留言指正批评!