电子商务数据库技术(第3版)
上QQ阅读APP看书,第一时间看更新

3.1.2 函数依赖和多值依赖

1.函数依赖

函数依赖反映了数据之间的内部联系,它是进行关系分解时的指导和依据,也是本章的讨论中心。

为了方便起见,我们假设R(A1,A2,A3,……,An)是一个关系模型,U={A1,A2,A3,……,An{是R的所有属性集合,X、Y和Z分别表示R中的属性子集。

【定义1】若对于R中的X的任何一个具体值,Y仅有唯一的具体值与之对应,则称R的属性Y函数依赖于属性X,记作X→Y, X称为决定因素。

如果X→Y,且Y不是X的子集,则称X→Y是非平凡的函数依赖。我们讨论的都是非平凡的函数依赖。

例如,在学生(学号,姓名,性别,系号,系负责人,课程名,成绩)这一关系中,{学号{→{姓名{,{系号{→{系负责人{,{学号,课程名{→{成绩{。

【定义2】在R中,如果属性集Y函数依赖于属性集X,且不与X的任何真子集函数依赖,则称Y完全函数依赖于X,记】否则Y部分函数依赖于X,记上例所述的学生关系中,属性“成绩”完全函数依赖于属性集{学号,课程名{,而属性“姓名”则部分函数依赖于属性集{学号,课程名{。

【定义3】在R中,对于属性子集X、Y、Z,若

则称Z对X传递函

数依赖,记设有一个“配件-供应商-库存”关系如下:

配件-供应商-库存(配件编号,配件名称,规格,供应商名称,供应商地址,价格,库存量,库存占用资金)

在该关系中,{配件编号,供应商名称{是关系的主关键字。因为配件编号能唯一确定一种配件的名称及其规格,所以属性“配件名称”“规格”部分函数依赖于主关键字{配件编号,供应商名称{;由于一种配件可以由多家供应商供货,而不同的供应商所提供的价格是不一样的,所以只有知道了配件编号和供应商名称才能确定配件价格,因此,“价格”完全函数依赖于主关键字{配件编号,供应商名称{。同样,“库存量”完全函数依赖于主关键字{配件编号,供应商名称{。

另外,“库存占用资金”等于“价格”与“库存量”的乘积,所以“库存占用资金”函数依赖于价格和库存量,这样“库存占用资金”则传递函数依赖于{配件编号,供应商名称{这个主关键字。

2.关键字

前面已经介绍过“关键字”的概念,介绍了函数依赖的概念后,我们就可以给“关键字”进行精确的定义。

(1)候选关键字(候选码)。

【定义4】在R中,设K是U的属性或属性集合。如则称K是关系R的一个候选关键字。若R中有一个以上的关键字,则选定其中一个作为主关键字(主码),如果K是属性集合,则称为组合关键字或合成关键字。主关键字可用下划线标出。

包含在任意一个候选关键字中的属性,称为主属性。不包含在任何候选关键字中的属性,称为非主属性。

在极端情况下,若关系的全部属性作为关键字,则称为完全关键字。此时关系中没有非主属性。

候选关键字具有标识的唯一性和无冗余性两个性质。

①标识的唯一性:对于R中的每一元组,K的值确定后,该元组就确定了。

②无冗余性:当K是属性集合时,K的任何一个部分都不能标识该元组。

(2)外关键字(外码)。

【定义5】在关系R中,若属性或属性集合X不是R的关键字,但X是其他关系中的关键字,则称X是关系R的外关键字或外码。

主关键字和外关键字提供了表示关系之间联系的手段。

设有“职工”关系如下:

职工(职工号,职工姓名,年龄,部门编号)

设有“部门”关系如下:

部门(部门编号,部门名称,部门负责人)

在“职工”关系中,“部门编号”不是它的关键字,但“部门编号”是“部门”关系的主关键字,所以,“部门编号”是“职工”关系的外关键字。

3.多值依赖

属性之间的关系中除了函数依赖,还有多值依赖。与函数依赖相比,多值依赖不太直观,较难理解。关系模式中如果存在多值依赖,则和函数依赖一样也会造成数据冗余,导致数据操作异常。

【定义6】在关系R中,X、Y、Z是属性子集,且Z=U-X-Y,则多值依赖X→→Y成立当且仅当对R中给定的一对(X, Z)值有一组Y的值与之对应,这组值仅仅决定于X值而与Z值无关。

例如,某单位的供应部门直接将各工程所需要的物资从供应商的仓库发往工程所在地,为了规划运输方案,我们可以定义以下的关系来存储所有零件的可能的运输源和目的地。

运输(工程名称,工程地址,物资名,供应商名,供应商地址)

这个关系模式的关键字为{物资名,工程名称,供应商名{,其中除了有函数依赖关系{工程名称{→{工程地址{,{供应商名{→{供应商地址{,还有多值依赖{物资名{→→{工程名称,工程地址{,{物资名{→→{供应商名,供应商地址{。因为这一关系中,一种物资可以被多个工程使用,与该物资由谁提供无关;同样,一种物资可以由多个供应商提供,与哪些工程使用该物资无关。可以看出,由于多值依赖的存在,这个关系有冗余。

另外,很明显,关系模式中至少有3个属性才有可能存在多值依赖。函数依赖可以看成是多值依赖的一种特殊情况,即函数依赖一定是多值依赖;而多值依赖是函数依赖的概括,即存在多值依赖的关系时,不一定存在函数依赖关系。