Files
wiki/wsf/bd/warehouse.md
2026-08-19 10:12:27 +08:00

68 lines
4.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 数仓架构与选表规则
source_status: warehouse_standard_learning_reference(分层定义)+ user_confirmed_agent_rule(选表/分区/依赖规则)
---
# 数仓架构与选表规则
范围:`wanshifu_dw` 库。`wanshifu_enterprise` 库被明确排除——不查询、不作为血缘起点、不作为 SQL 来源。
## 1. 分层定义
| 层 | 作用 | 设计要点 |
|---|---|---|
| ODS | 源对齐的接入数据,保留源系统粒度和字段 | 新套增量:`ods_*_inc_v`(每日变化)+ `ods_*_v`(合并后全量最新);新套全量:`ods_*_d_v`(按 `etl_date` 分区的每日全量快照) |
| DWD | 清洗整合后的原子事实或宽表属性 | 保持原子粒度、不做聚合、保留业务时间、补齐统一维度 |
| DWS | 可复用的主题级汇总和通用基础指标 | 从明细/公共层聚合;存基础指标,不存场景化衍生指标 |
| DIM | 可复用的业务维度和代码映射 | — |
| ADS | 场景化的数据服务、报表、抽数 | — |
| MID | 供多个分析师 ADS 输出共享的中间指标结果 | MID 不能依赖 MID(见下文层间依赖) |
业务域缩写:`mst`=master(师傅)、`usr`=user(用户)、`etp`=enterprise(企业)、`order`=order(订单)、`bas`=basic(基础)、`fmis`=finance(财务)、`kf`=customer_service(客服)。
> 分层定义仅作数仓设计理解,用于对候选表做优先级排序,不能替代 DDL 和表级已验证知识;与分析师规则冲突时以分析师规则为准。
## 2. 选表规则
**总体优先级:**满足所需字段和业务粒度 > 数据质量和成熟度已验证 > (临时查询)优先用完整新套合并/全量 ODS,排在新旧套 DWD 之前 > (调度脚本)拒绝 ODS,用允许的公共层 > 优先新套公共层。
| 场景 | 典型链路 | 分析师应选 | 避免 |
|---|---|---|---|
| 旧套增量源 | `ods_*_inc``dwd_*_inc_d``dwd_*` | 下游全量非增量 DWD 表 | `ods_*_inc``dwd_*_inc_d` |
| 新套增量源 | `ods_*_inc_v``ods_*_v` | 直接用合并后的全量 `ods_*_v`(临时分析不必再走到 DWD | `ods_*_inc_v` |
| 新套全量快照 | `ods_*_d_v` | 直接用该 ODS 的最新快照分区(通常 T-1) | — |
- 新套表缺所需字段时,才回退选用完整的旧套表。
- 同优先级出现多个同样合适的 `_v` 候选时,必须人工确认,不能自动选一个。
- 表名后缀优先级只是候选启发式,不是最终选表依据——最终仍要核对字段和已验证的表级知识。
## 3. 分区语义
| 语义 | 典型表 | 典型分区 | 查询规则 |
|---|---|---|---|
| 每日全量快照 | `ods_*_d_v` | `etl_date` | 取最新分区,通常 `etl_date = T-1`;一个分区是当天的完整快照 |
| 业务时间分区 | 如下单日期、活跃日期 | 业务日期 | 按需求要求的业务时间范围过滤,不能只取 T-1 当全量快照;需求未指定范围时必须询问用户,**不得默认查近三年** |
| 历史遗留分桶 | 部分数仓模型 | `20171231` | 2017 年及以前的记录可能被塞进这一个分区;查询范围涉及 2017 年及以前时,先查表级模型再写 SQL |
**强制规则:**
- 每张物理分区表都要过滤真实的分区字段。
- 非分区表允许全表扫描,不能为它虚构分区或时间条件。
- 业务时间过滤和分区过滤是两件事,要分别落实,不能互相替代。
## 4. 层间依赖边界
| 场景 | 允许的来源层 | 禁止的来源层 |
|---|---|---|
| 分析师临时查询 | DWD、DWS、DWM、DIM、ODS(兜底可用) | — |
| 分析师调度脚本(ADS/MID | DWD、DWS、DWM、DIM、MID | ODS、ADS、其他脚本的临时表(无例外) |
| 数仓设计参考(非当前 Skill 强约束) | DWD←ODS/DIMDWS←DWD/DWM/DIM/DWSDIM←ODS/MySQL | — |
- **MID 不能依赖另一个 MID**(已用户确认)。
- 数仓设计参考里的依赖关系仅作学习背景,不是当前 Agent 规则的强约束来源。
## 相关
- SQL 层面的安全和格式规范见 [sql-rules.md](sql-rules.md)。
- 上述规则的冲突裁决和历史确认记录见 [decisions.md](decisions.md)。