Doris 专用·数据建模架构师标准技能(适配200GB级业务、通用无行业、无固定库连接)
基础元信息
name: Doris-DataModel-Architect-Skill-General
适配引擎:Apache Doris(200GB中小规模业务场景)
建模体系:Kimball维度建模为主,兼容Inmon/ Data Vault设计思路
分层标准:ODS/DIM/DWD/DWS四层,无ADS层,复合指标统一交由BI
约束对齐:复用前置Doris分层通用规范(MV仅Duplicate Key、无分区lifecycle、CTE全字段注释、MV刷新时序规则)
核心能力:总线矩阵、SCD缓慢变化维、四类事实表、指标分层、Doris物化视图建模落地、反模式规避、分层DDL标准
一、建模全景与方法论适配Doris
1 五大建模体系适配场景
- Kimball星型(Doris首选)
- 适配:中小200GB业务、敏捷迭代、BI多维分析
- Doris优势:小维度广播JOIN,查询速度最优;DIM维度MV常驻内存可优化
- 结构:DIM维度表围绕DWD事实MV,外键数字ID关联,维度适度反范式
- Inmon 3NF企业仓库
- 适配大型多业务、强合规;Doris仅EDW中间层使用,上层DWD转为星型集市
- Data Vault 2.0
- 适配数据源频繁变更、全链路审计场景;Doris中Hub/Link/Sat均为定时MV
- Anchor 锚建模
- 极高合规追溯场景,Doris较少落地
- OneData阿里建模
- 总线矩阵、指标分层,完全兼容本Doris四层规范
统一Doris四层建模分层(废弃ADS,复合指标BI承载)
ODS(贴源Unique物理表)→ DIM(维度MV)→ DWD(明细事实MV)→ DWS(主题MV/逻辑VIEW)
分层职责严格复用前置通用Doris规范:
- ODS:CDC原样镜像,禁止任何清洗、JOIN、计算
- DIM:扁平化星型维度MV,SCD拉链存储,仅ODS来源
- DWD:单业务明细事实MV,同业务JOIN,仅小型维度ID下沉
- DWS:预聚合基础SUM/COUNT MV + 主题逻辑VIEW;客单价、分层、同比全部BI计算
二、三大建模方法论 Doris落地规则
2.1 Kimball星型模型(Doris标准落地)
标准结构
- 中心DWD事实MV(度量+数字外键)
- 周边DIM维度MV(文本描述、层级属性)
- 维度退化:订单号、流水号等不关联维度字段直接存入事实MV,减少JOIN
Doris专属优化
- DIM小型维度MV配置广播关联hint
[broadcast] - DIM全部构建自动刷新MV,避免实时扫描ODS原始库
- 事实DWD采用业务主键分布HASH,本地JOIN减少数据洗牌
- 禁止事实表存储文本维度名称,仅保留ID,DWS视图关联翻译
2.2 Inmon CIF Doris落地限制
1 ODS→临时Staging(Doris不建独立层,复用ODS清洗CTE) 2 EDW 3NF层:Doris不持久落地,仅ETL中间CTE临时使用 3 数据集市:统一转为DWD星型MV,Doris不长期存储3NF表(3NF多JOIN查询性能极差)
2.3 Data Vault 2.0 Doris落地规范
1 Hub(实体主键MV):单ODS源 ON COMMIT 刷新
2 Link(实体关联MV):多表JOIN EVERY 1 DAY 定时MV
3 Sat(属性快照MV):按业务变更频率11/30分钟定时刷新
4 三层全部Duplicate Key MV,通过哈希主键关联;适合需要完整变更审计的业务
三、四层Doris建模分层完整规范(无ADS)
1 ODS层建模约束(Unique物理表)
1 模型固定Unique Key,1:1同步上游MySQL Binlog 2 不新增衍生字段、不做过滤、不分拆业务表 3 无MV、无视图,仅作为CDC存储底座
2 DIM维度层建模(物化视图MV)
1 扁平化单层星型,禁用多层雪花链式JOIN
2 分6类SCD缓慢变化维落地拉链表
3 仅存储维度ID、层级文本、变更时间;用户姓名/年龄仅DWS临时关联
4 单ODS源:REFRESH AUTO ON COMMIT(Doris≥2.1.4,低量日批)
5 多ODS合并维度:REFRESH AUTO ON SCHEDULE EVERY 1 DAY
3 DWD明细事实层建模(核心MV)
四类事实表Doris建模标准
1 事务事实(订单/支付流水):最细粒度,多子表11分钟定时MV 2 周期快照(库存/账户余额):日度30分钟定时MV 3 累积快照(订单全生命周期):多状态时间字段,每日刷新MV 4 无事实关联表(多对多映射):仅外键,无金额度量
DWD强制建模规则
1 仅同业务多子表CTE合并,禁止跨业务(用户/支付)JOIN 2 仅保留数字维度外键,不冗余维度名称 3 裁剪备注、长文本冗余字段,降低MV刷新IO 4 无聚合、无CASE业务标签,度量仅原始可加金额/数量
4 DWS层建模(聚合MV + 逻辑VIEW)
1 DWS-MV:仅SUM/COUNT基础可加指标,30分钟定时Duplicate Key MV 2 DWS-VIEW:纯逻辑视图,仅DIM/DWD基础关联、ID转名称 3 所有比率、分层、同比、排名不在DWS实现,BI完成 4 MV嵌套时序约束:下游刷新周期必须大于上游DWD
四、SCD缓慢变化维 Doris拉链表建模(Type2标准DDL)
SCD六类策略选型
| 类型 | 适用属性 | Doris落地方案 | |------|---------|--------------| | Type0 | 永久不变(生日) | DIM单MV,不做历史快照 | | Type1 | 不重要变更(昵称) | ON COMMIT覆盖刷新MV | | Type2 | 需完整历史(用户等级) | 拉链表MV,新增行快照 | | Type3 仅存上一值 | 部门变更 | 增加prev字段,少用 | | Type4 历史分表 | 高频地址变更 | 分两个DIM MV(当前+历史) | | Type6 混合 | 多属性混合变更 | 组合Type1+2 |
Doris Type2拉链维度MV标准(CTE、Duplicate Key、无分区)
USE 业务库名;
DROP MATERIALIZED VIEW IF EXISTS dim_user_df;
CREATE MATERIALIZED VIEW dim_user_df
BUILD IMMEDIATE REFRESH AUTO ON SCHEDULE EVERY 1 DAY
DISTRIBUTED BY HASH(user_id) BUCKETS AUTO
PROPERTIES ('replication_num' = '1')
COMMENT '用户维度Type2拉链MV,记录等级/城市历史快照,仅存储ID与维度属性'
AS
WITH cte_ods_user AS (
SELECT
id AS user_id COMMENT '业务用户主键',
user_name COMMENT '用户名称',
user_level COMMENT '用户等级',
city COMMENT '所在城市',
gmt_modified COMMENT '更新时间'
FROM ods_user
),
-- 历史已过期快照
cte_history AS (
SELECT
user_id,
user_name,
user_level,
city,
effective_date,
expire_date,
is_current
FROM dim_user_df
WHERE is_current = 0
),
-- 当前有效最新数据
cte_current AS (
SELECT
user_id,
user_name,
user_level,
city,
CAST(gmt_modified AS DATE) AS effective_date,
'9999-12-31' AS expire_date,
1 AS is_current
FROM cte_ods_user
)
-- 合并历史+新变更快照
SELECT
user_id COMMENT '用户业务ID',
user_name COMMENT '用户名称',
user_level COMMENT '用户等级',
city COMMENT '城市',
effective_date COMMENT '版本生效日期',
expire_date COMMENT '版本失效日期',
is_current COMMENT '1当前有效/0历史快照'
FROM cte_history
UNION ALL
-- 筛选发生变更用户,生成新版本
SELECT curr.*
FROM cte_current curr
LEFT JOIN dim_user_df hist
ON curr.user_id = hist.user_id AND hist.is_current = 1
WHERE hist.user_id IS NULL
OR (hist.user_level <> curr.user_level OR hist.city <> curr.city);
拉链表关联查询规范(Doris标准写法)
SELECT f.*, d.user_level
FROM dwd_fact_order_detail f
LEFT JOIN dim_user_df d
ON f.user_id = d.user_id
AND DATEV2(f.pay_datetime) BETWEEN d.effective_date AND d.expire_date;
五 Doris分层建模标准DDL模板(无分区、无lifecycle、CTE全注释)
模板1 DWD事务事实MV(Kimball星型中心表)
USE 业务库名;
DROP MATERIALIZED VIEW IF EXISTS dwd_fact_order_mini;
CREATE MATERIALIZED VIEW dwd_fact_order_mini
BUILD IMMEDIATE REFRESH AUTO ON SCHEDULE EVERY 11 MINUTE
DISTRIBUTED BY HASH(order_id) BUCKETS AUTO
PROPERTIES ('replication_num' = '1')
COMMENT '订单事务明细事实MV,星型中心,仅数字维度外键、原始可加度量,无文本维度名称'
AS
WITH cte_order AS (
SELECT
id AS order_id COMMENT '订单主键退化维度',
order_no COMMENT '订单编号',
user_id COMMENT '用户维度外键',
product_id COMMENT '商品维度外键',
store_id COMMENT '门店维度外键',
channel_id COMMENT '渠道维度外键',
pay_datetime COMMENT '支付时间',
order_amount COMMENT '订单总金额',
discount_amount COMMENT '优惠金额',
actual_amount COMMENT '实付金额',
product_cnt COMMENT '商品件数',
is_first_order COMMENT '是否首单',
is_coupon_use COMMENT '是否用券',
gmt_create COMMENT '单据创建时间'
FROM ods_order
WHERE is_inactive = 0
),
cte_order_item AS (
SELECT
order_id COMMENT '关联订单ID',
sku_id COMMENT 'SKU维度ID',
item_price COMMENT '单品单价',
item_num COMMENT '单品数量'
FROM ods_order_item
WHERE is_inactive = 0
)
SELECT
co.order_id COMMENT '订单退化主键',
co.order_no COMMENT '订单流水号',
co.user_id COMMENT '用户DIM外键',
co.product_id COMMENT '商品DIM外键',
co.store_id COMMENT '门店DIM外键',
co.channel_id COMMENT '渠道DIM外键',
DATEV2(co.pay_datetime) AS stat_date COMMENT '日期维度ID',
co.order_amount COMMENT '订单原始金额(可加度量)',
co.discount_amount COMMENT '优惠金额',
co.actual_amount COMMENT '实收金额',
co.product_cnt COMMENT '商品总数量',
co.is_first_order COMMENT '首单标记',
co.is_coupon_use COMMENT '用券标记',
co.gmt_create COMMENT '单据创建时间'
FROM cte_order co
INNER JOIN cte_order_item ci ON co.order_id = ci.order_id;
模板2 DWS日聚合MV(仅基础SUM/COUNT)
USE 业务库名;
DROP MATERIALIZED VIEW IF EXISTS dws_order_daily_mv;
CREATE MATERIALIZED VIEW dws_order_daily_mv
BUILD IMMEDIATE REFRESH AUTO ON SCHEDULE EVERY 30 MINUTE
DISTRIBUTED BY HASH(stat_date) BUCKETS AUTO
PROPERTIES ('replication_num' = '1')
COMMENT '订单日聚合物化视图,仅存储基础可加指标,客单价/转化率BI计算'
AS
WITH cte_order_fact AS (
SELECT stat_date, user_id, order_id, actual_amount, product_cnt
FROM dwd_fact_order_mini
)
SELECT
stat_date COMMENT '统计日期',
COUNT(DISTINCT user_id) AS uv COMMENT '去重用户数(原子指标)',
COUNT(DISTINCT order_id) AS order_cnt COMMENT '订单总数',
SUM(actual_amount) AS total_revenue COMMENT '实收总额',
SUM(product_cnt) AS total_goods COMMENT '商品总件数'
FROM cte_order_fact
GROUP BY stat_date;
模板3 DWS主题逻辑VIEW(仅基础关联无比率计算)
USE 业务库名;
DROP VIEW IF EXISTS dws_ops_daily_wide;
CREATE VIEW dws_ops_daily_wide
COMMENT '经营日主题视图,仅维度名称映射,复合指标BI实现'
AS
WITH cte_dws_mv AS (
SELECT stat_date, uv, order_cnt, total_revenue, total_goods
FROM dws_order_daily_mv
)
SELECT
base.stat_date COMMENT '统计日期',
dim_date.day_name_cn COMMENT '星期',
base.uv COMMENT '活跃用户',
base.order_cnt COMMENT '订单量',
base.total_revenue COMMENT '营收',
base.total_goods COMMENT '商品件数'
FROM cte_dws_mv base
LEFT JOIN dim_date_df dim_date ON base.stat_date = dim_date.date_key;
六、指标分层建模(Doris+BI边界清晰)
三层指标划分(DWS只存原子,复合全部BI)
1 原子指标(DWS-MV落地) 定义:不可拆分、原生SUM/COUNT;示例:实收总额、订单数、活跃用户 2 派生指标(DWS仅基础聚合,维度过滤在BI) 原子指标+单一维度+时间;近7天营收、门店订单量 3 复合指标(禁止写入DWS,BI计算) 除法、分层、同比、排名:客单价、支付转化率、用户价值分层、环比增速
OneData指标建模规范(适配Doris)
1 指标唯一英文标识,配套中文名称、口径、过滤条件 2 DWS仅存储原子度量,过滤、时间窗口、比率统一BI工具实现 3 示例指标yml(dbt建模配套)
metrics:
- name: total_revenue
label: 实收总营收
type: simple
measure: SUM(actual_amount)
grain: day
source: dws_order_daily_mv
- name: avg_price
label: 客单价
type: ratio
numerator: total_revenue
denominator: order_cnt
remark: BI报表计算,不落地DWS
七 Doris建模通用反模式(强制规避)
| 反模式 | 问题危害 | 标准修正方案 | |--------|----------|--------------| | DWD冗余存储维度名称 | MV体积膨胀、刷新缓慢 | DWD仅存ID,DWS视图关联DIM取名称 | | DWS内部写CASE分层/除法 | 口径固化,频繁改MV刷新 | 分层、比率全部移至BI | | DWD跨业务JOIN订单+用户 | 数据笛卡尔膨胀,刷新超时 | DWD仅同业务,用户仅DWS关联 | | 维度不做MV,实时扫描ODS | 多报表重复扫描源库 | DIM统一自动刷新MV | | MV嵌套刷新间隔上游大于下游 | 读取旧快照数据不一致 | DWS-MV周期必须大于DWD | | 单ODS源MV写定时SCHEDULE | 资源空耗 | 单表使用ON COMMIT(2.1.4+) | | 大量文本备注存入DWD | MV存储大、IO高 | 裁剪冗余长文本字段 |
八、200GB Doris建模技术选型决策树
1 数据规模≤200GB、业务敏捷迭代 Kimball星型四层(ODS/DIM/DWD/DWS)+ dbt脚本 + Doris MV 2 多业务线、强合规、变更频繁 ODS层Data Vault,上层DWD转为Kimball星型 3 实时CDC高频写入 放弃ON COMMIT,全部DIM/DWD使用分钟级定时MV 4 大型集团多部门、历史追溯需求 Inmon 3NF仅ETL中间CTE,集市层落地DWS聚合MV
九、建模交付物标准化清单(落地交付必出)
[1] 业务过程矩阵(业务×维度梳理) [2] 总线矩阵(共享DIM维度统一口径) [3] CDM概念模型、LDM逻辑ER图、PDM物理DDL [4] 各层CTE建模DDL(DIM/DWD/DWS) [5] SCD维度变更策略文档 [6] 全量数据字典(表/字段/枚举/度量) [7] 指标口径文档(区分原子/复合指标边界) [8] ETL映射脚本(ODS→DWD字段映射) [9] MV刷新配置清单、时序依赖说明 [10 数据血缘、Doris MV运维监控SQL
十 复用前置Doris通用强制约束(建模全遵守)
1 所有MV底层固定Duplicate Key,不可指定Unique/Aggregate Key
2 无PARTITION分区、无lifecycle生命周期配置
3 全SQL统一CTE结构,每个字段必须添加COMMENT注释
4 单ODS源MV:REFRESH AUTO ON COMMIT;多表JOIN使用SCHEDULE定时
5 高频CDC场景禁用ON COMMIT,防止任务堆积
6 MV刷新故障四步标准排查流程
7 任务表仅保存近100条日志,定期巡检刷新状态
8 无ADS分层,所有应用层复合指标由BI承载
Scan to join WeChat group