跳转到内容

关系数据库设计/约束

来自维基教科书,开放的书籍,开放的世界

约束是除了域之外,进一步限制数据的方式。约束也用于强制参照完整性,这可以防止逻辑上不完整的数据驻留在数据库中。

主键是唯一标识表中特定行的列。例如,实体可能有一列用于SSN(社会安全号码)。如果在您的数据模型中每个人都有唯一的 SSN,那么它可能是主键的候选。(主键可以由两列或多列组成,但这在这里不讨论。)

主键也是外键工作的方式。因此,SSN 可能实际上不是一个好的主键选择。在实践中,行通常有一个唯一的数字标识符(通常称为标识序列值),它唯一标识特定行。这些类型的值通常用作主键。

需要注意的是,RDBMS 通常使用表的 主键的列(或列)自动创建该表上的结构化索引。结构化索引是在物理上对数据进行重新排序以匹配索引的索引。这样做是为了提高查询性能,但如果使用错误的列作为主键,实际上会降低性能。

在关系理论术语中,主键是选定的候选键,它是最小的属性集,其在每行(元组)中的实例组合始终是唯一的,并且标识行(元组)。候选键是最小的超键,超键是任何属性集(列),它们将标识行,而最大的超键是表的整个列集(关系的属性)。

外键是进一步限制列的允许值,使其仅包含另一个表中存在的数据的一种方式。例如,如果您必须在您的系统中处理订单,您可以创建一个名为OrderInfo的表来存储订单信息。订单必须与客户相关联,因此您可以在OrderInfo表中有一个名为CustomerID的列,它以某种方式连接到Customer表中的相关行。

最有可能的是,您不想能够为不存在的客户创建订单,也不想删除与任何订单相关的客户。这样做会导致数据参照完整性失效。外键关系确保执行这两个规则。

通过在OrderInfoCustomerID列和Customer表的主键之间创建外键关系,RDBMS 将确保CustomerID始终引用Customer表中的一行,并阻止您删除该关联的行,因为OrderInfo中的一行或多行依赖于它。

通常,具有外键约束的表通过该表的主键属性引用另一个表。例如,在多对一关系中,例如 Orders 是多个,Customer 是一个,每个 Customer 行都有多个 Order 行,因此外键驻留在 Order 表中。习惯上,外键字段名称与所引用表的字段名称相同,因此最好以冗余命名方式命名每个表上的主键,例如 "TABLENAME_ID",例如 Customer_ID。

其他约束

[编辑 | 编辑源代码]

可以争辩说,最重要的约束是外键和主键约束,因为规范化过程(见下文)将大多数数据完整性检查推向了主键和连接(使用一个表中的外键和另一个表中的主键检索行)。

一些 DBMS 提供逻辑 CHECK 约束,其中 CHECK 的主体涉及对一个或多个字段的某种条件。

NOT NULL 和 UNIQUE 是应用于数据声明语句 CREATE TABLE ( f1 type1 PRIMARY KEY, f2 type2 UNIQUE , ... CHECK (..) ) 中的单个字段的约束。

华夏公益教科书