Data Quality: An Overview
1.1 DATA QUALITY MANAGEMENT
传统数据库通常关注数据的数量,它们可以做到支持大量数据,并发度很高,响应时间很快,但如果不能保证数据质量,响应时间再快也只能得到不准确的结果。随着人们对于数据库依赖程度的提高,对数据质量的要求也会相应提高,全世界每年因为数据质量问题造成的经济损失严重。由此数据质量管理(data quality management)的说法被提出并受到越来越多的关注(质量和数量应该是同等重要的),它着力于解决数据的一致性(consistently)、准确性(accurately)、完整性(completely)、时效性(timely)、唯一性(uniquely)等问题。
1.2 CENTRAL ISSUES OF DATA QUALITY
着重介绍和数据质量相关的5个关键问题:数据一致性(data consistency)、数据反重复(data deduplication)、数据准确性(data accuracy)、信息完备性(information completeness)以及数据时效性(data currency)。
1.2.1 DATA CONSISTENCY
数据一致性指的是表示现实世界实体的数据是有效并且完整的,它的目标是检测出数据中存在的不一致或者冲突。在传统的关系数据库中,不一致可能存在于单个元组中,也可能存在同一个表的不同元组之间,还有可能是不同表的元组之间。
![](https://img-my.csdn.net/uploads/201304/11/1365684033_2106.png)
例如:在英国(CC=44),如果AC=131那么city应该是Edinburgh(EDI),在t1和t2中都出现了不一致。再例如:在英国,由zip可以唯一确定一个street,换句话说如果两个元组CC=44且zip一样,那他们的street也应该一样,t1和t2又中枪了。为了识别这些不一致,我们通常使用数据依赖(data dependencies),单个关系表中的这类错误可以通过内部关系约束(intrarelation constraints)如:扩展函数依赖(extensions of functional dependencies),而跨多个关系表的错误可以通过外部关系约束(interrelation constraints)如:扩展蕴含依赖(extensions of inclusion dependencies),详见下文。
1.2.2 DATA DEDUPLICATION
数据反重复的目标是找出那些表面上看上去不太一样但实际上指的是现实世界同一个实体的元组,可以是在单个关系表中,也可能跨关系表。像t4、t5和t6看上去可能是同一个人,如果在另一个表中Mary Smith和Mary Luth有相同的email地址,那么这种可能性就会很大。数据去重很有意义:在数据清洗(data cleaning)过程中需要忽略重复记录;在数据集成中我们需要判断来自于不同数据源的相同元组,从而对隶属于它们的信息进行融合;在主数据管理(master data management)中它帮助我们找到输入元组对应的主数据。
1.2.3 DATA ACCURACY
数据准确性指的是数据库中的值和它所表示的实体实际值的接近程度。
![](https://img-my.csdn.net/uploads/201304/11/1365684052_6156.png)
如果我们知道s0是实际数据,那么论[age, height]s1要比s2准确,论[FN, status]s2要比s1准确。但是当s0未知的情况下判断s1和s2哪个更准确就比较有挑战性了,这时候我们就需要一些能得到的其他信息,例如:如果我们知道Mike还在上中学,那么age=14、status=single的可信度就会比较高;如果我们知道s0和s1的height有一个是正确的,那么通常会选height=1.70,因为年轻人的身高总是在长的嘛。
1.2.4 INFORMATION COMPLETENESS
信息的完备性关心对于查询我们数据库中的数据是否包含所需的全部信息,如果本身数据库中的数据就不全,那么查询结果肯定也是不全的。这里的不全包含两方面,其一是缺失元组的某些属性值,其二是直接缺失某些元组。如果认为仅仅是前者,那么就叫做CWA(Closed World Assumption),如果还有后者就是OWA(Opened World Assumption)。通常数据库理论都是建立在CWA之上的,不幸的是现实中CWA无法满足,但在OWA理论下只有一丢丢查询是确切的,具体怎么对待这个问题请看下文。
1.2.5 DATA CURRENCY
数据时效性致力于判断数据库中哪些是当前的值,哪些是过期的值。如果数据都带时间戳并且准确的话,这就不算个问题了,但存在各种各样的原因导致这个条件在现实中很难满足。因此我们又需要找点其他信息了。例如:考虑现实情况,人往高出走,一个人的薪水一般不会降的,因此如果数据没有错误(仅仅是新旧之分)高薪水的值总是比低的可靠一些;人的婚姻状况总是从single到married,从married到divorced,永远不会从married到single,因此在这个序列靠后的值可能时效性会高一些。
1.2.6 INTERACTIONS BETWEEN DATA QUALITY ISSUES
为了更好提高数据质量,以上几个问题有时候需要结合起来考虑。例如对某些数据进行反重复化操作,而后发现新的数据满足了一些数据依赖的条件,进而可以着手解决不一致问题;或者是利用数据依赖解决完不一致问题后发现元组间相似度提高到了一定程度,进而允许我们判断相同元组。其他还有像是:在提高信息完备度过程中引入了一些时间相关信息,据此可以对数据时效性进行进一步的判断;在判断数据的新旧程度之前,我们必须先确定哪些元组属于同一实体;在解决元组冲突之前,我们首先要判定数据库中是否存在完备的实体信息,只有它们存在才能依此进行冲突解决。
1.3 IMPROVING DATA QUALITY USING RULES
如何提高数据质量?一步一步来,首先是给现实数据中的错误归类,分为两类:
- 语法错误(syntactic error),比较容易识别的错误,像是类型不符合或者给出的值不在指定范围都算做语法错误。
- 语义错误(semantic error),语法上没有问题,但还是与实际值有差异的错误。
由于语法错误相对容易检测,接下来的重点将放在检测和修复语义错误上。
如何分辨我们的数据中存在语义错误?一种很自然的思想就是运用数据依赖(data dependency)或者叫做完整性约束(integrity constraint)。依赖的理论就比较古老了,差不多和关系数据库一样古老。自从Codd在1972年提出函数依赖后,一系列被定义为各种各样一阶逻辑语句的依赖语言不停的被提出和研究。它们的出现是有其内在必然性的,事实上依赖用声明的方式为数据语义指定了一些基本的部分,错误的出现就会打破依赖。以上提到的5种数据问题或多或少都可以通过依赖理论来处理,这种统一使上面提到的它们之间的交互变得容易。话是这么说,但真要实践起来还需要对传统依赖理论进行扩展,因为它并不是为这个而设计的(传统依赖通常被用作依据范式进行模式设计、查询优化、阻止一些非法数据更新等)。To improve the quality of the data, we need new forms of dependencies, by specifying patterns of semantically related data values to capture data inconsistencies, supporting similarity predicates to accommodate data errors in data deduplication, enforcing the containment of certain information about core business entities in master data for reasoning about information completeness, and by incorporating temporal orders to determine data currency.
提出合适的依赖语言(dependency language)之后,接下来就是如何使用他们,一般情况下数据质量管理系统需要有以下功能:
- 发现数据质量规则。我们需要有一个有效的方式来自动发现数据中存在的依赖,指望全靠手工来完成这个工作不太现实,费时费力还不一定找的全,因此尽量从数据中发现这些依赖,然后根据用户设定的阀值从中删去一些平凡或者无意义的依赖。
- 验证数据质量规则。事实上无论是手工指定还是自动发现的依赖,其本身可能会存在矛盾或不一致或者冗余的情况,因此需要首先排除。
- 检测错误。得到了一个有效的规则集合之后,就要有效的利用他们来检测数据中的错误或对数据的完备性和时效性进行一个判断。
- 修复数据。错误被检测出来后,我们希望可以自动定位和修复它们,此外还希望能找出表示统一实体的元组,然后对于每个实体找出它最新最精确的值。当有值或元组缺失时,我们希望能自动填补他们,这就牵扯到从哪里导入这些缺失数据,如上所说,这些过程都需要相互交互才有好的效果。