1、什么是数据仓库(数仓定义)
2、数据仓库特点
3、数据库和数据仓库的区别
4、数仓构建流程
5、数仓分层概述
6、数仓为什么要分层
7、维度建模选择:星型、雪花、星座
8、缓慢变化维处理
9、拉链表的应用
10、事实表的类型
11、全量表,增量表,流水表,拉链表的区别及使用场景(同步策略)
12、你们的数仓上层应用有哪些
13、维度建模和范式建模
14、怎么理解元数据?
15、数据漂移如何解决
16、数据治理内容
17、数据集市、数据中台、数据仓库、数据湖
18、原子指标、衍生指标、派生指标的区别
19、范式建模
20、数仓一致性如何保证
21、主题域如何划分
22、制定了哪些数仓规范
23、如何避免业务数据库表结构变更导致数仓任务大面积报错。
24、模型设计的思路?业务驱动?数据驱动?
25、为什么需要数据仓库建模?
26、总线架构
27、一致性维度
28、一致性事实
29、Kimball架构和Inmon架构的区别
30、概念模型、逻辑模型、物理模型
31、你认为数据仓库最重要的是什么
32、大宽表的优点与缺点
数据仓库 Data Warehouse,是为企业所决策制定过程,提供所有支持类型的数据集合。用于分析性报告和决策支持。数仓是一个面向主题、集成的、相对稳定、反映历史变化的数据集合,随着大数据技术的发展,其作用不再局限于决策分析、还可以为业务应用、审计、追踪溯源等多方面提供数据支撑,帮助企业完成数字化转型。
普通的操作型数据库主要面向事务性处理,而数据仓库中的所有数据一般按照主题进行划分。主题是对业务数据的抽象,是从较高层次上对信息系统中的数据进行归纳和整理。
面向主题的数据可以划分成两部分
分析数据仓库主题的时候,一般方法是先确定几个基本的主题,然后再将范围扩大,最后再逐步求精
面向操作型的数据库通常是异构的、并且相互独立,所以无法对信息进行概括和反映信息的本质。而数据仓库中的数据是经过数据的抽取、清洗、切换、加载得到的,所以为了保证数据不存在二义性,必须对数据进行编码统一和汇总,以保证数仓内的数据一致性,消除冗余数据。
数据仓库中的数据反映的都是一段历史时期的数据内容,它的主要操作是查询、分析而不进行一般意义上的更新(操作型数据库主要完成数据的增加、修改、删除、查询),一旦某个数据进入到数据仓库后,一般情况下数据会被长期保留,超过规定的期限才会被删除。通常数据仓库需要做的工作就是加载、查询和分析,一般不进行修改操作。
数据仓库不断从操作型数据库或其他数据源获取变化的数据,从而分析和预测需要的历史数据,所以一般数据仓库中数据表的维度与事实表中都含有时间键,以表明数据的历史时期信息,然后不断增加新的数据内容。通过这些历史信息可以对企业的发展历程和趋势做出分析和预测。数据仓库的建设需要大量的业务数据作为积累,并将这些宝贵的历史信息经过加工、整理,最后提供给决策分析人员,这是数据仓库建设的根本目的。
数据库用于OLTP,主要用于操作型处理 数据库是面向事物处理的,数据是由日常的业务产生的,常更新;数据库一般用来存储当前事务性数据,如交易数据、业务数据;数据库的设计一般是符合三范式的,有最大的精确度和最小的冗余度,有利于数据的插入;
数据仓库用于OLAP,支持管理决策。数据仓库是面向主题的,数据来源多样,经过一定的规则转换得到,用来分析。数据仓库一般存储历史数据。数据仓库的设计一般不符合三范式,并且反规划范,有利于查询。
通过与业务部门的交流,了解建立数仓要解决的问题,确定数据分析或前端展现的主题和各个主题下的查询分析要求。主题要体现出某一方面的各分析角度(维度)和统计数值型数据(量度)之间的关系。
确定主题后,需要考虑分析的各种指标。它们一般为数据值型数据,量度是要统计的指标,必须事先选择恰当,基于不同的度量可以进行复杂关键性指标(KPI)的设计和计算。
明确业务过程和维度所属主题域、明确维度与业务过程的关系,最后形成一个总线矩阵图表。
DIM公共维度层 (DIM)公共维度层由维度表构成,基于维度建模理念,建立整个企业的一致性维度。维度是逻辑概念,是衡量和观察业务的角度。在划分数据域、构建总线矩阵时,需要结合对业务过程的分析定义维度。
构建明细事实表DWD,将原始数据表和各个维度表进行关联,生成事实表。
根据衍生指标和派生指标构建DWS
数据清洗转换和传输。业务系统中的数据加载到数据仓库之前,必须进行数据的清洗和转换,保证数据仓库中数据的一致性。
开发数据仓库的分析应用。满足业务部门对数据进行分析的需求。
元数据治理、数据质量监控、数据血缘管理
ods:operation data store原始数据层, 数据保持原貌不做处理,ODS层是数据仓库准备区,为DWD层提供基础原始数据,可减少对业务系统的影响
dmi:公共维度层 公共维度层由维度表构成,基于维度建模理念,建立整个企业的一致性维度。
dwd:data warehouse detail明细数据层 结构和粒度与原始表保持一致,通过维表与ods层数据进行清洗关联得到(去除空值,脏数据) 是业务层与数据仓库的隔离层
dws:data warehouse service数据服务层 数据轻度汇总。基于dwd上的基础数据,整合汇总成分析某一个主题域的服务数据,一般是宽表
ads:application data store 数据应用层 为各种统计报表提供数据 该层主要是提供数据产品和数据分析使用的数据,一般会存放在ES、MySQL等系统中供线上系统使用,也可能会存在Hive或者Druid中供数据分析和数据挖掘使用。例如:我们经常说的报表数据,或者说那种大宽表,一般就放在这里。
将一个复杂的任务分解成多个步骤来完成,每一层只处理单一的步骤,比较简单和容易理解。
每一个数据分层都有它的作用域,这样我们在使用表的时候能更方便地定位和理解。
通过建设多层次的数据模型供用户使用,避免用户直接使用操作型数据,可以更高效的访问数据。通过开发一些通用的中间层数据,能够减少极大的重复计算。
分层后不必改一次业务就重新接入数据。
而且便于维护数据的准确性,当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的步骤开始修复。
一张事实表,根据主键关联多张一级维度表
星型架构是一种非规范化的结构,多维数据集的每一个维度都直接与事实表相连接,不存在渐变维度,所以数据有一定的冗余。很多统计查询不需要做外部的连接,通过冗余换取运行效率。
雪花模式是星型模式的扩展,其中某些维表被规范化,进一步分解到附加维度表中。
优点是:通过最大限度地减少数据存储量以及联合较小的维表来改善查询性能。
星座模式是星型模式延伸而来,星型模式是基于一张事实表的,而星座模式是基于多张事实表的,而且共享维度信息。常用于数据关系更复杂的场景。也称事实星座模型。
1、雪花模型在维度表、事实表之间的连接很多,因此性能方面会比星型模型低。
2、雪花模型使用的是规范化数据,数据冗余来减少数据量。其维度层级和维度信息都存储在数据模型之中。星形模型是反规范化数据,数据存在冗余,维度直接关联事实表,维度层级清晰明了。
3、雪花模型在设计上更加复杂,由于附属维度的限制,ETL复杂且不能并行化。星形模型加载维度表,不需要添加附属维度层级,ETL相对简单,可以实现高度的并行化。
4、雪花模型使得维度分析更加容易,比如“针对特定的广告主,有哪些客户或者公司是在线的?”。星形模型用来做指标分析更适合,比如“给定的一个客户他们的收入是多少?”
常见的缓慢变化维处理方式有三种:1)直接覆盖:不记录历史数据,薪数据覆盖旧数据
2)新加一行数据(纵向扩展):使用代理主键+生效失效时间或者是代理主键+生效失效标识(保存多条记录,直接新添一条记录,同时保留原有记录,并用单独的专用字段保存)
3)新加两个字段(横向扩展):一个是previous,一个是current,每次更新只更新这两个值,但是这样职能保留最近两次的变化(添加历史列,用不同的字段保存变化痕迹,因为只保存两次变化记录,使用与变化不超过两次的维度)
4) 通过拉链表
拉链表是什么:记录数据的历史状态以及变化记录。记录一个事物从开始,一直到当前状态的所有变化的信息。拉链表可以避免按每一天存储所有记录造成的海量存储问题,同时也是处理缓慢变化数据的一种方式。
适用场景1、单张表数据量很大。2、表中的部分字段会被update更新操作,如用户联系方式,产品的描述信息,订单的状态等等。3、需要查看某一个时间点或者时间段的历史快照信息,比如,查看某一个订单在历史某一个时间点的状态, 4、变化的比例和频率不是很大,比如,总共有1000万的会员,每天新增和发生变化的有10万左右;
对于以上需求,有以下方式
方案一:每天只留最新的一份 实现简单,每天drop掉前一天的数据,重新抽一份最新全量表。优点:节省空间,一些普通的使用也很方便,不用在选择表的时候加一个时间分区什么的。缺点同样明显,没有历史变化数据,无法查看状态的变化。
方案二:每天保留一份全量的切片数据。每天一份全量的切片,而且历史数据也在。缺点:占用大量存储空间,如果每天都保留一份全量,那么每次全量中会保存很多不变的信息,对存储是极大的浪费。
方案三:使用拉链表。
在空间上做了一个取舍,虽说不像方案一那样占用量那么小,但是它只需增量记录每天变化的数据。
其次它能满足方案二所能满足的需求,既能获取最新的数据,也能添加筛选条件获取历史的数据。
开链与闭链拉链表中每条数据都有starttime列和endtime列,根据此来控制当前数据的状态并且获取历史的变化情况。
开链:拉链表在初始化完成后,或者存在更新数据,则拉链表中当前数据的starttime为最新时间,endtime为9999-12-31,表示当前数据的状态为最新状态。
闭链:拉链表中的数据如果存在更新,首先会对被更新数据进行闭链操作,然后再添加开链数据。闭链操作为将被更新的数据endtime改为当前时间,表示此条数据的历史状态被定格在endtime。以后根据end_time即可获取数据在指定日期的状态值。
设计与实现
目前数据仓库设计几乎都是基于新增策略,而不update,基于此策略设计拉链表。
1、需要一张ODS层的用户全量表。需要用它来初始化。2、获取每日的用户更新表,将更新表与全量表比对,进行开链与闭链操作,记录数据的更新状态。
而且我们要确定拉链表的时间粒度,比如说拉链表每天只取一个状态,就是说如果一天有3个状态变更,我们只取最后一个状态,这种天粒度的表其实已经能解决大部分的问题,如果有更细粒度的分析需求,根据需求指定时间粒度。
概述
事务事实表用来记录各业务过程,它保存的是各业务过程的原子操作事件,即最细粒度的操作事件。粒度是指事实表中一行数据所表达的业务细节程度。
事务型事实表可用于分析与各业务过程相关的各项统计指标,由于其保存了最细粒度的记录,可以提供最大限度的灵活性,可以支持无法预期的各种细节层次的统计需求。
设计流程
设计事务事实表时一般可遵循以下四个步骤:
选择业务过程→声明粒度→确认维度→确认事实
选择业务过程 在业务系统中,挑选我们感兴趣的业务过程,业务过程可以概括为一个个不可拆分的行为事件,例如电商交易中的下单,取消订单,付款,退单等,都是业务过程。通常情况下,一个业务过程对应一张事务型事实表。 声明粒度 业务过程确定后,需要为每个业务过程声明粒度。即精确定义每张事务型事实表的每行数据表示什么,应该尽可能选择最细粒度,以此来应各种细节程度的需求。典型的粒度声明如下:订单事实表中一行数据表示的是一个订单中的一个商品项。 确定维度 确定维度具体是指,确定与每张事务型事实表相关的维度有哪些。 确定维度时应尽量多的选择与业务过程相关的环境信息。因为维度的丰富程度就决定了维度模型能够支持的指标丰富程度。 确定事实 此处的“事实”一词,指的是每个业务过程的度量值(通常是可累加的数字类型的值,例如:次数、个数、件数、金额等)。 经过上述四个步骤,事务型事实表就基本设计完成了。第一步选择业务过程可以确定有哪些事务型事实表,第二步可以确定每张事务型事实表的每行数据是什么,第三步可以确定每张事务型事实表的维度外键,第四步可以确定每张事务型事实表的度量值字段。
概述
周期快照事实表以具有规律性的、可预见的时间间隔来记录事实,主要用于分析一些存量型(例如商品库存,账户余额)或者状态型(空气温度,行驶速度)指标。
对于商品库存、账户余额这些存量型指标,业务系统中通常就会计算并保存最新结果,所以定期同步一份全量数据到数据仓库,构建周期型快照事实表,就能轻松应对此类统计需求,而无需再对事务型事实表中大量的历史记录进行聚合了。
对于空气温度、行驶速度这些状态型指标,由于它们的值往往是连续的,我们无法捕获其变动的原子事务操作,所以无法使用事务型事实表统计此类需求。而只能定期对其进行采样,构建周期型快照事实表。
设计流程
确定粒度 周期型快照事实表的粒度可由采样周期和维度描述,故确定采样周期和维度后即可确定粒度。 采样周期通常选择每日。 维度可根据统计指标决定,例如指标为统计每个仓库中每种商品的库存,则可确定维度为仓库和商品。 确定完采样周期和维度后,即可确定该表粒度为每日-仓库-商品。 确认事实 事实也可根据统计指标决定,例如指标为统计每个仓库中每种商品的库存,则事实为商品库存。 适用场景 适用于分析存量型、状态型指标
事实类型
此处的事实类型是指度量值的类型,而非事实表的类型。事实(度量值)共分为三类,分别是可加事实,半可加事实和不可加事实。
可加事实 可加事实是指可以按照与事实表相关的所有维度进行累加,例如事务型事实表中的事实。 半可加事实 半可加事实是指只能按照与事实表相关的一部分维度进行累加,例如周期型快照事实表中的事实。以上述各仓库中各商品的库存每天快照事实表为例,这张表中的库存事实可以按照仓库或者商品维度进行累加,但是不能按照时间维度进行累加,因为将每天的库存累加起来是没有任何意义的。 不可加事实 不可加事实是指完全不具备可加性,例如比率型事实。不可加事实通常需要转化为可加事实,例如比率可转化为分子和分母。
概述
累计快照事实表是基于一个业务流程中的多个关键业务过程联合处理而构建的事实表,如交易流程中的下单、支付、发货、确认收货业务过程。用于记录当前事务的状态变化。
累积型快照事实表主要用于分析业务过程(里程碑)之间的时间间隔等需求。例如前文提到的用户下单到支付的平均时间间隔,使用累积型快照事实表进行统计,就能避免两个事务事实表的关联操作,从而变得十分简单高效。
设计流程
累积型快照事实表的设计流程同事务型事实表类似,也可采用以下四个步骤,下面重点描述与事务型事实表的不同之处。
选择业务过程→声明粒度→确认维度→确认事实
选择业务过程 选择一个业务流程中需要关联分析的多个关键业务过程,多个业务过程对应一张累积型快照事实表。 声明粒度 精确定义每行数据表示的是什么,尽量选择最小粒度。 确认维度 选择与各业务过程相关的维度,需要注意的是,每各业务过程均需要一个日期维度。 确认事实 选择各业务过程的度量值。 适用场景 适用于处理多事务关联
全量表每天的所有的最新状态的数据。1、全量表,有无变化,都要报 2、每次上报的数据都是所有的数据(变化的 + 没有变化的)
增量表新增数据,增量数据是上次导出之后的新数据。1、记录每次增加的量,而不是总量;2、增量表,只报变化量,无变化不用报 3、业务库表中需有主键及创建时间,修改时间
流水表对于表中的每一个修改都会记录,可以用于反映实际记录的变更,主要用于数据变化状态。
拉链表维护历史状态,以及最新状态数据 适用情况:
优点 1、满足反应数据的历史状态 2、最大程度节省存储
用户画像,运营平台,精准营销,推荐系统等
范式建模法主要用于关系型数据库的数据存储,主要用于业务系统,分为实体表与关系表,可以解决数据冗余,插入,修改,删除异常的问题。围绕实体表与关系表。目前OLTP业务系统中大多采用的是三范式建模法。特点:设计思路自上而下,适合上游基础数据存储,同一份数据只存储一份,没有数据冗余,方便解耦,易维护,缺点是开发周期一般比较长,维护成本高。
维度建模主要包括雪花模型、星型模型、星座模型,围绕事实表和维度表进行,利用维度建模方法建设一致维度的数据集市。通过一致性维度可以将数据集市联系在一起,由所有的数据集市组成数据仓库。特点:构建迅速,最快的看到投资回报率,敏捷灵活;
源系统同步进入数据仓库的第一层数据称为ODS层,数据漂移是ODS数据的一个顽疾。通常是指ODS表的同一个业务日期数据中包含前一天或后一天凌晨附近的数据或者丢失当天的变更数据。
由于ODS需要承接面向历史的细节数据查询需求,这就需要物理落地到数据仓库的ODS表按时间段来切分进行分区存储,通常的做法是按某些时间戳字段来切分,而实际上往往由于时间戳字段的准确性问题导致发生数据漂移。
通常,时间戳字段分为四类: 1、 数据库中数据更新时间(假设这类字段叫modifiedtime) 2、 数据库日志中的数据记录更新时间(假设这类字段叫logtime) 3、 业务过程发生时间(假设这类字段叫proctime) 4、 数据被抽取的时间(假设这类字段叫extracttime)
理论上,这几个时间应该是一致的,但是在实际生产中,这几个时间往往会出现差异,可能的原因有以下几点: 1、 由于数据抽取需要时间, extracttime往往会晚于前三个时间。2、 前台业务系统手工订正数据时未更新modifiedtime. 3、 由于网络或者系统压力问题, logtime或者modifiedtime会晚于proc_time.
通常的做法是根据其中的某一个字段来切分ODS表,这就导致产生数据漂移。下面我们来具体看下数据漂移的几种场景。1、 根据extracttime来获取数据。这种情况数据漂移的问题最明显。2、 根据modifiedtime限制。在实际生产中这种情况最常见,但是往往会发生不更新modified time而导致的数据遗漏,或者凌晨时间产生的数据记录漂移到后一天。3、 根据logtime限制。由于网络或者系统压力问题, logtime会晚于 proctime,从而导致凌晨时间产生的数据记录漂移到后一天。例如,在淘宝“双11”大促期间凌晨时间产生的数据量非常大,用户支付需要调用多个接口,从而导致logtime晚于实际的支付时间。4、 根据proctime限制。仅仅根据proctime限制,我们所获取的ODS表只是包含一个业务过程所产生的记录,会遗漏很多其他过程的变化记录,这违背了ODS和业务系统保持一致的设计原则。处理方法主要有以下两种
1、 多获取后一天的数据 在ODS每个时间分区中向前、向后多冗余一些数据,保障数据只会多不会少,而具体的数据切分让下游根据自身不同的业务场景用不同的业务时间proctime来限制。但是这种方式会有一些数据误差。2、 通过多个时间截字段限制时间来获取相对准确的数据 (1) 首先根据logtime分别冗余前一天最后15分钟的数据和后一天凌晨开始15分钟的数据,并用modifiedtime过滤非当天数据,确保数据不会因为系统问题而遗漏。(2) 然后根据logtime获取后一天15分钟的数据;针对此数据,按照主键根据logtime做升序排列去重。因为我们需要获取的是最接近当天记录变化的数据(数据库日志将保留所有变化的数据,但是落地到ODS表的是根据主键去重获取最后状态变化的数据)。(3) 最后将前两步的结果数据做全外连接,通过限制业务时间proctime来获取我们所需要的数据。
下面来看处理淘宝交易订单的数据漂移的实际案例。我们在处理“双11”交易订单时发现,有一大批在11月11日 23:59:59左右支付的交易订单漂移到了12日。主要原因是用户下单支付后系统需要调用支付宝的接口而有所延迟,从而导致这些订单最终生成的时间跨天了。即modifiedtime和logtime都晚于proctime. 如果订单只有一个支付业务过程,则可以用支付时间来限制就能获取到正确的数据。但是往往实际订单有多个业务过程:下单、支付、成功,每个业务过程都有相应的时间戳字段,并不只有支付数据会漂移。如果直接通过多获取后一天的数据,然后限制这些时间,则可以获取到相关数据,但是后一天的数据可能已经更新多次,我们直接获取到的那条记录已经是更新多次后的状态,数据的准确性存在一定的问题。因此,我们可以根据实际情况获取后一天15分钟的数据,并限制多个业务过程的时间戳字段(下单、支付、成功)都是“双11"当天的,然后对这些数据按照订单的modified time做升序排列,获取每个订单首次数据变更的那条记录。此外,我们可以根据logtime分别冗余前一天最后15分钟的数据和后一天凌晨开始15分钟的数据,并用modifietime过滤非当天数据,针对每个订单按照logtime进行降序排列,取每个订单当天最后一次数据变更的那条记录。最后将两份数据根据订单做全外连接,将漂移数据回补到当天数据中。
我觉得从框架而言,我个人认为需要几部分:
数据治理按类型分:
数据权限(安全),元数据管理(技术or业务,资产),数据质量(上下游延迟,故障快速感知和修复)
治理是很大的概念,从我经历过或做过的,可以下手的点就是质量、安全、资产
数仓是数仓,治理是治理。要明确的分开,凡涉及到口径、数据源、ETL processing的,应该算数仓方法论或数仓规范或落地平台化的方式方法
数据集市就像超市摆放物品,正如其名字“集市”一样,是一个面向最终用户(顾客)的数据市场,在这里,数据(物品)以一种更加容易被业务人员(顾客)接受的方式组合在一起,这些组合方式可能是多变, 因为业务人员(顾客)的需求是多变的,因此我们需要定期调整集市的计算口径(物品的组合方式),经常会创建新的数据集市(新的物品组合)。
数据中台是通过数据技术,对海量数据进行采集、计算、存储、加工,同时统一标准和口径。数据中台把数据统一之后,会形成标准数据,再进行存储,形成大数据资产层,进而为客户提供高效服务。这些服务和企业的业务有较强关联性,是企业所独有且能复用的,他是企业业务和数据的积淀,其不仅能降低重复建设,减少烟囱式协助的成本,也是差异化竞争的优势所在。数据中台是通过整合公司开发工具、打通全域数据、让数据持续为业务赋能,实现数据平台化、数据服务化和数据价值化。数据中台更加侧重于“复用”和“业务”。
据仓库就相当于一个贮存数据的仓库,在这里,数据按照特定的模型组织起来,这种模型对数据管理员来说相对友好,因为它按照一种更加集约化的规则将数据管理起来了,存放集中、规整,提取数据不用跨库寻找,查找的效率更加高。
所以,数据湖是存储了企业所有原始数据的存储,同时原始数据对数据管理能力依赖性很强,(不同原材料组合,厨师会做出不同口味的饭菜),此外,加工后数据的存储也很复杂(做好的饭菜如果没有保存好,会坏掉)。
范式建模法主要用于关系型数据库的数据存储,主要用于业务系统,分为实体表与关系表,可以解决数据冗余,插入,修改,删除异常的问题。目前OLTP业务系统中大多采用的是三范式建模法。
数仓数据不一致会导致数据重复计算,数据孤岛,并对使用人员产生误解。
数据一致性可以避免重复建设和指标冗余建设,从而保障数据口径的规范和统一,最终实现数据资产全链路关联,提供标准数据输出以及建立统一的数据公共层。
主要通过构建一致性维度和一致性事实。通过制定数仓规范可以保障。
主题域通常是联系较为机密的数据主题的集合,可以根据业务关注度,将这些数据主题划分到不同的主题域(也就是说对某个主题进行分析后确定的主题的边界)。关于主题域的划分,可以考虑几方面:
总而言之,切入的出发点逻辑不一样,就可以存在不同的划分逻辑。在建设过程中可采用迭代方式,不纠结于一次完成所有主题的抽象,可先从明确定义的主题开始,后续逐步总结成自身的标准模型。
1、表结构变动应提前沟通,确定上下游影响范围后进行统一调整变更。2、抽取时避免采用select * 全表抽取,抽取粒度应该精确到字段层面。3、对业务数据库表进行变更监控,根据表信息模板与现表结构进行校验,监控到结构变动后立即通知或告警。
构建数据仓库有两种方式:自上而下、自下而上
自上而下指的是数据源出发,一个企业建立唯一的数据中心,数据是经过整合、清洗、去掉脏数据、标准的、能够提供统一的视图。要从整个企业的环境入手,建立数据仓库,要做很全面的设计。偏数据驱动
自下而上指的是从业务需求出发,认为数据仓库应该按照实际的应用需求,加载需要的数据,不需要的数据不要加载到数据仓库中。这种方式建设周期短,用户能很快看到结果。偏业务驱动
数仓建模需要按照一定的数据模型,对整个企业的数据进行采集,整理,提供跨部门、完全一致的报表数据。
合适的数据模型,对于大数据处理来讲,可以获得得更好的性能、成本、效率和质量。良好的模型可以帮助我们快速查询数据,减少不必要的数据冗余,提高用户的使用效率。
数据建模进行全方面的业务梳理,改进业务流程,消灭信息孤岛,更好的推进数仓系统的建设。
维度建模的数据仓库中,有一个概念叫Bus Architecture,中文一般翻译为“总线架构”。总线架构是Kimball的多维体系结构(MD)中的三个关键性概念之一,另两个是一致性维度(Conformed Dimension)和一致性事实(Conformed Fact)。
在多维体系结构(MD) 的数据仓库架构中,主导思想是分步建立数据仓库,由数据集市组合成企业的数据仓库。但是,在建立第一个数据集市前,架构师首先要做的就是设计出在整个企业内具有统一解释的标准化的维度和事实,即一致性维度和一致性事实。而开发团队必须严格的按照这个体系结构来进行数据集市的迭代开发。
一致性维度就好比企业范围内的一组总线,不同数据集市的事实的就好比插在这组总线上的元件。这也是称之为总线架构的原因。
实际设计过程中,我们通常把总线架构列表成矩阵的形式,其中列为一致性维度,行为不同的业务处理过程,即事实,在交叉点上打上标记表示该业务处理过程与该维度相关。这个矩阵也称为总线矩阵(Bus Matrix)。
总线架构和一致性维度、一致性事实共同组成了Kimball的多维体系结构的基础,也建立了一套可以逐步建立数据仓库的方法论。由于总线架构是多维体系结构的核心,所以我们有时就把多维体系结构直接称为总线架构。
一致性维度是Kimball的多维体系结构中的三个关键性概念之一,另两个是总线架构(Bus Architecture)和一致性事实(Conformed Fact)。
在多维体系结构中,没有物理上的数据仓库,数据仓库是由物理上的数据集市组合成,是一个逻辑概念。数据集市的建立是可以逐步完成的,多个数据集市组合在一起,成为一个数据仓库。那么如果分步建立数据集市的过程出现了问题,数据集市就会变成孤立的集市,不能组合到整个数据仓库中,而一致性维度的提出正式为了解决这个问题。
一致性维度的范围是总线架构中的维度,即在多个数据集市中都存在的维度,这个范围的选取需要数据架构师来决定。一致性维度的内容和普通维度并没有本质上区别,都是经过数据清洗和整合后的结果。
维度保持一致后,事实表就可以保存在各个数据集市中。虽然在物理上是独立的,但在逻辑上由一致性维度使所有的数据集市是联系在一起,随时可以进行交叉数据探索等操作,同时也就组成了数据仓库。
在建立多个数据集市时,完成一致性维度的工作就已经完成了一致性的80%-90%的工作量。余下的工作就是建立一致性事实。一致性事实和一致性维度有些不同,一致性维度是由专人维护在后台(Back Room),发生修改时同步复制到每个数据集市,而事实表一般不会在多个数据集市间复制。需要查询多个数据集市中的事实时,一般通过交叉探查(drill across)来实现。为了能在多个数据集市间进行交叉探查,一致性事实主要需要保证两点:第一个是KPI的定义及计算方法要一致,第二个是事实的单位要一致性。如果业务要求或事实上就不能保持一致的话,建议不同单位的事实分开建立字段保存。这样,一致性维度将多个数据集市结合在一起,一致性事实保证不同数据集市间的事实数据可以交叉探查,一个分布式的数据仓库就建成了。
Inmon理论,自上而下,数据驱动(1)自上而下按照主题建立数据仓库,如按照客户、供应商、产品等建立不同的主题。开发过程中每次增加一个主题;(2)当建立的数据集市是跨多个主题的,需要以整合好的主题数据为基础。
Kimball理论,自下而上,业务驱动。(1)自下而上,维度建模;(2)先按照业务主线建立最小粒度的事实表,再建立维度表,形成数据集市,通过“一致维度”能够共同看到不同数据集市的信息;
概念模型设计 , 逻辑模型设计 , 物理模型设计 是数据库及数据仓库模型设计的三个主要步骤
1.该系统的商业目的是什么 , 要解决何种业务场景
2.该业务场景中 , 有哪些人或组织参与 , 角色分别是什么
3.该业务场景中 , 有哪些物件参与 ,
4.此外需要具备相关行业经验 , 如核心业务流程 , 组织架构 , 行业术语
1.分多少个主题 , 每个主题包含的实体
2.每个实体的属性都有什么
3.各个实体之间的关系是什么
4.各个实体间是否有关系约束
1.类型与长度的定义
2.字段的其他详细定义 , 非空 , 默认值
3.却准详细的定义 , 枚举类型字段 , 各枚举值具体含义
4.约束的定义 , 主键 , 外键
数据集成和数据质量 企业的数据通常存储在多个异构数据库中,要进行分析,必须对数据进行一致性整合,整合后才能对数据进行分析挖掘出潜在的价值;数据质量必须有保障,数据质量不过关,业务方无法高效的使用数据。
优点提高查询性能、快速响应、方便使用、降低使用成本 缺点1、由于把不同的内容都放在同一张表存储,宽表已经不符合三范式的模型设计规范,随之带来的主要坏处就是数据的大量冗余 2、灵活性差,就比如说线上业务表结构变更,宽表模式改造量也比较大 3、开发宽表为了避免宽表重复迭代,我们应该去了解业务全流程,得需要知道需扩展哪些维度,沉淀哪些指标,这样就流程会比较长,不适合快速迭代。