数据完整性规则

2025年4月6日 | 阅读 5 分钟

在本文中,我们将详细了解数据完整性规则的概念。

引言

关系数据库完整性规则对于良好的数据库设计非常重要。数据完整性指的是数据库中数据的正确性和准确性。维护数据完整性尤为重要,因为共享多用户数据库可能包含数百万条数据记录,这些数据代表真实世界的一些有价值的信息。对于所有这些信息的拥有者来说,数据库是一项宝贵的资产。

数据完整性规则提供了一种机制,用于确保数据库中数据的正确性和准确性。这些规则限制授权用户执行导致数据一致性丢失或损坏的操作。

可能影响数据完整性的一些常见原因是无效数据输入、由于断电导致数据库部分更新等。

关系数据库提供了各种通用的完整性规则,这些规则适用于每个数据库,无论其内容或适用范围如何。它们是

  • 实体完整性规则
  • 参照完整性规则
  • 域完整性规则

需要注意的是,实体完整性规则应用于元组,而参照完整性规则应用于关系。

实体完整性规则

为了解释这一点,我们以Bank_Account关系为例。

序号账号客户姓名余额
1101Anuj20000
2NULLAnjali-5000(初始10000)
3105Rahul12000
4NULL迪帕65000
5789Anjali78000
6234迪帕65000

在上述关系中,Acc_No是Bank_Account关系的主键。一个人可以在一家银行拥有多个账户,余额不同。

现在假设我们银行有不同的客户,两个客户可能名字相同,但账号不同。

如果两个同名客户的主键Acc_No被设为null,那么就会产生问题。例如:假设客户Anjali的余额为10000卢比,另一个同名客户Anjali的余额为78000卢比。现在,如果作为此关系主键的Acc_No为null,那么这些客户进行的交易就会导致问题。

如果余额为78000卢比的Anjali想要取走15000卢比,那么交易可能会发生在余额为10000卢比的客户Anjali的余额上,因为两个客户Anjali的主键Acc_No都为Null。所以这个交易可能导致余额为(-5000)卢比。

某些未定义账户透支的部分信息并不能真实反映相关客户的信息,也无法进行正确的计算或与数据库中维护的其他关系进行链接。

现在考虑另一个例子,一个使用关系DIRECTORY表示的电话簿,该关系具有F_Name、L_Name、Address和Phone_No等属性。假设主键是F_Name、L_Name等属性的组合。

让我们考虑一个目录关系的例子

序号名字姓氏地址电话号码
1Anuj古普塔Ludhiana9856234102
2AnjaliNULL瓦拉纳西9756234182
3NULLSharma果阿9954234121
4NULLNULL加尔各答9886434112
5夏克希维尔马巴特那9876237192
6迪帕甘地恒河城9454234123

序号为2、3和4的三个元组都不能向用户表示任何有用的信息,也不能指代任何真实世界的元组出现。因为在关系中,我们无法获得这些元组的正确信息。

从上述两个例子可以清楚地看出,涉及空值的操作有时会导致不可预测的结果。因此,为了唯一标识一个元组,主键属性不能为空,这基本上就是实体完整性规则。

参照完整性规则

参照完整性规则规定,如果一个关系中存在外键,则:

  • 每个外键属性的数据值必须与它所参照的另一个关系中的主键数据值匹配。
  • 外键属性数据值必须完全为空。

假设我们有两个关系 Department 和 Employee。Department 关系包含 Dept_id、D_Name、Mgr_Id,其中 Dept_Id 作为主键,Mgr_Id 作为参照 Employee 关系中 Emp_id 属性的外键。Emp_Id、Dept_Id 和 E_Name、Address 是 Employee 关系的属性,其中 Emp_Id 作为主键,Dept_Id 作为参照 Department 关系中 Dept_id 的外键。

让我们考虑一个Department关系的例子

Dept_Id部门名称经理ID
D101设计E101
D102销售E102
D103融资E103
D104生产E104

让我们考虑一个Employee关系的例子

员工 IDDept_IdE_Name地址
E101D101DeepakLudhiana
E102D102Salman瓦拉纳西
E103D103法拉赫果阿
E104D104普罗莫德加尔各答
E105NULL乌米拉巴特那
E106D105Satish恒河城

在Employee关系中,Dept_Id的属性是一个外键,因此其值必须与Department关系中的那些Dept_Id相对应,否则某些员工的信息将包含一个未识别的部门。例如:D105不存在,因此不允许在Employee关系中输入此元组。

同样,Mgr_Id属性是一个外键,因此公司中的每个经理都拥有一个个人Emp_Id,并且Employee关系中包含经理属性的相应记录条目必须与该人员的ID匹配,否则某些部门的经理将根本没有被雇用。

我们也可以在外键属性中分配空值,如Employee关系中员工E105所示,他刚被任命,尚未被分配任何部门。

因此,参照完整性规则用于在满足参照完整性所需的所有条件时,维护两个关系元组之间的一致性。

域完整性规则

域是一组原子值。原子意味着域中的每个值都是不可分割的。此规则指定分配给每个属性的值必须是该属性域中的原子值。与域关联的数据类型包括实数和整数的数值数据类型、字符数据类型、日期数据类型、时间数据类型等。域类型的定义必须尽可能精确,以避免违反域完整性规则。

以下是域完整性规则的各种示例

  • 属性性别的域只能是M(男性)或F(女性)。
  • 政府雇员的年龄必须在18岁至60岁之间。
  • 分配给学生的最终成绩可以有A、B、C、D、E、F、G和H中的一个值。
  • 域可以是复合的。如在学生关系中,出生日期属性被限制为MM/DD/YYYY形式,其中MM(月份)被限制为1到12,DD(日期)和YYYY(年份)也类似。

域完整性规则的约束由数据库管理系统执行。然而,即使使用这些规则,某些类型的错误也无法检测到。例如:如果老师给学生分配了“G”而不是“H”等级,因为这两个键彼此相邻。域完整性规则不提供对这类错误的检查。因此,域完整性机制只能确保数据在指定的域中。