第8章 键
这一章只会指定一个种键,候选键,主键、外键在第10章之后考虑。
键为何重要
- 确保准确识别表中每个记录
- 有助于建立并实施各种完善性
- 有助于建立表关系
为每个表建立键
注意,是键,不是每张表都一定要有主键。
键的类型有四种,候选键、主键、外键和非键。
候选键
为表创建的第一种键是候选键(candidate key),它是指可唯一识别表主题一个实例的一个或一组字段。每个表必须包含至少一个候选键。最终将检查表中的可用候选键,指定其中的一个为该表的正式主键。
候选键要求:
- 不得为复合字段
- 必须包含唯一值
- 不得包含null
- 其值不得违反机构安全或隐私规则
- 其值无论部分或整体都不是可选值
- 包含定义唯一性所需的最少字段
- 其值必须是识别表中每个记录的独特和唯一识别方式
- 其值必须是给定记录中每个字段值的唯一识别方式
- 除非特殊情况,否则不得修改其值
下面拿员工表来做例子,筛选其中的候选键:
EMPLOYEES
- Employee ID (合格)
- Social Security Number (不合格,原因3,有的外国籍员工没有社保号)
- EmpLast Name (不合格,原因8)
- EmpFirst Nmae (不合格,原因7)
- EmpStreet Address (不合格,原因8)
- EmpCity (不合格,原因8)
- EmpState (不合格,原因8)
- EmpZipcode (不合格,原因8)
- EmpHome Phone (不合格,原因8)
但是这里的组合字段 EmpFirst Name 和 EmpLast Name却是合格的,虽然我感觉还存在争议啦,毕竟同名同姓还是有可能的,书上说下面会讲解解决思路。还有这里我是为了显示直观,正常的情况下,如果一个键被选为候选键,应在其字段后添加上CK,CCK表示复合候选字段,例如:
EMPLOYEES
- Employee ID CK
- Social Security Number
- EmpLast Name CCK
- EmpFirst Nmae CCK
- EmpStreet Address
- EmpCity
- EmpState
- EmpZipcode
- EmpHome Phone
人造候选字段
当你的表比较极品的时候,即实在筛选不出来候选字段的时候,可以尝试创建和使用人造(artifical)或代理(surrogate)候选键。
创建的方法也是简单的无语,直接创建一个满足上面全部候选键要求的键,然后添加进表中,一般情况下都是选 XX ID 这样的形式。甚至在某些情况下,如果人造候选键的使用效果比筛选出来的候选键还要好,也会把人造候选键添加进表中。
主键
- 主键字段是整个数据库结构中识别其所属表的唯一方式,也有助于建立与其他表之间的关系。
- 关键值是可识别表中特定记录的唯一方式,也是整个数据库中表示该记录的专有方式。它能有效防止重复记录。
从候选键中选取主键指南:
- 当单字段候选键和复合候选键同时存在时,选择单字段候选键
- 选择名称中包含部分表名称的候选键
在选定主键后,将CK的标识改为PK,表示主键。
在整个数据库中,给定记录的每个字段值应为唯一值(除非它参与了建立两表之间的联系)且只有一种识别方式,即该记录的特定主键值。
说句人话就是主键值表示该条记录在数据库中是唯一的,即使除了主键之外其余字段的值都与别的字段重复。
前面是把主键筛选出来了,现在讲解对于数据库来说,主键的要求:
- 每个表有且仅有一个主键。
- 数据库中每个主键必须为唯一的,即任意两个表不得有相同的主键。(除非为子集表)
替换键
就是将剩下的候选键更改为替换键,标识改为AK,复合候选键改为CAK。
非键
剩下的,除了主键、替换键之外的都是非键,这个了解以下它的概念就可以了。
表层次完整性
当你严格按照上面的要求创建完主键后,那么你就可以保证表层次完整性了。
这种完整性是整体数据完整性的主要部分,它确保了以下优点。
- 表中无重复记录
- 主键为表中每个记录的唯一识别方式
- 每个主键值是唯一的
- 主键值不为null
评审初始表结构
没错,评审就是访谈,与用户与管理人员的访谈,访谈时应完成以下任务:
- 确保合适主题在数据库中被表达
- 确保表名称和表描述规范且准确易懂
- 确保字段名称规范且准确易懂
- 核实已制定到表的所有字段