文章目录
- 一、基本概念
- 二、数据库设计三范式
- 三、维度建模
-
- 1、维度建模中的表类型
-
- [1.1 事实表](#1.1 事实表)
- [1.2 维度表](#1.2 维度表)
- 2、维度模型分类
-
- [2.1 星型模型](#2.1 星型模型)
- [2.2 雪花模型](#2.2 雪花模型)
- 3、宽表与维度模型的选择
-
- [3.1 宽表](#3.1 宽表)
- [3.2 维度模型](#3.2 维度模型)
- [3.3 选择建议](#3.3 选择建议)
- 四、数仓架构与建模选择
- 五、数仓中的数据分层
-
- [1. 原始数据层(ODS, Operational Data Store)](#1. 原始数据层(ODS, Operational Data Store))
- [2. 明细数据层(DWD, Data Warehouse Detail)](#2. 明细数据层(DWD, Data Warehouse Detail))
- [3. 汇总数据层(DWS, Data Warehouse Summary)](#3. 汇总数据层(DWS, Data Warehouse Summary))
- [4. 公共维度层(DIM, Dimension)](#4. 公共维度层(DIM, Dimension))
- [5. 数据应用层(ADS, Application Data Store)](#5. 数据应用层(ADS, Application Data Store))
- 六、数仓建模关键步骤
一、基本概念
1、数据仓库基本概念
数据仓库是一个面向主题、集成的、非易失的且随时间变化的数据集合。它主要用于组织、积累历史数据,并使用分析方法(如OLAP、数据分析)进行分析整理,以辅助决策,为管理者、企业系统提供数据支持、构建商业智能。
数据仓库的特点包括面向主题性、集成性、非易失性和时变性。
- 面向主题性意味着数据仓库是根据业务分析的主题来组织数据的;
- 集成性则是指数据仓库中的数据来自不同的数据源,需要经过抽取、清洗、转换等过程进行整合;
- 非易失性表明数据仓库保存的是一系列的历史快照,不允许修改,只能通过工具进行查询和分析;
- 时变性则体现在数据仓库会定期接收和集成新的数据,以反映数据的最新变化。
2、数仓建模的目标
数仓建模的目标是在性能、成本、效率和数据质量之间找到最佳平衡点。具体来说,建模应达到以下效果:
- 访问性能:能够快速查询所需的数据,减少数据I/O
- 数据成本:减少不必要的数据冗余,实现计算结果数据复用,降低存储成本和计算成本
- 使用效率:改善用户应用体验,提高使用数据的效率
- 数据质量:改善数据统计口径的不一致性,减少数据计算错误的可能性,提供高质量的、一致的数据访问平台
3、数仓建模方法
-
关系模型(ER建模):从全企业的高度设计一个3NF(第三范式)模型的方法。它用实体加关系描述的数据模型来描述企业业务架构,在范式理论上符合3NF。这种方法是站在企业角度进行面向主题的抽象,而不是针对某个具体业务流程。
-
维度模型:以维度建模为基础,根据业务域和数据域设计主题模型,构建一致性的维度和事实。维度模型包括星形模型和雪花模型。
- 星形模型:是一种多维的数据关系,它由一个事实表和一组维表组成。事实表的非主键属性称为事实,它们一般都是数值或其他可以进行计算的数据。星型架构是一种非正规化的结构,多维数据集的每一个维度都直接与事实表相连接,所以数据有一定的冗余。
- 雪花模型:当有一个或多个维表没有直接连接到事实表上,而是通过其他维表连接到事实表上时,其图解就像多个雪花连接在一起,故称雪花模型。
二、数据库设计三范式
1、什么是三范式
数据库的设计三范式(Normalization)是关系型数据库设计的一种标准化过程,其主要目的是消除冗余数据,提高数据存储的效率和数据查询的性能。
第一范式(1NF)
- 第一范式要求数据库表中的每个字段都是原子性的,即不可再分。这意味着每个字段中不能包含多个值或重复的值。
- 如果一个字段包含多个值,应该将其拆分为多个独立的字段。比如,如果有一个字段同时存储了多个课程的名称,那么为了满足第一范式,应该将这个字段拆分为多个课程字段,或者将课程信息单独存储在一个课程表中,并通过关系进行连接。
- 第一范式有助于消除数据的重复和冗余,提高数据的一致性和查询效率。
第二范式(2NF)
- 第二范式要求在满足第一范式的前提下,表中的非主键字段必须完全依赖于主键。换句话说,非主键字段必须与主键直接相关,而不是与其他非主键字段相关。
- 如果存在部分依赖关系,即某些字段只依赖于主键的一部分(在联合主键的情况下),就需要将这些字段拆分到另一个表中。这样可以确保每个表都只包含与主键直接相关的数据,进一步减少数据冗余和提高数据一致性。
- 例如,在一个订单表中,如果订单号和客户号组成联合主键,而客户信息(如客户名称、地址等)只依赖于客户号,不依赖于订单号,那么为了满足第二范式,应该将客户信息单独存储在一个客户表中,并通过客户号与订单表建立关联。
第三范式(3NF)
- 第三范式要求在满足第二范式的前提下,表中的非主键字段之间不能存在传递依赖关系。传递依赖是指一个非主键字段依赖于另一个非主键字段。
- 如果存在传递依赖关系,就需要将这些字段拆分到另一个表中以消除冗余和数据不一致性。这样可以使数据库结构更加简洁明了,并进一步提高数据查询和更新的效率。
- 例如在一个员工表格中包括员工号、姓名、部门号和部门名称等字段时如果按照三范式进行设计则应该将部门名称字段剥离出员工表格建立一个部门表格并通过部门号建立员工表格和部门表格之间的关联关系。
数据库的三范式是一种设计规范用于规范化关系型数据库中的数据结构以提高数据的一致性和减少数据冗余。通过遵循三范式可以有效地设计和组织数据库使数据库结构更加合理灵活和易于维护。但请注意过度追求范式化可能会导致性能问题因此在实际应用中需要根据具体情况进行权衡和优化。
2、三范式和数仓建模的关系
三范式和数仓建模之间有着紧密的关系。以下是它们之间联系的详细解释:
-
基础原理相通:
- 三范式是关系型数据库设计的一种标准化过程,旨在消除数据冗余,提高数据存储和查询的效率。
- 数仓建模也是为了构建一个结构合理、高效查询的数据仓库,以便更好地支持决策和业务发展。
-
应用领域的差异与联系:
- 三范式主要应用于传统的关系型数据库设计,强调数据的规范化和减少冗余。
- 数仓建模则更多应用于数据仓库系统,它可能包含维度建模等方法,更注重数据的分析和查询性能。
-
相互影响:
- 在构建数仓时,可以借鉴三范式的思想来优化数据结构,减少数据冗余,提高查询效率。
- 同时,数仓建模中的某些方法(如维度建模)可能允许一定的数据冗余,以换取查询性能的提升,这与三范式的严格规范化有所不同,但二者并不矛盾,而是根据实际需求进行权衡和选择。
-
实践中的应用:
- 在实际的数据仓库项目中,通常会根据业务需求和数据特点来选择合适的建模方法。对于需要严格遵守数据一致性和减少冗余的场景,三范式是一个很好的选择。
- 而在需要快速响应复杂查询、报表和分析的场景中,维度建模可能更为合适。
三范式和数仓建模在原理和目标上有一定的相通之处,都是为了更好地管理和利用数据。但在具体实践和应用中,它们又各有侧重和适用场景。因此,在设计和构建数据仓库时,需要根据实际情况和需求来选择合适的建模方法。
三、维度建模
1、维度建模中的表类型
维度建模中的表类型主要分为两种:事实表和维度表。
1.1 事实表
事实表是维度建模的核心,它记录了业务过程的具体事实,通常包含业务的度量值。以下是关于事实表的一些关键点:
-
定义与特点:
- 事实表存储着业务过程的事实数据,如销售额、订单数量等。
- 事实表的记录是动态增长的,随着业务的发生而不断增加。
-
类型:
- 事务事实表:记录每次事务的具体信息,如销售订单、网站访问等。这类事实表的数据一旦产生就不会再变化。
- 周期快照事实表:记录某个业务过程在特定周期(如每天、每周)的状态或度量值。
- 累积快照事实表:记录业务过程从开始到当前状态的所有累积信息,如客户的累积购买额。
-
结构:
- 事实表通常包含多个维度表的外键,用于与维度表关联。
- 事实表中的度量值通常是数值类型,可以进行加、减、平均等聚合运算。
举例:
假设我们有一个电商数据仓库,其中的一个事实表可以是"销售事实表"。
- 销售事实表 :记录了每次销售的详细信息。
- 销售ID (唯一标识每次销售)
- 产品ID (外键,关联到产品维度表)
- 客户ID (外键,关联到客户维度表)
- 销售日期 (外键,可以关联到时间维度表,也可以直接在事实表中存储具体日期)
- 销售金额 (数值数据,表示该次销售的总额)
- 销售数量 (数值数据,表示该次销售的产品数量)
1.2 维度表
维度表是维度建模中描述业务环境、产品、客户等文本信息的表。以下是关于维度表的一些关键点:
-
定义与特点:
- 维度表包含描述业务过程的文本属性,如产品名称、客户姓名、地理位置等。
- 维度表的记录相对稳定,不会频繁变动。
-
作用:
- 维度表为事实表提供上下文信息,帮助用户更好地理解事实数据。
- 在查询过程中,维度表可以起到筛选和组织数据的作用。
-
结构:
- 维度表通常包含一个主键列,作为与之关联的事实表的外键。
- 维度表的行描述应与事实表的行完全对应。
举例:
继续上述电商数据仓库的例子,我们可以有以下几个维度表:
- 产品维度表 :描述了每个产品的详细信息。
- 产品ID (主键)
- 产品名称 (文本数据)
- 产品类别 (文本数据)
- 产品价格 (虽然这是数值数据,但它属于产品的固有属性,因此放在维度表中)
- 客户维度表 :描述了每个客户的详细信息。
- 客户ID (主键)
- 客户姓名 (文本数据)
- 客户地址 (文本数据)
- 客户类别 (如普通客户、VIP等)
- 时间维度表 :描述了时间的详细信息,虽然时间可以直接作为事实表的一个字段,但单独建立时间维度表可以提供更灵活的时间分析。
- 日期 (主键,可以是具体的年月日)
- 周 (文本数据,表示该日期是周几)
- 月 (文本数据)
- 季度 (文本数据)
- 年 (文本数据)
总的来说,在维度建模中,事实表和维度表是相互关联、相辅相成的。事实表记录业务过程的度量值,而维度表提供这些度量值的上下文信息。通过这种结构,维度建模能够高效地支持复杂的数据分析和报表生成需求。
在实践中,数据仓库的建模过程通常包括抽象出主体、梳理主体之间的关系、梳理主体的属性以及画出E-R关系图等步骤。这些步骤有助于更好地理解业务需求和数据结构,从而构建一个有效的数据仓库模型。
在选择建模方法时,需要考虑具体的业务场景和需求。例如,对于需要快速响应和灵活调整的分析需求,维度模型可能更为适合;而对于需要严格遵循数据规范化和避免数据冗余的场景,关系模型可能更为合适。
2、维度模型分类
维度模型包括星形模型和雪花模型。
2.1 星型模型
-
定义与结构:
- 星型模型是多维的数据关系,由事实表(Fact Table)和维表(Dimension Table)组成。
- 每个维表中都会有一个维作为主键,所有这些维的主键结合成事实表的主键。
- 事实表的非主键属性称为事实,它们一般都是数值或其他可以进行计算的数据。
-
特点:
- 星型架构是一种非正规化的结构,多维数据集的每一个维度都直接与事实表相连,不存在渐变维度,所以数据有一定冗余。
- 因为数据冗余,所以很多统计不需要做外部的关联查询,因此一般情况下效率比雪花模型高。
-
应用:
- 星型模型被广泛用于数据仓库和OLAP(联机分析处理)系统中,以支持复杂的数据分析操作。
2.2 雪花模型
-
定义与结构:
- 当有一个或多个维表没有直接连接到事实表上,而是通过其他维表连接到事实表上时,整个图解就像多个雪花连接在一起,故称雪花模型。
- 雪花模型是对星型模型的扩展,它对星型模型的维表进行了进一步的规范化。
-
特点:
- 雪花模型通过减少数据冗余来提高数据的一致性。
- 由于对数据进行了更多的规范化处理,因此可能需要进行更多的连接操作来完成某些查询,这可能导致查询性能下降。
-
与星型模型的比较:
- 雪花模型相对于星型模型更加规范化,减少了数据冗余,但可能牺牲了查询性能。
- 星型模型更适合于简单的查询和快速的聚合操作,而雪花模型在处理更复杂的业务逻辑和关系时可能更为灵活。
-
应用:
- 雪花模型适用于那些需要高度规范化的场景,以及对数据存储效率有较高要求的系统。
综上所述,星型模型和雪花模型在数据仓库设计中各有优势。星型模型以其简单性和高效的查询性能而受到青睐,而雪花模型则通过更高的数据规范化程度提供了更灵活的数据表示能力。在选择使用哪种模型时,需要根据具体的应用场景和需求进行权衡。
3、宽表与维度模型的选择
宽表是一种字段比较多的表,通常是指业务主题相关的指标、维度、属性关联在一起的表。宽表的使用有一定的便利性,但也可能导致表结构频繁发生变动。在数仓层(DW),建议选择采用标准的维度建模方式------星型模型,而宽表则可以在某些场景下结合使用。
在数据仓库设计中,宽表和维度模型是两种常见的数据结构。它们各有优缺点,选择哪种结构取决于具体的业务需求和场景。以下是对宽表和维度模型的比较和选择建议:
3.1 宽表
-
优点:
- 查询性能高:由于所有相关数据都存储在一张表中,因此查询时无需进行多表关联,提高了查询效率。
- 结构简单:宽表将所有字段聚集在一起,结构相对简单明了。
- 便于快速分析:对于需要快速查看和分析多个字段的情况,宽表可以提供便利。
-
缺点:
- 数据冗余:由于所有字段都存储在同一张表中,可能会导致大量数据冗余。
- 可扩展性差:当需要增加新的字段或修改现有字段时,可能需要修改整个表结构,影响系统的稳定性和可扩展性。
- 维护困难:随着字段数量的增加,宽表的维护难度也会逐渐加大。
3.2 维度模型
-
优点:
- 数据规范化:维度模型通过事实表和维度表的关联,实现了数据的规范化存储,减少了数据冗余。
- 可扩展性强:当需要增加新的维度或度量时,可以方便地添加新的维度表或事实表,而不影响现有系统的稳定性。
- 易于理解:维度模型更符合人类的思维方式,通过维度和度量的组合,可以直观地反映业务情况。
-
缺点:
- 查询性能可能较低:由于数据分散在多个表中,查询时可能需要进行多表关联,影响查询效率。但是,通过合理的索引和优化手段,可以一定程度上提升查询性能。
- 设计复杂度较高:需要设计多个表,并考虑表之间的关系和关联方式,设计复杂度相对较高。
3.3 选择建议
- 如果业务场景需要频繁地进行多字段的查询和分析,且对查询性能有较高要求,可以考虑使用宽表结构。
- 如果业务场景更注重数据的规范化和可扩展性,且能够接受一定的查询性能损失(可以通过优化手段进行弥补),则建议使用维度模型。
- 在实际项目中,也可以考虑将宽表和维度模型结合使用。例如,在数据仓库的底层使用维度模型进行数据存储和规范化处理,而在上层根据具体业务需求构建宽表,以满足特定的查询和分析需求。这种混合使用的方式可以兼顾数据的规范性和查询性能。
四、数仓架构与建模选择
Kimball架构和Inmon架构是数据仓库设计的两大主流方法论。Kimball架构注重数据的快速展现和业务分析,强调建立多个数据集市;而Inmon架构则更注重数据的整合和一致性,倾向于建立一个集中的数据仓库。这两种架构各有优劣,选择哪种架构取决于企业的具体需求和业务场景。
- Kimball架构:采用自底向上的开发方法,即从数据集市到数据仓库再到数据源。这种架构以需求为导向,通常使用星型模型进行维度建模。
- Inmon架构:采用自顶向下的开发方法,即从数据源到数据仓库再到数据集市。这种架构更强调数据的清洗工作,从中抽取实体-关系,模型偏向于3NF。
1、Kimball架构
Kimball架构是一种基于维度建模的数据仓库架构,它以业务过程为中心,强调快速交付和敏捷迭代。
Kimball架构是在20世纪90年代中期由Ralph Kimball等人提出的,具体是在数据集市概念兴起之时,大约在1994~1996年之间。这一时期标志着从企业数据集成时代向更加灵活和分散的数据集市时代的转变。
-
核心思想:
- 自下而上的开发方法,即从数据集市到数据仓库再到数据源的一种敏捷开发方法。
- 强调以业务过程为建模驱动,通过维度建模来实现数据的组织和管理。
-
数据组织:
- Kimball架构将数据分为事实表和维度表。事实表存储业务过程的具体数据,如销售额、成本等度量值;维度表存储与业务过程相关的属性信息,如时间、地点、客户等。
- 事实表和维度表通过关联键连接在一起,形成星型模型或雪花模型,以支持快速的数据查询和分析。
-
特点:
- 简单易用:通过直观的维度和事实表结构,使得数据仓库更易于理解和使用。
- 扩展性强:能够方便地增加新的维度和事实表,以适应业务变化。
- 支持OLAP分析:适合进行多维度的数据分析,满足复杂的数据查询需求。
-
应用场景:
- Kimball架构被广泛应用于需要快速响应业务变化和数据分析需求的场景,如零售、金融、物流等行业。
2、Inmon架构
Inmon架构是一种更为传统和严谨的数据仓库架构,强调数据的一致性和准确性。
Inmon架构的理念最早由Bill Inmon在其1991年的著作《Building the Data Warehouse》中提出。这本书为数据仓库领域奠定了基础,并定义了数据仓库的基本概念和特性。因此,Inmon架构的提出时间可以追溯到1991年。
-
核心思想:
- 自上而下的开发方法,即先构建一个中心数据仓库,再根据业务需求从中抽取出数据集市。
- 强调数据的整合和一致性,确保数据仓库中的数据是准确、可靠和全面的。
-
数据组织:
- Inmon架构将数据仓库中的数据组织成一个中心目录,包含所有数据源中的数据,并映射到预定义的主题或业务过程。
- 数据在进入数据仓库之前需要经过严格的ETL(抽取、转换、加载)过程,以确保数据的质量和一致性。
-
特点:
- 数据一致性和准确性高:通过严格的ETL过程和中心数据仓库的设计,确保数据的准确性和一致性。
- 适合大型企业:能够满足大型企业对数据整合和一致性的高要求。
-
应用场景:
- Inmon架构适用于对数据质量和一致性有严格要求的大型企业或组织,如金融、电信等行业。
综上所述,Kimball架构和Inmon架构在数据仓库的建设方法、数据组织、特点和应用场景等方面存在差异。Kimball架构注重敏捷开发和业务过程的维度建模,适合快速响应业务需求;而Inmon架构则强调数据的一致性和准确性,适合对数据质量有严格要求的大型企业。
五、数仓中的数据分层
数仓中的数据分层是为了更好地组织、管理和利用数据。
1. 原始数据层(ODS, Operational Data Store)
- 定义与作用:原始数据层是数据仓库中最接近数据源的一层,存放原始数据。数据源中的数据经过抽取、清洗和传输(ETL过程)后装入本层。
- 数据特性:ODS层的数据通常与源系统数据保持同构,数据粒度最细,以便简化后续数据处理工作。
- 用途:主要目的是为后续数据处理提供原始、未经修改的数据。
2. 明细数据层(DWD, Data Warehouse Detail)
- 定义与作用:明细数据层是对ODS层数据进行清洗、维度退化等操作后的数据存储层。
- 数据特性:DWD层保持和ODS层一样的数据粒度,但数据质量更高,提供更干净、一致的数据视图。
- 用途:为数据分析和数据挖掘提供明细数据支持。
3. 汇总数据层(DWS, Data Warehouse Summary)
- 定义与作用:汇总数据层是基于DWD层的数据,按照一定业务主题进行汇总的数据层。
- 数据特性:DWS层的数据粒度较DWD层更粗,通常是针对某个业务主题进行汇总后的数据。
- 用途:提供复用性高的公共指标,减少重复加工,并降低公共数据计算的口径和算法不统一的风险。
4. 公共维度层(DIM, Dimension)
- 定义与作用:公共维度层是整个数据仓库的维度数据存储层,包含各种业务过程的统一维度定义。
- 数据特性:DIM层建立整个企业的一致性维度,降低数据计算口径和算法不统一的风险。
- 用途:为数据分析提供统一的维度视图,支持多维度的数据分析和查询。
5. 数据应用层(ADS, Application Data Store)
- 定义与作用:数据应用层是面向具体业务应用的数据存储层,通常是根据业务需求定制的数据集市或报表数据。
- 数据特性:ADS层的数据通常是针对特定业务需求进行加工和汇总后的数据。
- 用途:直接支持业务决策、报表展示等应用场景。
综上所述,数仓中的数据分层有助于将数据从原始状态逐步加工、汇总和应用,以满足不同业务需求和分析场景。每个层次都有其特定的数据特性和用途,共同构成了一个完整、高效的数据仓库体系。
六、数仓建模关键步骤
数仓建模的关键步骤可以分为以下几点:
-
需求分析,确立主题:
- 确定数仓建设的目标和需求,明确业务问题和需要分析的数据。
- 通过与业务方沟通,梳理业务流程,理解业务的核心环节和关键动作。
-
技术选型与架构规划:
- 根据需求选择合适的技术栈,如数据库系统、数据处理工具等。
- 规划数仓的整体架构,包括数据源层、数据接入层、数据存储层、数据处理层和数据应用层等。
-
数据建模:
- 确定量度:明确统计的指标,即需要度量和分析的数据项。
- 确认粒度:选择数据的细化程度,通常遵循最小粒度原则,以满足各种分析需求。
- 确认维度:确定分析的各个角度,如时间、地理、产品类别等,并确认维度的层次和级别。
- 构建维度模型,如星型模型或雪花模型,以及确定事实表和维度表的关系。
-
ETL过程设计(Extract, Transform, Load):
- 数据抽取(E):从原始数据源中提取所需数据。
- 数据清洗与转换(T):对数据进行清洗、去重、错误值处理、缺失值填充等转换操作,以确保数据质量和一致性。
- 数据加载(L):将清洗转换后的数据加载到目标数据仓库中。
-
数仓分层设计:
- 通常数仓会分为多个层次,如ODS(原始数据层)、DWD(明细数据层)、DIM(维度层)、DWS(服务数据层)等。
- 每个层次有其特定的数据处理逻辑和数据存储方式,以实现数据的逐层解耦和复用。
-
模型优化与验证:
- 对建立的数仓模型进行优化,以提高查询性能和数据分析效率。
- 通过实际数据和业务场景对模型进行验证,确保模型的准确性和可靠性。
-
数据应用与可视化:
- 根据业务需求,开发数据报表、仪表盘等可视化工具,以便业务人员和决策者能够直观地了解和分析数据。
- 提供数据接口和查询服务,支持其他业务系统和应用的数据需求。
数仓建模是一个系统性工程,需要综合考虑业务需求、技术选型、数据处理流程、模型设计等多个方面。