数据完整性和数据一致性有什么区别吗?

32

我对数据一致性数据完整性有些困惑。引自Oracle数据库概念

data integrity
--------------
Business rules that dictate the standards for acceptable data. These rules
are applied to a database by using integrity constraints and triggers to
prevent invalid data entry.

来自维基百科

Consistency
-----------
Consistency states that only valid data will be written to the database.

那么,“数据一致性”和“数据完整性”有什么区别呢?

提前感谢。

5个回答

36

它们不仅不同,而且正交。

不一致性:
如果一个数据库将员工Joe Shmoe的部门报告为销售部门,但没有在销售部门的员工名单中列出Joe Shmoe,则该数据库就是不一致的。
这是数据库的逻辑属性,与实际数据无关

完整性:
如果一个数据库报告jOe SaleS是Shmoe部门的成员,那么它就缺乏完整性。
jOe SaleS不是一个有效的员工名字,Shmoe也不是一个有效的部门名称。
这在逻辑上并不是无效的,但它违反了规定数据内容的规则


某些社交病态者在这个日期进行了恶意的负面评价。至于上面的评论,我从未说过“绝对”或者它们不能“相关”……当然有一些解决方案可以同时解决两个问题;这是正交性的基本原则。 - Jim Balter
1
我也对使用“正交”一词表示怀疑。所有通常的定义都涉及到一个主题与另一个主题的独立性或无关性,但在这里我们并没有真正做到。具体而言,很难想象如何在没有数据一致性的情况下实现数据完整性。因为存在依赖关系,所以这些概念并不是正交的。 - Ted Hopp
祝你好运,尤其是在处理同时包含城市之间距离列表和“最短路径”字段的数据库或者包含程序列表以及每个程序的布尔类型“终止”字段的数据库中确保一致性时,因为这些都是NP难问题或无法判定问题。 - Jim Balter
抱歉,但那是无稽之谈。数据一致性并不需要解决NP难问题或不可判定问题。在您提出的每种情况中,很容易在数据模型中包含一个“未确定”或“未知”值。例如,如果两个城市之间的距离发生变化(比如说,勘测误差被纠正),数据一致性要求数据库使“最短路径”字段失效。换句话说,如果数据库中的字段可以以不一致的方式更新,祝你好运确保数据完整性。 - Ted Hopp
仅为进一步阐述:数据库系统中一致性的定义并不要求数据在业务层面上保持一致,只要事务不违反任何数据库约束、级联或触发器即可。特别是,“[一致性]不能保证应用程序员希望的所有方式中事务的正确性”。 - Ted Hopp
显示剩余4条评论

10

非常简略的说,我的看法是:

完整性 = 强类型,不允许数据模型和约束所确定的非法值,并且具有外键、唯一约束等措施。

一致性 = 能够在给定时间点仅读取已提交的数据,而非中间步骤。


8
数据可以完全一致,但也可以完全错误。数据完整性更多关乎数据质量,远不止于数据库管理系统。数据库管理系统提供了数据一致性工具来帮助维护数据完整性,但这只是问题的一部分。完整性约束和触发器有助于确保DBMS不会降低(或者如果您是悲观主义者,则进一步降低)到达的数据完整性。
解读Oracle术语的方法是,完整性约束和触发器是实现定义数据完整性的业务规则子集的一种方式。

2

来自这里

数据一致性

在隔离的事务执行中保持数据的一致性。数据库中存储的数据值必须满足某些一致性约束条件。例如,帐户余额不应低于100美元。DDL命令提供了指定此类约束条件的功能。数据库系统每次更新数据库时都会检查这些约束条件。通常它可以是与数据库相关的任意谓词。为了检查数据库的一致性,大多数程序员依赖于这些约束条件,而这些通常很昂贵。

数据完整性

数据的完整性指的是“一处完整的数据”。数据以表格形式存在,每个表格都有一些属性。这些情况下,我们希望确保出现在一个关系中的某个属性集合中的值也应该出现在另一个关系中的某个属性集合中(参照完整性)。数据库修改可能会导致完整性违规。当完整性约束条件被破坏时,正常的过程会拒绝实际引起违规的操作。

enter image description here

您可以阅读第一章来了解ACID。


1
  1. 一致性:在同一列中不要混合日期、数字和字母,只能选择其中一种。这是通过定义列类型来实现的,例如,列ID号码(5)意味着其中不会有日期或字母,数字大于99999。
  2. 完整性:如果您有员工表和部门表,并且两个表中都有department_id列(表示员工所在的部门),则不会有员工在不存在于部门表中的部门工作。这是通过参照完整性约束来实现的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接