一些关系数据模型的常见概念->数据库概论-CSDN博客
目录
1、关系数据结构
1.1 笛卡尔积
1.2 关系的定义
1.3 关系的性质
2、关系代数
2.1 传统的集合运算
1. 并(union)
2. 交(intersection)
3. 差(difference)
4. 广义笛卡尔积(extended cartesian product)
2.2 专门的关系运算
1. 选择(Selection, σ)
2. 投影(Projection, π)
3. 连接(Join, ⋈)
1. θ连接
2. 等值连接
3. 自然连接(Natural Join)
4. 外连接
4. 除(Division, ÷)
3、优化查询
4、函数依赖
4.1 问题的提出
4.2 函数依赖的定义
1. 函数依赖的定义
2. 完全函数依赖和部分函数依赖
3. 传递函数依赖
4. Armstrong公理
5、关系的规范化
5.1 范式(normal form NF)
5.2 第一范式(1NF)
5.3 第二范式(2NF)
5.4 第三范式(3NF)
5.5 BC范式(BCNF)
5.6 模式分解
1、关系数据结构
1.1 笛卡尔积
- 给定一组域D1, D2, …, Dn(这些域中可以有相同的域),这些域的笛卡尔积表示为:D1×D2×…×Dn = {(d1, d2, …, dn) | di ∈ Di, i = 1, 2, …, n}。
- 其中,每一个元素(d1, d2, …, dn)叫作一个n元组,简称元组。元组中的每一个值di叫作一个分量。
- 笛卡尔积可表示为一个二维表,表中的每行对应一个元组,表中的每列对应一个域。
1.2 关系的定义
1.关系是从笛卡尔积中取出有实际意义的元组来构造的。关系是笛卡尔积的子集。
2.关系中的每个元素是关系中的元组,通常用 t 表示。关系是元组的集合。
3. n个属性称为关系的n目(度),n元关系,其元组为n元组。
1.3 关系的性质
1. 每一列的值是同类型的数据,来自同一个域。
2. 不同的列 可以来自同一个域,需要给不同的属性名。
3. 元组不能重复。
4. 元组中的每一个分量都是不可再分的数据项,即不允许表中有表。
5. 行,列的顺序无所谓。
2、关系代数
2.1 传统的集合运算
对行进行处理
1. 并(union)
设关系R和S,都有n个属性,且对应的属性取自同一个域,
R∪S={t∣t∈R 或 t∈S},
结果关系为n目,会消除重复元组。
2. 交(intersection)
设关系R和S,都有n个属性,且对应的属性取自同一个域,
R∩S={t∣t∈R 且 t∈S},
结果关系为n目。
3. 差(difference)
设关系R和S,都有n个属性,且对应的属性取自同一个域,
R−S={t∣t∈R 且 t∈/S},
结果关系为n目。
4. 广义笛卡尔积(extended cartesian product)
设关系R为n目,S为m目
R×S={(r,s)∣r∈R 且 s∈S},
结果关系为(n+m)目,
R×S前n个属性值是R的一个元组,后m个属性值是S的一个元组,
若R有a个元组,S有b个元组,R×S有a×b个元组。
2.2 专门的关系运算
对行和列进行处理
1. 选择(Selection, σ)
功能:从关系中选出满足特定条件的元组(即行)。
符号:通常表示为 σF(R),其中 F 是选择条件,R 是关系。
如:一个学生表 Students(ID, Name, Age, Major),
选择所有主修为计算机科学的学生,
σMajor='Computer Science'(Students)。用的是单引号。
2. 投影(Projection, π)
功能:从关系中选出指定的属性(即列),并返回这些属性构成的新关系。
符号:通常表示为 πA(R),其中 A 是属性集合,R 是关系。
如:一个学生表 Students(ID, Name, Age, Major),
投影出学生的名字和专业,
πName, Major(Students)。
注意:会去重复元组,因为是关系。
3. 连接(Join, ⋈)
1. θ连接
R⋈S
I θ J I,J分别是关系R,S的属性组, θ是算数比较运算符(><=等)
相当于,笛卡尔积+条件I θ J
2. 等值连接
当 θ 为 “=” 时,为等值连接。
3. 自然连接(Natural Join)
R⋈S
根据来自相同的属性(组)的相等的属性值(集)进行连接,并在结果中去除重复的属性。
如:
⋈
=
都来自CourseID,相等的属性值进行连接,删除了重复的CourseID属性。
4. 外连接
OUTER可省略
左外连接(Left Outer Join),以左表为主(),右表不满足补NULL
返回左表中的所有记录,以及右表中与左表匹配的记录。如果右表中没有与左表匹配的记录,则结果集中对应部分为NULL。
右外连接(Right Outer Join),以右表为主(),左表不满足补NULL
返回右表中的所有记录,以及左表中与右表匹配的记录。如果左表中没有与右表匹配的记录,则结果集中对应部分为NULL。
全外连接(Full Outer Join),左,右表不满足时,各自对应位置补NULL。
4. 除(Division, ÷)
R ÷ S,其中 R 和 S 是关系
用于找出在关系R中包含全部S信息(即S的投影)的那些元组,但只保留R中去掉S属性后的那些列。(相当于约掉了)
如:
假设我们有两个关系:
- 学生选课关系R(Sno, Cno, Grade)
- 课程关系S(Cno, Cname)
现在,我们想要找出选修了S中所有课程的学生的Sno。
πSno,Cno(R)÷πCno(S)
3、优化查询
1. 选择尽量先执行
2. 把笛卡尔积和其后的操作 合并成 连接
3. 将一连串的选择和投影 合并
4、函数依赖
4.1 问题的提出
说了那么多,那对于一个具体问题,应该建几个关系?每个关系由哪些属性组成?
如:student(sno,specialty(专业),group(社团),leader(社长),group_addr(社团地址),date(入团时间)),
一个学号对应一个学生,一个学生对应一个学号。
一个专业有多个学生,而一个学生只属于一个专业。
一个学生可以报多个社团,一个社团有多名学生。
一个社团只有一个社长,一个社团只有一个地址。
学生+社团确定入团时间。
sno->specialty(学号确定专业,专业依赖于学号),group->leader,group->group_addr,(sno,group)->date
所以,sno+group,是主码
1. 插入异常
主码不能为空,当一个group成立时,没有学生,导入不了group,leader,group_addr。
2. 删除异常
若一个group的学生都毕业了,删除了所有元组,那么group,group_addr,leader信息丢失了。
3. 数据冗余
一个group有多少个学生,learder,group_addr,就重复几次。
4. 跟新异常
group_addr改变,所有的元组都要改变。
4.2 函数依赖的定义
1. 函数依赖的定义
对于X的每一个值,都有Y唯一的具体的值与之对应,称X决定Y,或者Y依赖X,记作X→Y。
2. 完全函数依赖和部分函数依赖
X->Y,X1是X的真子集,若存在X1->Y,则Y对X部分函数依赖,若不存在,则完全函数依赖。
注意:若X->U,U完全函数依赖X,则 X是候选码,有多个时,选一个为主码。
3. 传递函数依赖
若 X->Y,Y->Z,则 X->Z。
4. Armstrong公理
自反律:若 Y包含于X,则 X->Y。如:XY->X,XY->Y,XY->XY
增广律:若 X->Y,则 XZ->YZ。
传递律:若 X->Y,Y->Z,则 X->Z。
合并规则:若 X->Y1,X->Y2,则 X->Y1Y2。
分解规则:若 X->W,Z包含于W,则 X->Z。
例:关系模式R(A,B,C,D,E,F),R满足下列函数依赖:F={A → BC,CD → EF},
证明:函数依赖AD → F成立。
A->C(分解),AD->CD(增广),CD->F(分解),AD->F(传递)
5、关系的规范化
5.1 范式(normal form NF)
满足特定要求的集合。一共有六个级别,级别越高,表越规范。
5NF ⊆ 4NF ⊆ BCNF ⊆ 3NF ⊆ 2NF ⊆ 1NF。
5.2 第一范式(1NF)
关系R的所有属性不能再分,则 R 属于第一范式,不允许表中有表,关系至少是第一范式。
5.3 第二范式(2NF)
关系R是第一范式,且每个非主属性完全函数依赖于R的某个候选码,则 R 属于第二范式。
非主属性不依赖于候选码的真子集。
例:SG(sno,specialty(专业),group(社团),group_addr(社团地址),date(入团时间))
F = {sno->specialty,group->group_addr,(sno,group)->date}
只有一个候选码:sno,group,有非主属性group_addr依赖于group(候选码的真子集),
所以不是第二范式。
改:(sno,specialty),(group,group_addr),(sno,group,date)
5.4 第三范式(3NF)
关系R是第二范式,且R中的每个非主属性都不传递依赖于R的某个候选码。
例:SS(sno,sdpet(系),sdpet_leader(系主任))
F = {sno->sdpet,sno->sdpet,sdpet->spdet_leader}
只有一个候选码:sno,因为sno->sdpet,sdpet->spdet_leader,spdet_leader传递依赖于sno,所以不是第三范式。
改:(sno,sdept),(sdept,sdept_leader)
5.5 BC范式(BCNF)
关系R是第三范式,且R中的每一个决定因素包含码,则 R 属于BC范式。
每个决定因素是候选码。
例1:SJP(S,J,P),F = {(S,J)->P,(S,P)->J},
决定因素(S,J),(S,P),都是候选码。所以是BC范式。
例2:SJP(S,J,P),F = {(S,J)->P,(S,P)->J,P->J},
决定因素P,不是候选码,所以不是BC范式。
改:P和J放在一个表中,(P,J),(S,P)或(P,J),(S,J)
5.6 模式分解
低范式->高范式。
1. 无损。通过自然连接能恢复。
2. 分解后相互独立。
3. 分解要点。写出对应关系,找出候选码,分清非主属性,判断函数依赖。
例:患者(患者编号(1),患者姓名(2),患者性别(3),医生编号(4),医生姓名(5),诊断日期(6),诊断结果(7),恢复情况(8),科室编号(9),科室名称(10))。判断第几范式,并改成第三范式。
1->(2,3),4->(5,9),(1,4)->(6,7,8),9->10
显然,(1,3)是码,2非主属性依赖于1(候选码的真子集),所以不是第二范式,是第一范式。
改成第三范式:
(1,2,3),(4,5,9),(1,4,6,7,9),(9,10)