1.2 操作型系统与分析型系统

上一小节已经多次提及操作型系统和分析型系统,本小节将详细阐述它们的概念及差异。

在一个大组织中,往往都有两种类型的系统,操作型和分析型,而这两种系统大都以数据库作为数据管理、组织和操作的工具。操作型系统完成组织的核心业务,例如下订单、更新库存、记录支付信息等。这些系统是事务型的,核心目标是尽可能快地处理事务,同时维护数据的一致性和完整性。而分析型系统的主要作用是通过数据分析评估组织的业务经营状况,并进一步辅助决策。

1.2.1 操作型系统

相信从事过IT或相关工作的读者对操作型系统都不会感到陌生。几乎所有的互联网线上系统、MIS、OA等都属于这类系统的应用。操作型系统是一类专门用于管理面向事务的应用的信息系统。“事务”一词在这里存在一些歧义,有些人理解事务是一个计算机或数据库的术语,另一些人所理解的事务是指业务或商业交易,这里使用前一种语义。那么什么是数据库技术中的事务呢?这是首先需要明确的概念。

事务是工作于数据库管理系统(或类似系统)中的一个逻辑单元,该逻辑单元中的操作被以一种独立于其他事务的可靠方式所处理。事务一般代表着数据改变,它提供“all-or-nothing”操作,就是说事务中的一系列操作要么完全执行,要么完全不执行。在数据库中使用事务主要出于两个目的:

(1)保证工作单元的可靠性。当数据库系统异常宕机时,其中执行的操作或者已经完成或者只有部分完成,很多没有完成的操作此时处于一种模糊状态。在这种情况下,数据库系统必须能够恢复到数据一致的正常状态。

(2)提供并发访问数据库的多个程序间的隔离。如果没有这种隔离,程序得到的结果很可能是错误的。

根据事务的定义,引申出事务具有原子性、一致性、隔离性、持久性的特点,也就是数据库领域中常说的事务的ACID特性。

● 原子性

指的是事务中的一系列操作或全执行或不执行,这些操作是不可再分的。原子性可以防止数据被部分修改。银行账号间转账是一个事务原子性的例子。简单地说,从A账号向B账号转账有两步操作:A账号提取,B账号存入。这两个操作以原子性事务执行,使数据库保持一致的状态,即使这两个操作的任何一步失败了,总的金额数不会减少也不会增加。

● 一致性

数据库系统中的一致性是指任何数据库事务只能以允许的方式修改数据。任何数据库写操作必须遵循既有的规则,包括约束、级联、触发器以及它们的任意组合。一致性并不保证应用程序逻辑的正确性,但它能够保证不会因为程序错误而使数据库产生违反规则的结果。

● 隔离性

在数据库系统中,隔离性决定了其他用户所能看到的事务完整性程度。例如,一个用户正在生成一个采购订单,并且已经生成了订单主记录,但还没有生成订单条目明细记录。此时订单主记录能否被其他并发用户看到呢?这就是由隔离级别决定的。数据库系统中,按照由低到高一般有读非提交、读提交、可重复读、串行化等几种隔离级。数据库系统并不一定实现所有的隔离级别,如Oracle数据库只实现了读提交和串行化,而MySQL数据库则提供这全部四种隔离级别。

隔离级越低,多用户同时访问数据的能力越高,但同时也会增加脏读、丢失更新等并发操作的负面影响。相反,高隔离级降低了并发影响,但需要使用更多的系统资源,也增加了事务被阻塞的可能性。

● 持久性

数据库系统的持久性保证已经提交的事务是永久保存的。例如,如果一个机票预订报告显示一个座位已经订出,那么即使系统崩溃,被订了的座位也会一直保持被订出的状态。持久性可以通过在事务提交时将事务日志刷新至永久性存储介质来实现。

了解了事务的基本概念后,我们再来看操作型系统就比较容易理解了。操作型系统通常是高并发、高吞吐量的系统,具有大量检索、插入、更新操作,事务数量大,但每个事务影响的数据量相对较小。这样的系统很适合在线应用,这些应用有成千上万用户在同时使用,并要求能够立即响应用户请求。操作型系统常被整合到面向服务的架构(SOA)和Web服务里。对操作型系统应用的主要要求是高可用、高速度、高并发、可恢复和保证数据一致性,在各种互联网应用层出不穷的今天,这些系统要求是显而易见的。

1.操作型系统的数据库操作

在数据库使用上,操作型系统常用的操作是增、改、查,并且通常是插入与更新密集型的,同时会对数据库进行大量并发查询,而删除操作相对较少。操作型系统一般都直接在数据库上修改数据,没有中间过渡区。

2.操作型系统的数据库设计

操作型系统的特征是大量短的事务,并强调快速处理查询。每秒事务数是操作型系统的一个有效度量指标。针对以上这些特点,数据库设计一定要满足系统的要求。

在数据库逻辑设计上,操作型系统的应用数据库大都使用规范化设计方法,通常要满足第三范式。这是因为规范化设计能最大限度地数据冗余,因而提供更快更高效的方式执行数据库写操作。关于规范化设计概念及其相关内容,会在第2章“数据仓库设计”中做详细说明。

在数据库物理设计上,应该依据系统所使用的数据库管理系统的具体特点,做出相应的设计,毕竟每种数据库管理系统在实现细节上还是存在很大差异的。下面就以Oracle数据库为例,简要说明在设计操作型系统数据库时应该考虑的问题。

● 调整回滚段。回滚段是数据库的一部分,其中记录着最终被回滚的事务的行为。这些回滚段信息可以提供读一致性、回滚事务和数据库恢复。

● 合理使用聚簇。聚簇是一种数据库模式,其中包含有共用一列或多列的多个表。数据库中的聚簇表用于提高连接操作的性能。

● 适当调整数据块大小。数据块大小应该是操作系统块大小的倍数,并且设置上限以避免不必要的I/O。

● 设置缓冲区高速缓存大小。合理的缓存大小能够有效避免不必要的磁盘I/O。

● 动态分配表空间。

● 合理划分数据库分区。分区最大的作用是能在可用性和安全性维护期间保持事务处理的性能。

● SQL优化。有效利用数据库管理系统的优化器,使用最佳的数据访问路径。

● 避免过度使用索引。大量的数据修改会给索引维护带来压力,从而对整个系统的性能产生负面影响。

以上所讲的操作型系统都是以数据库系统为核心,而数据库系统为了保持ACID特性,本质上是单一集中式系统。在当今这个信息爆炸的时代,集中式数据库往往已无法支撑业务的需要(从某订票网站和某电商网站的超大瞬时并发量来看,这已是一个不争的事实)。这就给操作型系统带来新的挑战。分布式事务、去中心化、CAP与最终一致性等一系列新的理论和技术为解决系统扩展问题应运而生。这是一个很大的话题,要想说清楚需要很多的扩展知识和大量篇幅,故这里只是点到为止,不做展开。

1.2.2 分析型系统

在计算机领域,分析型系统是一种快速回答多维分析查询的实现方式。它也是更广泛范畴的所谓商业智能的一部分(商业智能还包含数据库、报表系统、数据挖掘、数据可视化等研究方向)。分析型系统的典型应用包括销售业务分析报告、市场管理报告、业务过程管理(BPM)、预算和预测、金融分析报告及其类似的应用。

1.分析型系统的数据库操作

在数据库层面,分析型系统操作被定义成少量的事务,复杂的查询,处理归档和历史数据。这些数据很少被修改,从数据库抽取数据是最多的操作,也是识别这种系统的关键特征。分析型数据库基本上都是读操作。

2.分析型系统的数据库设计

分析型系统的特征是相对少量的事务,但查询通常非常复杂并且会包含聚合计算,例如今年和去年同时期的数据对比、百分比变化趋势等。分析型数据库中的数据一般来自于一个企业级数据仓库,是整合过的历史数据。对于分析型系统,吞吐量是一个有效的性能度量指标。

在数据库逻辑设计上,分析型数据库使用多维数据模型,通常是设计成星型模式或雪花模式。关于多维数据模型的概念及其相关内容,会在第2章“数据仓库设计”中做详细说明。

在数据库物理设计上,依然以Oracle数据库为例,简要说明在设计分析型系统数据库时应该考虑的一些问题。

● 表分区。可以独立定义表分区的物理存储属性,将不同分区的数据存放到多个物理文件上,这样做一方面可以分散I/O;另一方面,当数据量非常大时,方便数据维护;再有就是利用分区消除查询数据时,不用扫描整张表,从而提高查询性能。

● 位图索引。当查询条件中包含低基数(不同值很少,例如性别)的列,尤其是包含有这些列上的or、and或not这样的逻辑运算时,或者从有大量行的表中返回大量的行时,应考虑位图索引。

● 物化视图。物化视图物理存储查询所定义的数据,能够自动增量刷新数据,并且可以利用查询重写特性极大地提高查询速度,是分析型系统常用的技术。

● 并行化操作。可以在查询大量数据时执行并行化操作,这样会导致多个服务器进程为同一个查询语句工作,使用该查询可以快速完成,但是会耗费更多的资源。

随着数据的大量积累和大数据时代的到来,人们对于数据分析的依赖性越来越强,而分析型系统也随之越来越显示出重要性。举一个简单的例子,在一家医院中,保存有20年的非常完整的病人信息。医院领导想看到关于最常见的疾病、成功治愈率、实习医生的实习天数等很多相关数据的详细报告。为了满足这个需求,应用分析型系统查询医院信息数据仓库,并通过复杂查询得到结果,然后将报告提交给领导做进一步分析。

1.2.3 操作型系统和分析型系统对比

操作型系统和分析型系统是两种不同种类的信息系统。它们都与数据库技术相关,数据库提供方法支持这两种系统的功能。操作型系统和分析型系统以完全不同的方式使用数据库,不仅如此,分析型系统更加注重数据分析和报表,而操作型系统的目标是一个伴有大量数据改变的事务优化系统。

对于学习数据科学及其相关技术的读者,了解这两种信息处理方式的区别至关重要。这也是理解商业智能、数据挖掘、数据仓库、数据模型、ETL处理和大数据等系统的基础。

通过前面对两种系统的描述,我们可以对比它们的很多方面。表1-1总结了两种系统的主要区别。后面我们进一步讨论每一个容易产生疑惑的对比项,以帮助你理解。

表1-1 操作型系统和分析型系统对比

首先两种系统的侧重点不同。操作型系统更适合对已有数据的更新,所以是日常处理工作或在线系统的选择。相反,分析型系统提供在大量存储数据上的分析能力,所以这类系统更适合报表类应用。分析型系统通常是查询历史数据,这有助于得到更准确的分析报告。

其次因为这两种系统的目标完全不同,所以为了得到更好的性能,使用的数据模型和设计方法也不同。操作型系统数据库通常使用规范化设计,为普通查询和数据修改提供更好的性能。另一方面,分析型数据库具有典型的数据仓库组织形式。

基于这两个主要的不同点,我们可以推导出两种系统其他方面的区别。操作型系统上的查询更小,而分析型系统上执行的查询要复杂得多。所以操作型系统会比分析型系统快很多。

操作型系统的数据会持续更新,并且更新会立即生效。而分析型系统的数据更新,是由预定义的处理作业同时装载大量的数据集合,并且在装载前需要做数据转换,因此整个数据更新过程需要很长的执行时间。

由于操作型系统要做到绝对的数据安全和可用性,所以需要实施复杂的备份系统。基本的全量备份和增量备份都是必须要做的。而分析型系统只需要偶尔执行数据备份即可,这一方面是因为这类系统一般不需要保持持续运行,另一方面数据还可以从操作型系统重复装载。

两种系统的空间需求显然都依赖于它们所存储的数据量。分析型系统要存储大量的历史数据,因此需要更多的存储空间。