《自己动手设计数据库》第8章 键

第8章 键

这一章只会指定一个种键,候选键主键、外键在第10章之后考虑。

键为何重要

  • 确保准确识别表中每个记录
  • 有助于建立并实施各种完善性
  • 有助于建立表关系

为每个表建立键

注意,是,不是每张表都一定要有主键

的类型有四种,候选键、主键、外键和非键

候选键

为表创建的第一种键是候选键(candidate key),它是指可唯一识别表主题一个实例的一个或一组字段。每个表必须包含至少一个候选键。最终将检查表中的可用候选键,指定其中的一个为该表的正式主键。

候选键要求:

  1. 不得为复合字段
  2. 必须包含唯一值
  3. 不得包含null
  4. 其值不得违反机构安全或隐私规则
  5. 其值无论部分或整体都不是可选值
  6. 包含定义唯一性所需的最少字段
  7. 其值必须是识别表中每个记录的独特和唯一识别方式
  8. 其值必须是给定记录中每个字段值的唯一识别方式
  9. 除非特殊情况,否则不得修改其值

下面拿员工表来做例子,筛选其中的候选键

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却是合格的,虽然我感觉还存在争议啦,毕竟同名同姓还是有可能的,书上说下面会讲解解决思路。还有这里我是为了显示直观,正常的情况下,如果一个键被选为候选键,应在其字段后添加上CKCCK表示复合候选字段,例如:

EMPLOYEES

  • Employee ID                           CK
  • Social Security Number
  • EmpLast Name                       CCK
  • EmpFirst Nmae                       CCK
  • EmpStreet Address
  • EmpCity
  • EmpState
  • EmpZipcode
  • EmpHome Phone
人造候选字段

当你的表比较极品的时候,即实在筛选不出来候选字段的时候,可以尝试创建和使用人造(artifical)或代理(surrogate)候选键。

创建的方法也是简单的无语,直接创建一个满足上面全部候选键要求的键,然后添加进表中,一般情况下都是选 XX ID 这样的形式。甚至在某些情况下,如果人造候选键的使用效果比筛选出来的候选键还要好,也会把人造候选键添加进表中。


主键
  • 主键字段是整个数据库结构中识别其所属表的唯一方式,也有助于建立与其他表之间的关系。
  • 关键值是可识别表中特定记录的唯一方式,也是整个数据库中表示该记录的专有方式。它能有效防止重复记录。

候选键中选取主键指南:

  1. 当单字段候选键和复合候选键同时存在时,选择单字段候选键
  2. 选择名称中包含部分表名称的候选键

在选定主键后,将CK的标识改为PK,表示主键。

在整个数据库中,给定记录的每个字段值应为唯一值(除非它参与了建立两表之间的联系)且只有一种识别方式,即该记录的特定主键值。

说句人话就是主键值表示该条记录在数据库中是唯一的,即使除了主键之外其余字段的值都与别的字段重复。

前面是把主键筛选出来了,现在讲解对于数据库来说,主键的要求:

  • 每个表有且仅有一个主键。
  • 数据库中每个主键必须为唯一的,即任意两个表不得有相同的主键。(除非为子集表)
替换键

就是将剩下的候选键更改为替换键,标识改为AK,复合候选键改为CAK

非键

剩下的,除了主键、替换键之外的都是非键,这个了解以下它的概念就可以了。


表层次完整性

当你严格按照上面的要求创建完主键后,那么你就可以保证表层次完整性了。

这种完整性是整体数据完整性的主要部分,它确保了以下优点。

  • 表中无重复记录
  • 主键为表中每个记录的唯一识别方式
  • 每个主键值是唯一的
  • 主键值不为null

评审初始表结构

没错,评审就是访谈,与用户与管理人员的访谈,访谈时应完成以下任务:

  • 确保合适主题在数据库中被表达
  • 确保表名称和表描述规范且准确易懂
  • 确保字段名称规范且准确易懂
  • 核实已制定到表的所有字段
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值