知识卡片

候选键的精确定义:唯一性与不可约性

普通读书笔记卡

内容

候选键的严格定义包含两条同时成立的性质:唯一性(K的取值能唯一区分关系变量R 的每个元组,不存在R的合法值让两个不同的元组在K上取值相同)和不可约性(K的 任何真子集都不再具有唯一性)。第二条性质常被忽视但至关重要:书中用具体反例 说明,属性集合{SNO,CITY}对供应商关系变量S确实具有唯一性,但它并不是不可约的, 因为去掉CITY后剩下的{SNO}本身仍具有唯一性——所以{SNO,CITY}不是候选键,它 “太大了”。坚持不可约性的实际理由是:如果对DBMS谎报一个可约的键(比如告诉系统 {SNO,CITY}是键),DBMS就无法强制真正需要的约束(供应商编号全局唯一),只能 执行被削弱的”局部唯一”(同城市内供应商编号唯一),这不是我们想要的语义。候选键 概念严格来说只属于关系变量,不属于关系值本身——因为”某个属性组合是键”这句话 本质是在陈述一条完整性约束(唯一性约束)在生效,而完整性约束限制的是更新, 更新的对象是变量而不是值,所以候选键这个概念天然依附在关系变量上(这与 [[关系值与关系变量的区分及DELETE的本质]]中值/变量的区分一脉相承)。另外要 注意,键值本身是一个元组(SQL里是一行),不是标量——即使候选键只包含单一 属性(如{SNO}),供应商S1的键值严格说是TUPLE{SNO 'S1'}而不是裸值’S1’, 判断两个键值是否相等,本质上仍要依赖[[元组相等性的精确定义及其重要性]], 即便这个元组的度恰好是1、看起来像个简单标量也不例外。任意关系变量R都至少 有一个候选键,因为R的整个标题必然满足唯一性(关系永不包含重复元组),要么 整个标题本身就是不可约的,要么其某个真子集是。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第5章"基关系变量和 基表"5.3节"关于候选键的更多内容"(源文件:OEBPS/text00054.html) - 结论依据:原文明确"K为R的候选键……当且仅当它同时具有以下性质:1.唯一性…… 2.不可约性,不存在K的某个子集也具有唯一性……SC并不具有不可约性……我们不会 将SC作为一个键,它'太大了'……键的概念是用于关系变量而不是关系……因为,说 某个东西是键也就是说某个完整性约束……生效了;而完整性约束是用于变量的, 不是用于值的""键值是元组(SQL中的行),而不是标量"。 - 原始内容:K为R的候选键(候选键,简称键)当且仅当它同时具有以下性质:1.唯一 性……2.不可约性……键的概念是用于关系变量而不是关系……键值是元组,而不是 标量。