一、键码的定义
首先我们给出 键码的定义 如下
定义:已知
R<U,F>
是属性集 U 的关系模式,F是属性集 U 上的一组函数依赖,设 K 为R<U,F>
中的属性或属性组合,若K ⇒ U - K 且 K 的任何真子集都不能决定 U,则 K 为R的键码
然后大家还要记住的一个东西就是【超键码】,它是 “键码的超集” 的简称。
当一个属性集中出现多个键码的时候,就选定其中的一个作为 主键码
- 包含在任何一个键码中的属性,称为 主属性
- 不包含在任何一个键码中的属性,称为 非主属性
- 最简单的情况 —— 单个属性是键码
- 最极端的情况 —— 整个属性组合是键码,称为 全码(可不是全马哦🏃💦)
例1:考虑关系模式:人(身份证号,姓名,性别,住址,出身年月),且有函数依赖集:
F = {
身份证号 ⇒ (姓名,性别,住址,出身年月),
(姓名,住址)⇒ (身份证号,住址,出身年月)
}
- 从上面的这个关系模式我们可以看出,如果对于 公安部分 而言,它可以选身份证号作为主键码,用身份证号作为人的唯一标识;
- 对于 邮电部门 而言,它选(姓名,住址)作为主键码,用姓名和住址作为投递信件的唯一标识
- 在上面的模式中,身份证号,姓名,住址 这三个为【主属性】,性别,出身年月 为【非主属性】
下面我们再来看一个 全码 的例子
例2:考虑关系模式R(演奏者,作品,听众)
- 为什么说这个关系模式为全码呢,因为三个属性都可以作为键码,试想
- 一个演奏者可以演奏多个作品;
- 一个作品也可以被多个演奏者所演奏
- 观众也可以欣赏不同演奏者的不同作品
- 那么这三个属性就都得被定义成为键码了,即 全码
二、闭包的计算
有了【键码】的一些知识后,我们就可以来学习一下 闭包 这个东西了
首先我们来讲讲闭包的基本概念:
假设 A = {A1, A2, A3,…, An}是属性集,F是函数依赖集。属性集A在函数依赖集F下的闭包是这样的属性集X,那么A1A2An ⇒ X是蕴含于F中的函数依赖。此时我们就可以用{A1, A2, An}+ 来表示属性集A1A2…An的闭包
然后我们来看闭包的计算规则:
- 属性集X终将成为闭包。首先,将X初始化为{A1, A2, …, An}
- 然后,反复检查某个函数依赖
B1B2...Bm
⇒ C,使得所有B1B2...Bm
都在属性集X中,但是C不在其中,于是将C加到属性集X中l - 根据需要多次重复步骤2,直到没有属性能加到X中。由于X是只增的,而任何关系的属性数目必然是有限的,因此最终再也没有属性可以加到X中
- 最后得到的不能再增加的属性集X就是{A1, A2, …, An}+ 的正确值
看完了闭包的计算规则,我们马上来实战演练一下吧🗡
例3:让我们来考虑一个关系R(A, B, C, D, E, F),其函数依赖集为F = {AB ⇒ C,BC ⇒ AD,D ⇒ E,CF ⇒ B},试计算 {A, B} 的闭包{A, B}+
例4:已知关系模式R(A, B, C, D),其函数依赖集为F = {AB ⇒ C,C ⇒ D,D ⇒ A},求蕴含于给定函数依赖的所有非平凡函数依赖和键码
例5:若R(A, B, C, D, E),其函数依赖集为F = {AB ⇒ C, B ⇒ D, D ⇒ E, C ⇒ B},试求关系模式R的键码
💬 那么通过这三道例题的讲解相信读者一定了解了闭包是如何地去进行计算的
三、总结与提炼
最后我们来总结一下本文所学习的内容📖
- 首先的话我们学习了 键码的定义,了解到了键码是什么东西。在有这个的基础上,我们又学习了 闭包的计算,清楚计算规则之后,再通过三道例题的详细讲解相信读者一定对这个知识点有了一定的认识