关系型数据库的约束类型

目录

前言

我们不应该只把数据库系统看作是保存数据的黑盒子,而要将其看成验证和防止数据腐化的工具

约束

非空约束

如果业务规则要求该属性应该始终存在,那么要毫不犹豫地将其设置为 Not Null。

适合设置为 Not Null 的字段有 Id、Name、AddedDate、IsActive、State、CategoryId(如果所有项都应该有一个类别)、ItemCount、Price 以及许多其他字段。通常,这些属性在业务逻辑中扮演重要角色。

但是要注意,不要对可以为空的属性使用 Not Null 约束。

唯一约束

根据业务规则,一些属性(或属性的组合)应该是惟一的,比如 Id、PinNumber、BookId 和 AuthorId、OrderNo 等。应该通过添加惟一约束来保证这些属性的惟一。

注意:也可以使用唯一索引来实现同样的效果,但是添加约束是更好的方法。因为当添加惟一约束时,会自动创建非惟一索引。因此,如果出于某种原因,你必须临时禁用/启用约束,将会非常容易。在使用唯一索引的情况下,你必须删除/重新创建索引,从性能和时间方面来说,这是一个昂贵的操作。

主键约束

Not Null 和唯一约束一起构成主键。

当我们想到主键时,会很快想到 Id 或 ObjectId 之类的列。但是主键也可以是复合的,比如 BookId 和 AuthorId。这里有个难题是,是使用单独的 Id 列作为主键,还是将两者的组合作为主键?

通常,使用单独的 Id 列是一种更好的方法,因为它可以使连接更加清晰,还能方便地将另一列添加到惟一组合中。但是,即使有了一个单独的主键(Id),我们还是要为 BookId 和 AuthorId 列添加唯一约束。

外键约束

外键与主键一起确保表之间的数据一致性。

使用外键约束时要注意区分 On Delete 和 On Update 规则,根据数据库的不同,两者均有 NoAction、Restrict、SetNull、SetDefault 和 Cascade 选项。在大多数情况下,Restrict 与 NoAction 是相同的,但是对于某些数据库,它们有细微的区别。

  • 通常,对于键引用查找或不引用实体的实体,我们选择 NoAction。
  • 另一方面,当子记录不能在没有父记录的情况下存在时,选择 Cascade。
  • SetNull 很少使用。例如,Employee.ManagerId 和 Employee.Id 之间的外键可以是 SetNull。当一名经理被撤职,他的下属就没经理了。显然,只有当列可为空时才能选择该项规则。
  • SetDefault 最罕见。当父记录被删除时,它将列设置为其默认值。因为外键引用主键,我们很难想象一个有外键的字段将默认值硬编码。

Check 约束

Check 约束允许我们定义数据的有效值/范围。适合 Check 约束的属性有百分比(0 到 100 之间)、状态(0、1、2)、价格、金额、总数(大于或等于 0)、PinNumber(固定长度)等。

默认约束

默认约束允许我们向现有表中添加新的 Not Null 列,并使 “旧” API 与新结构兼容,直到所有各方都完成升级(尽管在完全升级后,默认约束应该删除)。

索引约束

索引是良好数据库设计的重要组成部分,但它们几乎不能保护我们的数据(惟一索引除外)。

需要注意的一点是:一些 RDBMS 系统(例如 Oracle)会在创建外键时自动创建索引,而无需我们操心。其他数据库(例如 MS SQL Server)不会这样做,我们必须自己添加索引。

参考文档

https://mp.weixin.qq.com/s/tdi23o_9GWkCdVaYYq1Grw

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付 49.00元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值