目录
一、统一数据建模的困境分析
1.1 概述
如果说数据标准化体系建设是实现数据资产化的基础,那么统一数据模型建设是实现数据资产化的最有效的关键举措。在说明统一数据模型的价值之前,先介绍目前数据资产化的一些困境。
1.2 烟囱式开发导致资源浪费,数据准确性低
数据团队分散,无统一组织和规划,对业务数据缺乏顶层的设计和抽象,基本符合根据采集的业务数据进行烟囱式开发的模式。数据工作者忙于各种数据提取(简称取数)和临时数据需求,没有精力规划全局的模型。从短期来看,对于个别取数需求,能实现快速响应。但是从整体来看,效率低下,重复工作多,指标准确性没有保障,存储和计算资源浪费严重。
1.3 企业数据混乱,数据使用低效
企业的数据混乱,血缘关系、数据处理流混乱。一旦出现数据问题,企业就难以有效溯源。取数有很多不同的路径,不同的人会创建不同的表、关联不同的表,指标准确性没有保障,取数时效也缺乏有效保障。企业缺乏沉淀和积累,缺乏统一的数据模型,即使对于常用的指标,每个人的理解也存在差异,取数逻辑也各异,数据查询和使用低效。
1.4 数据量大但数据价值实现难
很多企业采集了大量的数据,空有数据量,但是数据指标缺乏统一标准,数据质量缺乏保障,数据血缘关系不清晰,难以实现数据的合力和价值。
数据标准化和统一数据模型的建设能有效地解决以上3个困境,让数据插上翅膀,展翅飞翔。设想一下,有一个混乱无序的图书馆,还有一个分门别类、规整有序的图书馆。你现在要找一本书,在哪个图书馆的效率更高?统一数据模型的作用就是让混乱无序的图书馆变成分门别类、规整有序的图书馆,从而提高数据的使用效率。
简单而言,统一数据模型通过对数据进行抽象和分层,构建多层数据模型,并实现统一的指标体系,让每一层数据模型之间的血缘关系清晰可见,把常用的数据指标放到应用层,把明细数据放到底层,屏蔽了底层的数据细节,大大地降低了数据的重复开发,极大地提高了数据的使用效率和易用性。
二、统一数据模型的具体工作内容
2.1 概述
统一数据模型的主要目标是构建一套完整的面向主题的数据仓库模型,实现数据的汇聚、集成、分层和持久化,高效支持企业的各种大数据应用场景(比如,数据报表、数据查询、数据分析、数据建模等)的高质量数据需求。统一数据模型主要包含以下工作。
2.2 数据的汇聚和集成
数据仓库将各种数据源的数据定期抽取并存储起来,然后进行清洗、转化、集成等操作,将数据汇聚在一起。因此数据仓库是企业所有数据的大集成,能满足业务发展的各种维度和粒度的数据需求。
2.3 数据分层和建模
为了提高数据复用性和数据的使用效率,且更好地屏蔽底层的数据细节,数据仓库对数据进行了分层设计和建模。一般而言,数据仓库可以分为以下4层:贴源层(ODS层)、明细层(DWD层)、数据汇总层(DWS层)和数据应用层(APP层)。
数据工作者把从业务层中抽取的原始数据放到ODS层,然后对原始数据进行格式转化和标准化,解决数据格式、数据质量和完整度等问题,形成了DWD层。之后,数据工作者对DWD层数据进行聚合计算得到DWS层。最后基于实际的业务应用的需求(比如,数据报表、数据分析、数据建模等)对DWD层的表进行聚合或合并等操作构建了面向应用的数据大宽表,从而形成了APP层。
分层设计的好处是可以做到数据结构清晰、数据指标统一、血缘关系清晰、快速定位数据异常、减少重复开发、屏蔽异常的原始数据和DWD层的细节。
2.4 数据持久化存储
数据仓库的ODS层源源不断地从业务系统中抽取数据。数据一旦被写入就不能被更改,只要不人工删除,数据就会一直持久化存储在数据仓库中。
DWD层保存经过清洗和转化之后的ODS层明细数据。在业务系统中经常出现人工不规范的数据更正或篡改,导致出现各种数据质量问题。有时候故障也会导致业务数据的丢失。
而ODS层和DWD层持久化存储的好处是保证不受业务系统数据错乱的干扰,也不用担心数据的丢失问题,可以持续提供最真实的业务数据支持业务部门的数据需求。
另外,由于数据的持久化存储,数据仓库不仅记录时点数,还记录历史数据,能有效地反映历史数据的变化过程,便于数据的追溯和趋势分析。
三、如何建设统一数据模型
3.1 概述
目前,有很多成熟的方法论用于指导如何构建统一数据模型。统一数据模型的核心技术分为两个部分:数据仓库建模方法和数据模型分层框架。
3.2 数据仓库建模方法
3.2.1 概述
目前,主流的建模方法有范式建模和维度建模,其中范式建模又衍生出了Data Vault建模和Anchor建模。范式建模常用实体-关系工具进行建模。
3.2.2 范式建模
3.2.2.1 范式建模的概念
范式模型是由数据仓库之父比尔·恩门(Bill Inmon)依托于数据库第三范式设计理论提出的,是一个面向主题的企业级抽象模型。
我们需要熟知企业的业务,从企业的复杂业务中抽象出核心的主题,然后明确主题中主要的实体、关系、行为、事件和属性,从而构建一系列符合第三范式的实体表和事实表,满足业务分析和洞察的需求。
3.2.2.2 范式建模举例
以保险的订单为例,订单是保险的核心主题之一,该主题又包含很多实体和行为。比如,保险的主要参与方(投保人实体、被保险人实体、受益人实体等)、出单机构实体、标的实体、保单实体、批单实体等。这些实体本身有基本的属性,同时基于每个实体会产生很多行为和事件(如订单批改、订单退保等),从而产生基于行为和事件的事实表。
第三范式对范式模型有如下要求:
- 属性值的唯一性,消除二义。比如,性别只有男和女。
- 每张表中的非主键属性必须完全依赖于该表的主键,且只有一个主键。比如,在订单表中,主键是订单号,其他属性依赖于订单号。
- 在每张表中,非主键属性只能依赖于主键,而不能依赖于表中的其他属性,否则应该单独创建一张表,将该依赖关系归到新表的关系中。比如,在订单表中,存在其他非依赖关系的字段,诸如投保人ID、投保人姓名、投保人身份证号、投保人家庭住址等信息。投保人的信息依赖的是投保人ID,而非订单号主键。基于第三范式的要求,投保人的信息应该从订单表中移除出来单独建立投保人属性表,把投保人ID作为该新表的主键。
3.2.2.3 总结
整体而言,第三范式限制的优点是消除了数据不一致性、数据冗余度低,缺点是造成表非常多,很多指标的获取都需要对不同的表进行关联聚合操作,效率较低。
另外,范式建模需要进行主题和实体抽象,对建模人员的要求很高,建模人员需要对业务和数据非常熟悉,项目实施难度大、周期长。如果业务形态发生变化,模型构建的主题、实体和关系能否适应新的业务形态也是巨大的考验。
传统金融行业由于业务比较稳定,使用范式建模比较多,典型的是Teradata提出的FS-LDM模型。其被广泛用于保险、银行和证券行业,其十大主题分别是参与主体、产品、协议、事件、资产、财务、机构、地域、营销活动和渠道。
但是随着移动互联网的兴起,互联网业务越来越繁荣,新的业务模式开始诞生,为了快速响应动态的业务和变化的客户需求,我们需要更加敏捷的数据体系和模型,传统的范式建模的方式在敏捷和快速变化的场景中遭受着极大挑战。这个时候,很多企业尤其是业务动态变化的互联网企业开始引入维度建模的方法,并将其与范式建模相融合,以满足业务的动态和敏捷需求。
3.2.3 维度建模
3.2.3.1 维度建模与范式建模的区别
1996年,拉尔夫·金博尔(Ralph Kimball)和玛吉·罗斯(MargyRoss)提出了维度建模的概念和方法论。
维度模型和范式模型有以下两个显著的差别:
①目标不同。维度建模的设计目标是敏捷、高效地响应业务的分析需求。
②范式要求不同。维度建模的数据表设计不必严格遵守范式要求,尤其是第三范式的要求。简而言之,维度建模是为快速分析和高效决策而生的,在适当的时候为了达到高效和敏捷的要求,可以牺牲一定的规范性。
3.2.3.2 维度建模的基本素要
维度建模的基本要素包含事实表和维度表。事实表主要用于对分析主题的度量,一般用于记录和度量行为或事件(如记录和度量购买行为、报警事件等)。每发生一次购买行为或报警事件,事实表就会相应地增加一条数据。维度表记录对分析主题的描述信息(如客户的年龄、性别、地域等)。
3.2.3.3 举例说明维度建模
举例说明:
张三在2020年12月20日购买了一份长期重疾险,保险方为×××公司,出单机构为该公司某分公司下属的某支公司,缴费方式为期缴,缴费年限为25年,保额为80万元,每年的缴费金额为5000元,投保人为张三,被保险人为张三,受益人为张三的夫人李丽。
该保单的起保日期为2020年12月24日。分析该示例,事实表是对一次购买行为的度量,该表包含订单的主键、订单的度量(比如,金额5000元)和一些维度表的主键ID(比如,投保人ID、商品ID、具体的出单机构ID等)。这些ID能分别对应维度表中的一条记录。
事实表的度量一般是数据,如缴费金额为5000元、缴费年限为25年。维度表包含对客户、商品、时间、出单机构等的描述信息。
每个维度表包含某个主题维度的主键ID和描述性维度(比如,性别、年龄、地域、时间等)。维度表的主键ID可以作为与之关联的事实表的外键。
另外,由于事实表记录的是分析主题的度量,其记录行数会显著增加。事实表的行数一般很多,列数较少。维度表一般行数有限,行数增速较慢,而维度比较丰富。
3.2.3.4 维度建模的三种建模方式
维度建模主要用3种建模方式实现维度表和事实表的融合,分别是星型建模、雪花建模和星座建模。
3.2.3.4.1 星型建模
星型建模具有以下特征:
①一个事实表可以与多个维度表进行关联,多个维度表之间围绕事实表呈现星型展开。
②维度表之间不可关联。
上图为星型建模示意图,5个维度表围绕一个事实表展开,并通过事实表的外键与相应的维度表进行关联。
3.2.3.4.2 雪花建模
雪花建模与星型建模的主要差异在于当维度太多时,为了达到范式要求,雪花建模允许将维度表拆解为多个子维度表,通过外键进行关联。
上图为雪花建模示意图。在星型建模的基础上,维度表A被拆解为F和G两个维度表。事实表要想获得维度表F和维度表G中的维度,就需要通过维度表A分别与维度表F和维度表G产生关联。
3.2.3.4.3 星座建模
星座建模打破了多个维度表围绕单个事实表的形式,允许出现多个事实表和多个维度表。从实际业务出发,维度空间中的事实表不止一个,维度表同样可以被多个事实表共用。这么做的好处是避免了大量的数据冗余,提高了数据一致性,同时减少了表之间的关联次数,提高了计算的效率。
上图为星座建模示意图。除了自身独特的维度表,事实表A和事实表B共用维度表D和维度表E。
3.2.4 两种建模方法的比较
范式建模和维度建模都是数据仓库经典的建模方法。范式建模的核心优点是建模方法遵循第三范式,数据冗余度低,且能有效保证模型的数据一致性。范式建模的缺点是启动周期长,建模要求高,需要精通业务细节,并从业务中抽象出核心的主题和关系,灵活度不高。另外,由于范式的要求,范式建模无法实现退维操作,有时候需要做大量的关联操作,指标计算效率不高。整体而言,范式建模更适合稳定的业务场景和对数据的一致性要求特别高的情况,如银行、保险等金融场景。
维度建模的核心特点是牺牲一定的数据一致性,提升指标的计算效率。维度建模的核心优点是建模灵活度高,高效、敏捷响应分析和决策的需要,快速获得维度和指标。维度建模的主要缺点是存在一定程度的数据不一致性、数据冗余度高、后期维护和管理成本高。因此,维度建模更加适合业务形态可变、快速迭代且对敏捷性要求较高的场景,如互联网业务场景。
目前,在实际应用中,维度建模越来越被广泛应用,尤其是在一些对敏捷性要求较高的互联网“大厂”中被使用和普及。整体而言,维度模型的应用越来越普遍。除了下表中列举的维度建模的特点,其被普遍应用的一个主要原因是存储设备越来越便宜,与响应效率的提升相比,增加的存储成本是十分有限的。这也是维度模型目前被应用得越来越广泛的主要原因之一。此外,逐渐出现两种建模方法融合的趋势。融合建模借鉴彼此的优势,详尽梳理出业务的核心主题,围绕各个主题和关系构建相应的事实表和维度表,在满足核心指标敏捷响应业务需求的前提下,尽可能满足范式的要求,提高数据的一致性,降低后期数据模型的管理和维护压力。范式建模、维度建模和融合建模的特点比较见下表。
3.3 数据模型分层框架
3.3.1 概述
在确定了建模方法后,下一步就是明确数据模型分层框架。统一数据模型经过多年的发展,基于业务需求的差异,目前已经产生了很多分层框架,最典型的是7层分层框架,如图所示:
3.3.2 ODS层
这一层的逻辑很简单,将业务数据抽取出来存放到数据仓库,不做任何数据清洗和预处理操作,让数据保持和业务数据完全一致。由于ODS层几乎集合了企业所有的数据,因此该层需要注意数据安全,特别是客户的姓名、身份证号、手机号等要素数据。从数据安全角度考虑,ODS层的数据权限一般需要有严格的管控要求,只让少数人有权限读取和操作ODS层的数据,并做到数据留痕。很多企业有专门的团队负责ODS层,并进行严格的数据安全管控。
3.3.3 DWD层
ODS层一般会存在很多脏数据或者异常数据,它们会影响数据价值的实现。DWD层的主要工作是对ODS层的数据进行一系列的数据预处理和转化操作,得到规范、完整、一致的明细数据。常见的数据预处理操作包括异常值处理、缺失字段处理、格式转化、乱码处理、错误数据处理、数据规范化、数据变换、数据分箱、数据加密、字段衍生等。比如,年龄为负值、日期格式的统一、中文乱码的处理等。此外,需要对DWD层关键的隐私数据进行加密处理,如客户的身份证号和手机号。
3.3.4 DWM层
由于DWD层基于主题的明细表特别多,如果需要计算某个指标,那么可能需要关联多张明细表,效率较低。现在的存储介质较为便宜,而实际应用对查询和计算效率要求较高,有时候为了提高DWM层数据的易用性和DWS层数据的处理效率,可以适当地将常用的维度进行退维,适当地增加数据冗余度,利用空间换时间,将维度退维放到事实表中,提高对事实表进行过滤和查询的效率。以保险交易场景为例,可以将出单机构维度、投保角色退维到保险交易事实表中。在退维前要得到出单机构的信息、保单投保人和被保险人的相关信息,需要将保险交易事实表和保险角色表、出单机构表进行关联。在退维后,将这些保单常用的信息直接退维到保单交易事实表中,可以大大地提高数据使用效率,如图所示:
另外,为了提高DWS层的聚合操作效率,在DWM层会对主题做一些轻度的汇总,也可能会跨主题进行关联,抽取公共指标集,生成一些小的宽表。这样,在DWS层只需要基于主题连接几个小宽表即可获得大宽表,大大地提高指标计算效率。
3.3.5 DWS层
DWS层基于主题进行高度汇总,抽象业务需求,获得基于主题的大宽表。大宽表包含丰富的指标和多个时间维度。比如,在保险行业,可以汇总出标的、投保人、被保险人、客户、渠道、订单、产品、协议、机构等主题大宽表。这些大宽表可以高效地支持数据分析、数据查询和数据挖掘等功能。
这一层也包含大量的抽象操作,基于对业务的理解将后续可能需要处理的维度抽象出来,便于后续查询使用。
3.3.6 APP层
这一层基于业务的需求驱动,根据业务的需求确定维度和指标,主要用于加工业务需要的个性化指标以满足数据应用和专题分析的需求。常用的是基于不同的时间粒度进行聚合生成事实表和汇总表,主要用于BI展示和OLAP。
3.3.7 DIM层
DIM层主要存储数据仓库公用的数据维度表、码表和配置表。比如,用户信息表、产品信息表、机构码表、渠道维度配置表等。
3.3.8 TMP
在数据建模过程中,为了让程序更加简洁和清晰,需要构建大量的临时表。为了加强临时表的管理,可以把这些临时表放到TMP层进行统一管理。该层主要用于存储数据仓库的临时表和临时数据。可以为这些表设置一定的生命周期,定期自动进行删除以释放存储资源。
四、维度建模探索
4.1 维度建模过程
4.1.1 概述
根据拉尔夫·金博尔对维度建模的阐述,维度建模设计主要分为以下4个步骤:梳理业务流程、定义事实表的粒度、确定事实表的维度、确定事实表的度量。在此基础上,我增加了退维的步骤,将维度建模的流程分为5步,如图所示:
4.1.2 梳理业务流程
我们要梳理业务流程,确定关键节点,明确核心实体、事件和关系。以保险承保流程为例,业务流程主要包含产品开发、用户投保、生成订单、生成保单、支付、开票、发送保单、结算、批改、退保等关键节点。
对于这部分工作,我们需要和业务专家一起详细调研业务的需求,梳理出业务的主要流程和关键节点,然后基于每个关键节点,明确主要的实体、事件和关系。以用户投保节点为例,主要包含的实体有客户(投保人、被保险人、受益人等)、出单保险公司、投保页面填写的内容等,事件主要是客户填写投保页面的内容,关系有投保人、被保险人、受益人、客户和保险公司的关系等。
4.1.3 定义事实表的粒度
在确定了业务流程和关键节点后,我们就需要根据每个关键节点确定事实表的粒度。事实表的粒度是指对事实表内容的描述和度量的粒度,简而言之,就是如何描述事实表的一行数据。以生成订单环节为例,其中的一个核心事实表是订单。
订单事实表的单行数据可以是每一次投保行为,也可以是每一次有效的投保行为(即生成了保单号)等。在熟悉业务的基础上,我们要和业务专家一起先预确定事实表的粒度,然后再和他们一起核对,最终明确不同事实表的粒度。
4.1.4 确定事实表的维度
确定事实表的内容和粒度是比较复杂的环节。维度的确定相对简单,且维度是可以扩展的。维度是对事实表单行内容的描述性信息,常见的内容描述维度有时间、产品、地域、供给侧、客户、事件类型(如是否促销、是否续保)等。
在确定了维度后,业务部门可以基于不同维度对事实表进行多维分析。需要基于订单事实表进行以下维度的多维分析:统计不同时间粒度、不同地域、不同客户类型、不同品类的订单量。
4.1.5 确定事实表的度量
我们要根据对业务需求的理解,梳理出事实表的度量。在事实表的度量确定过程中,我们首先需要明确所需要的度量的类型,然后根据不同的类型确定所需要的具体的度量。度量有很多类型,如固定的、可加的、不可加的、需要复杂计算得到的。相对固定的度量有成本、价格、佣金率等。需要进行复杂计算才能得到的度量有利润率、保险的综合成本率等。可加的度量意味着当事实表和维度表关联时,该度量可以进行累加求和。而对于不可加的度量,无法进行多维累加求和计算,否则会出现指标计算错误。
以订单为例,常见的度量为成本、佣金率、销售单价、销售数量和销售金额等。其中,成本、销售数量和销售金额是可加的,这些度量支持多维累加求和(如统计全国的销售数量和销售金额),而销售单价和佣金率是不可加的,因此无法通过多维累加求和的方式计算全国的销售单价和佣金率。
4.1.6 退维
在确定订单事实表的维度时,维度包含了客户维度、产品维度、渠道维度、机构维度等。拉尔夫·金博尔的维度建模理论建议在事实表中只保存这些维度表的外键。这样做的好处是结构比较清晰、冗余度较低、节省存储成本。
但是存储介质较为便宜,而实际应用对查询和计算效率要求较高,笔者建议可以适当地将常用的维度进行退维,将其放到事实表中,这样就避免了过多的关联操作,有效地提高了对事实表的查询和分析效率。
4.2 维度建模示例
在参考维度建模的设计流程,针对不同业务流程的关键节点确定了事实表和维度表后,我们就可以通过关联事实表和维度表支持业务的多维分析与深度决策的需求。维度表提供了动态分析的标签(比如,年、月、出单保险公司、产品类别等),订单数量、订单额(单位为元)等计算指标则来自事实表,以下图为例,通过维度表和事实表的融合,我们最终可以实现多维分析。
另外,有时候为了提高指标计算的效率,我们还需要进行退维操作。比如,把产品、渠道维度退化到订单事实表中,利用空间换时间,减少事实表和维度表的关联操作,提高效率。
五、统一建模的注意事项
5.1 概述
统一数据模型通过实现统一的数据标准、统一的数据口径、统一的数据分层模型、统一的数据建模方法来解决企业“数据孤岛”和数据“脏、乱、差”的问题,让企业上下的数据对齐,让数据真正变成可用的资产,满足数据分析、洞察和决策支持的需求,为前端数据价值的实现夯实基础。
但是企业何其大,部门何其多,业务何其复杂,需求差异何其大。要用一套统一模型“打天下”难度很大,有很多“坑”需要填。笔者根据实践的经验,总结出统一数据模型落地的8个需要改善的事项。
5.2 数据标准化未在整个企业落实
很多企业设置了专门的数据部门,数据部门的标准化工作从整体上来看有条不紊地进行,虽然不完善、不完美,但是至少已有标准可供参考,不过这些标准只停留在数据部门内部,或者没有在上游的开发部门执行,或者数据部门和开发部门没有对齐数据标准,或者开发部门没有相关的数据标准。
这会导致哪些问题呢?据统计,约2/3的数据质量问题和数据批处理故障由前端开发部门缺乏统一的数据标准导致。常见的问题有数据乱码、数据异常、数据库字段发生变更、不同的表有相同的字段且数据不一致、表的权限随意变更、账号随意变更等。
如何有效地解决这些问题呢?关键方法是让开发部门和数据部门对齐数据标准,并建立奖惩机制,让标准和规则能严格执行,同时还需要建立数据质量监控体系,以便在事前发现问题并及时解决问题。
如果有标准却执行不到位,那么标准如同虚设。如果只强调执行却无奖惩制度,那么执行会大打折扣。如果有奖惩却无监控体系,出现问题事后解决,那么像无头苍蝇无方向感,效率不高,效果也不好。解决了这些问题,意味着夯实了统一数据模型的标准基础,大大地提升了数据来源的质量,让统一数据模型的建设和落地没有后顾之忧。
5.3 缺少元数据管理支持
元数据打通了各个数据系统,记录了数据全生命周期的完整历程,主要包含各个数据库表的详情信息(比如,行、列、分区、依赖关系、血缘关系、关联关系等)、统一数据模型定义、数据全生命周期信息和血缘关系、任务调度全流程信息等。
缺少元数据管理工具,相当于企业数据资产管理缺少了数据表的视图、数据释义、数据溯源、清晰的血缘关系、调度流程记录、数据应用字典、操作指南。这不仅让企业无法进行数据的溯源和血缘关系分析,而且如果某个数据出现问题,那么企业无法快速、高效地定位数据问题。同时,这让企业无法有效地监控各个数据任务的调度过程,让任务的执行和运维没有保障。
5.4 监控体系缺失
虽然知道数据问题的存在,但是很多企业在理念上不够重视,甚至漠视,觉得出现数据问题是小概率事件,缺乏有效的数据质量监控体系,不能提前发现数据质量问题并进行有效预警。
要想提高数据质量,就需要构建全面的数据质量监控体系,为企业的数据质量构建“防洪堤”。
我建议监控体系最好分为以下两层。第一层是业务数据层面。企业要提前感知数据源头的质量问题,不要让脏数据进入下一个环节。
第二层是数据仓库层面。
只有两层都有,并做好沟通和协同,监控体系才能发挥最大的价值。
5.5 事实表的设计注意事项
在事实表的设计过程中,存在以下注意事项。
(1)尽可能包含所有与业务过程相关的事实,且在事实表中,应该只选择与业务过程相关的事实,而非任意增加事实。
(2)在同一个事实表中,事实的粒度和度量单位应该保持一致。
(3)对每种不同的事实或者不同的度量粒度都需要设计相应的事实表。
(4)不同的事实表的事实尽量不同名。
(5)不可加的事实无法进行多维累加求和,应该把不可加的事实分解为可加的事实。
5.6 维度爆炸
前面提到了维度建模的方法论,维度反映对事实表的描述信息。在维度建模的过程中,需要防止维度爆炸。何谓维度爆炸?即对事实表的维度缺乏合理的设计,任意扩展维度会导致维度太多,在多维分析的时候要获得某些维度的指标就需要关联过多的表,这使得计算和查询的效率大大降低。
在保险业务中,客户有很多角色。例如,投保人、被保险人、受益人等。如果为每个角色都设计一个维度,那么会造成维度比较多,业务复杂性增加。如果将这些维度设计成一个维度,通过新增一个角色来描述不同的角色,将这几个维度进行合理合并,那么可以解决维度过度的问题。
总之,维度不是越多越好,要合理设计维度表,让维度表更加精炼。
5.7 对维度过度退化
前面提到对维度缺乏设计,任意扩展会造成维度爆炸。另一个极端是对维度过度退化,将维度表过度退化到事实表中,如数据模型的各个层级的形式都是大宽表。
对维度过度退化会造成以下问题:
①造成事实表庞大和冗余。
②违背范式规则,降低数据的一致性。
③灵活性降低。
在实际应用中,退维操作大部分集中在DWS层的大宽表中,而在DWM层中一些不常用或者业务稳定的分析维度可以适度退化到事实表中。
5.8 缓慢变化维
维度的属性并不是静态的,有些维度会随时间发生变化,这种现象被称为缓慢变化维(Slowly Changing Dimension,SCD)。
比如,客户保险在保状况(新客、续保客户、流失客户等)、客户风险评级、客户的理赔进展等维度会随着时间发生变化。
如何处理SCD问题呢?一般有以下4种方法。
方法一:保留原始值。比如,在信用评分场景中,可以用该方法保留客户的原始信用评分的值。
方法二:覆盖原始值。这样处理,易于实现,但是未保留历史数据。
方法三:增加新行。维度每次有变化就增加一行,通过外键和事实表关联,一般通过拉链法解决。
方法四:增加新的属性列。使用新列存储历史维度,使用最新的值覆盖原来的维度。其特点是保留了当前和最近一次维度的状态。
在实际场景中,根据业务的需求,后面3种方法应用得较多,尤其是方法三。
5.9 大表的抽取
在数据仓库的数据模型设计过程中,我们经常会遇到大表的数据抽取问题。
比如,用户表大约有5亿条记录、150个字段,数据量超过100GB。表中的部分字段会进行更新,如客户的联系方式、职业等。用户表的特征是行数有限,列数较多,列相对稳定。
又如,订单表大约有50亿条记录、50个字段。表中的部分字段会进行更新,如订单状态等。订单表的特征是行数很多,列数较少,列相对稳定。
那么对于这种大表该如何取数?一般有以下3种方法。
方法一:每天只留最新的一份,如我们每天用Sqoop抽取最新的一份全量数据,将其放到Hive中。这种方法的优点是实现简单,缺点是数据量大、全量数据抽取时间长,且没有记录历史数据。
方法二:每天保留一份全量的切片数据快照。这种方法的优点是保留了历史数据,缺点是存储空间占用太大,如果每天都保留一份全量数据,那么将会导致存储爆炸。我们一般会选择保存周期为3个月的全量数据。
方法三:使用拉链表技术。拉链表在空间上做了一次取舍,既能获取最新的数据,也能保留历史的数据。当然,如果存储的历史数据周期很长,那么拉链表也会出现数据膨胀。为了提高效率,除了增加时间索引和优化查询引擎,一般会选择舍弃时间维度上较早的数据。
在实际应用中,如果业务数据量不大,那么使用方法二是最简单明了的,如果数据量很大,那么方法三是最高效的。
好了,本次内容就分享到这,欢迎大家关注《数据中台》专栏,后续会继续输出相关内容文章。如果有帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!