# 数据仓库
> 名词解析：
> - **暂存区**（Staging area）— 我们在 DWH的同一数据库/机器上的原始/源数据的副本
> - **转换区**（Transformation area — 转换之后的暂存数据。准备加载到 DWH。
> - **事实表**（Fact table） — 基于度量或基于事件的数据。比如销售信息、仓库产品的变动。
> - **维度表**（Dimension table）– 一个特定事物的所有信息。如所有与产品相关的信息、客户信息。
> - **退化维度**（DegenerateDimension）- 在维度类型中，有一种重要的维度称作为退化维度，亦维度退化一说。指的是直接把一些简单的维度放在事实表中。退化维度是维度建模领域中的一个非常重要的概念，退化维度一般在分析中可以用来做分组使用。
> - **缓慢变化维**（Slowly Changing Dimensions）- 维度的属性并不是始终不变的，它会随着时间的流逝发生缓慢的变化，这种随时间发生变化的维度我们一般称之为缓慢变化维（SCD）。比如企业表中的股东列表维度，股东信息会随着时间而变化。

## 1. 数据建模
> 💡 数据建模，如同设计模式，需要**找出静态和动态的部分，并将之分离，避免动态变化影响静态数据**。

适当的模型和存储环境为大数据提供了以下好处：
``
- 访问性能：快速查询所需数据并降低I/O吞吐量。
- 数据成本：显著减少不必要的数据冗余，重用计算结果，降低大数据系统的存储和计算成本。
- 使用效率：改善用户体验，提高数据利用率。
- 数据质量：数据统计更加一致，减少了计算错误的可能性。

> 例如我们现在统计或导出时，无索引的扫库行为。

### 1.1 模型方法论
- OLTP系统面向的主要数据操作是随机读写，主要采用满足3NF的实体关系模型存储数据，从而在事务处理中解决数据的冗余和一致性问题
- OLAP系统面向的主要数据操作是批量读写，事务处理中的一致性不是OLAP所关注的，其主要关注数据的整合，以及在一次性的复杂大数据查询和处理中的性能，因此它需要采用一些不同的数据建模方法。

> 探迹大数据属于 OLAP 系统模式，所以日常建模应向 OLAP 模式方向靠拢。
### 1.2 数仓建模模型
- 范式建模
  - 3NF
- 维度建模
  - 星形建模
  - 雪花建模
  - 星座模型
- Data Vault 建模
  - hub - 中心表
  - Link - 链接表
  - Satellite - 卫星表
- Anchor 建模

> 维度建模从分析决策的需求出发构建模型，为分析需求服务，因此它重点关注用户如何更快速地完成需求分析，同时具有较好的大规模复杂查询的响应性能。
其典型的代表是**星形模型**，以及在一些特殊场景下使用的**雪花模型**。

### 1.3 维度建模
#### 1.3.1 星形模型
由一**个事实表**及**多个**非正规化描述的**维度表**组成。
维度表之间是没有关联的，维度表是直接关联到事实表上的，**只有当维度表极大，存储空间是个问题时，才考虑雪花型维度**，简而言之，最好就用星型维度即可

![星形模型](../img/data-thinking/img.png)

**优点**：

1）如果我们想对某些维度进行过滤时，速度会更快（不需要多个`join`）
2）建模简单（无需标准化)

**缺点**：

我们需要更多空间来存储事实表中的所有维度`foreign keys`。
为事实表添加维度键更费力（如果文件很大，更新将需要更多时间）

#### 1.3.2 雪花模型
星形模式中的维表相对雪花模式来说要大，而且不满足规范化设计。雪花模型相当于将星形模式的大维表拆分成小维表，满足了规范化设计。然而这种模式在实际应用中很少见，因为这样做会导致开发难度增大，而数据冗余问题在数据仓库里并不严重。

这种模型维护成本高，性能方面也较差，尤其是基于hadoop体系构建数仓，减少`join`就是减少`shuffle`，性能差距会很大。

![雪花模型](../img/data-thinking/img_1.png)

#### 1.3.3 星座模型
星座模型，是对星型模型的扩展延伸，多张事实表共享维度表。数仓模型建设后期，大部分维度建模都是星座模型。

### 1.4 Data Vault建模
Data Vault 是在ER模型的基础上衍生而来，模型设计的初衷是有效的组织基础数据层，使之易扩展、灵活的应对业务的变化，同时强调**历史性**、**可追溯性**和**原子性**，不要求对数据进行过度的一致性处理。同时设计的出发点也是为了实现数据的整合，并非为数据决策分析直接使用。

Data Vault 模型是一种中心辐射式模型，其设计重点围绕着业务键的集成模式。这些业务键是存储在多个系统中的、针对各种信息的键，用于定位和唯一标识记录或数据

Data Vault 每个字段都会记录对应的来源以及更新实践。

Data Vault模型包含三种基本结构：

- **中心表-Hub** ：唯一业务键的列表，唯一标识企业实际业务，企业的业务主体集合

- **链接表-Link**： 表示中心表之间的关系，通过链接表串联整个企业的业务关联关系

- **卫星表- Satellite**： 历史的描述性数据，数据仓库中数据的真正载体

#### 1.4.1 中心表-Hub

![中心表-Hub](../img/data-thinking/img_2.png)

#### 1.4.2 链接表-Link

![链接表-Link](../img/data-thinking/img_3.png)

#### 1.4.3 卫星表- Satellite

![卫星表](../img/data-thinking/img_4.png)

#### 1.4.4 Data Vault模型建模流程
1. 梳理所有主要实体

2. 将只有入边的实体定义为中心表-Hub

3. 将没有入边切仅有一个出边的表定义为卫星表-Satellite

4. 将没有入边且有两条或以上出边的表定义为连接表-Link

![Data Vault模型建模](../img/data-thinking/img_5.png)

Data Vault是对ER模型更近一步的规范化，由于对数据的拆解和更偏向于基础数据组织，在处理分析类场景时相对复杂， 适合数仓低层构建，目前实际应用场景较少

### 1.5 数据分层
- **隔离原始数据**：不论是数据的异常还是数据的敏感性，使真实数据与统计数据解耦开。 
- **清晰数据结构**：每一个数据分层都有它的作用域，这样我们在使用表的时候能更方便地定位和理解。
- **👍 数据血缘追踪**：简单来讲可以这样理解，我们最终给产品端的是一张能直接使用的企业表，但是它的来源有很多，如果有一张来源表出问题了，我们希望能够快速准确地定位到问题，并清楚它的危害范围。
- **👍 减少重复开发**：规范数据分层，开发一些通用的中间层数据，能够减少极大的重复计算。
- **👍 把复杂问题简单化**：讲一个复杂的任务分解成多个步骤来完成，每一层只处理单一的步骤，比较简单和容易理解。而且便于维护数据的准确性，当数据出现问题之后，可以不用修复所有的数据，只需要从有问题的步骤开始修复。
- **屏蔽原始数据的异常**：不必改一次业务就需要重新接入数据，或者业务改了数据，也不一定对现在有影响
- **屏蔽业务的影响**：不必改一次业务就需要重新接入数据。

#### ODS

operation data store.
数据准备区，贴源层。

为了考虑后续可能追溯数据问题，因此不做数据清洗加工，原封不动的接入原始数据。
> 类似于 Venom 的爬取结果上传 OSS。

- ODS是后面数据仓库层的准备区
- 为DWD层提供原始数据
- 减少对业务系统的影响

#### DWD

data warehouse details.
数据细节层，业务层和数仓的隔离层，保持和ODS层相同的颗粒度。进行数据清洗和规范化操作。

该层是业务层和数据仓库的隔离层，保持和ODS层一样的数据颗粒度；主要是对ODS数据层做一些数据的清洗和规范化的操作，比如去除**空数据、脏数据、离群值**等。

为了提高数据明细层的易用性，该层通常会才采用一些维度退化方法，将维度退化至事实表中，减少事实表和维表的关联。


#### DWM

data warehouse middle.

数据中间层，在 DWD 的基础上进行轻微聚合操作，算出相应统计指标，生成**中间表**。

该层是在DWD层的数据基础上，对数据做一些轻微的聚合操作，生成一些列的中间结果表，提升公共指标的复用性，减少重复加工的工作。

#### DWS

data warehouse service.
数据服务层，在 DWM 的基础上，整合汇总成一个主题的数据服务层。汇总结果通常是一个宽表，用于 OLAP，数据分发等。

一般来说，该层的数据表会相对较少；一张表会涵盖比较多的业务内容，由于其字段较多，因此一般也会称该层的表为宽表。


#### ADS

application data service.
数据应用层，供数据分析和挖掘使用。

该层主要是提供给数据产品和数据分析使用的数据，一般会存放在ES、Redis、PostgreSql等系统中供线上系统使用；也可能存放在hive或者Druid中，供数据分析和数据挖掘使用。

# 参考
- [数据仓库常见建模方法与建模实例演示](http://www.uml.org.cn/sjjmck/202107032.asp?artid=24145)
- [数据建模方法](https://www.dataapplab.com/guide-to-data-warehousing/)
- [阿里数据中台维度建模规范、维度模型设计及模型实施方法论](https://blog.csdn.net/weixin_44586883/article/details/106758107)
- [详解数据仓库模型](https://zhuanlan.zhihu.com/p/377978194)
- [涤生手记大数据](https://blog.csdn.net/qq_26442553/category_11342005.html)
