您可能已经知道,数据库使用表来组织信息。(如果您不熟悉数据库的基本概念,请阅读什么是数据库?)每个表由许多行组成,每一行对应一条数据库记录。那么,数据库如何保持所有这些记录的正确性呢?这是通过使用钥匙。
主键
我们要讨论的第一类键是主键。每个数据库表都应该有一个或多个列指定为主键。对于数据库中的每条记录,该键所持有的值应该是唯一的。
例如,假设我们有一个名为Employees的表,其中包含公司中每个员工的人事信息。我们需要选择一个适当的主键来唯一地标识每个员工。你的第一个想法可能是说出员工的名字。这不会很有效,因为你可能会雇佣两个同名的员工。更好的选择可能是使用唯一的员工ID号,在每个员工被雇佣时分配给他们。一些组织选择使用社会安全号码(或类似的政府标识符)来完成这项任务,因为每个员工都有一个,并且保证它们是唯一的。然而,出于隐私考虑,使用社会安全号码来实现这一目的是非常有争议的。(如果你为政府机构工作,根据1974年的《隐私法》,使用社会安全号码可能是不合法的。)出于这个原因,大多数组织已经转向使用唯一标识符(员工ID、学生ID等),这些标识符不涉及这些隐私问题。
在主键决定并设置数据库后,数据库管理系统将强制强制键的唯一性。如果您尝试将记录插入表中,其中包含重复现有记录的主键,插入将失败。
大多数数据库也能够生成它们自己的主键。例如,可以将Microsoft Access配置为使用AutoNumber数据类型为表中的每条记录分配唯一ID。虽然这很有效,但这是一种糟糕的设计实践,因为它给表中的每条记录留下了没有意义的值。为什么不用这个空间来存放有用的东西呢?
外键
另一种类型是外钥匙,用于创建表之间的关系。在大多数数据库结构中,表之间存在自然的关系。回到Employees数据库,假设我们希望向数据库添加一个包含部门信息的表。这个新表可以称为Departments,它将包含关于整个部门的大量信息。我们还希望包含有关部门中员工的信息,但是在两个表(employees和Departments)中包含相同的信息是多余的。相反,我们可以在两个表之间创建一个关系。
让我们假设Departments表使用Department Name列作为主键。为了在两个表之间创建关系,我们向Employees表添加一个名为Department的新列。然后,我们填写每个员工所属部门的名称。我们亦会通知数据库管理系统员工表中的部门列是引用部门表的外键。然后数据库将执行参照完整性通过确保Employees表的Departments列中的所有值在Departments表中都有相应的条目。
请注意,没有唯一性限制外键。我们可能(而且很可能)有多个员工属于一个部门。类似地,也不要求Departments表中的条目在Employees表中有任何对应的条目。我们可能会有一个没有员工的部门。