最近回顾了下数据库的相关知识,正好借着这个机会,把其中一些概念重新理一理,也加深一些印象。
首先我们来看看数据库中的基本概念:
超键(super-key):在一个关系中能唯一地标志一个元组。
候选键(candidate):最小的超键,其任意真自己都不能成为一个超码。例如,(身份证号,姓名)和(身份证号)都可以试超键,但(身份证号)是候选码。
主键(primary key):用户选作元组标识的一个候选键程序主键。主键通常由用户从候选码中选择出来的。
外键(foreign key):假设存在两组关系,r和s,其中r(A, B, C), s(B, D),在关系r上的属性B称作参照s的外键,r也成为外码依赖的参照关系,s叫做外码被参照关系。参照关系中外键的值必须在参照关系中存在或者null
主属性:包括在候选键中的属性。
熟悉了这些概念之后我们来看看范式。
范式(Normal Form)
目前常见的范式包括第一范式(1NF),第二范式(2NF),第三范式(3NF),Boyce-Codd(BCNF)和第四范式(4NF)。
第一范式:关系模式中的所有熟悉的域都是原子的。
如果某个域中元素被认为是不可分的,则成这个域为原子的。如姓名,可以拆分为姓和名,因此,这里的姓名是非原子的。1NF的缺点是存在数据的冗余以及当插入更新删除是容易出现异常。
第二范式:在满足第一范式的关系模式中,每一个非主属性完全函数依赖于任何一个候选键,则R属于第二范式。
满足第一范式的关系模式可以通过模式分解,生产满足第二范式的多个关系模式。
模式分解需要满足一下两个条件
无损分解:
在分解之后,n个分解关系通过自然连接(自然连接是在等值连接的基础上去掉相同的列,如果自然连接中找不到等值信息那么自然连接就等价于笛卡尔积)形成的二维表和没分解之前关系的二维表是等价的(元组没有增加也没有减少),则称这种分解形成的关系模式保持无损连接性;
R1∩R2→(R1-R2)或R1∩R2→(R2-R1)
保持函数依赖(functional dependency):
函数依赖借助了数学上的函数概念 α→β,即在属性集α上的值相同时,其在属性集β上的值也相同,我们称β函数依赖与α,α函数决定β。
若分解之后的关系模式中仍然存在和没分解之前属性的函数依赖关系则称保持分解的函数依赖性。
(F1∪F2)+=F+
这里面的F+称作F的闭包,即当给定函数依赖集F,存在其他函数依赖被F逻辑蕴含,例如如果A→B,且B→C则可推出A→C。这里了可以利用Armstrong公理找出F+。
Armstrong公理:
自反律:若β⊆α,则α→β;
增补律:若α→β,则γα→γβ;
传递律:若α→β且β→γ,则α→γ。
平凡依赖 (trivial functional dependency):被所有关系实例都满足的函数依赖成为平凡依赖。一般来说,若β⊆α,则α→β是平凡的,相反,则α→β是不平凡的。
部分依赖:已知α→β,存在α中的真子集可以函数决定β。例如α为(学号,身份证号),β为(姓名)α中的真子集(学号或者身份证号)可以决定β。
完全依赖:已知α→β,不存在α中的真子集可以函数决定β。例如α为(学号,学校名),β为(姓名)α中的真子集(单独的学号或者学校名)不能决定β。
传递依赖:若α→β且β→γ,则α→γ。例如α为学号,β为学院,γ为院长。
第三范式:关系模式R中,所有函数依赖α→β满足以下条件之一:
* α→β是平凡依赖
* α是R的超键
* β-α中的每个属性A都包含于R的一个候选码中。
这里主要说一下第三条。
因此,第三范式换句话说,在满足第三范式的关系模式中,非主属性必须直接完全函数依赖于主键,中间不能有其他函数,即不能是传递函数依赖。
第二、三范式消除的是非主属性对键的部分依赖和传递依赖。
BC范式:关系模式R中,所有函数依赖α→β满足以下条件之一:
* α→β是平凡依赖
* α是R的超键
第三范式和BC范式的区别在于第三范式允许主属性传递依赖于键码而BC范式不允许任何属性传递依赖于主键,包括主属性。因此,两个属性的肯定是满足BC范式的。
例如:R=(J,K,L),F={JK→L,L→K}。这个情况下满足第三范式,但不满足BC范式。这里的候选键可以是JK和JL。
因此相比于BC范式,第三范式存在冗余。
第四范式:
设R是一个关系模型,D是R上的多值依赖集合。如果D中存在多值依赖,α→→β,满足一下条件之一则属于第四范式:
α→→β是评分的;
α为R的超键。