Back to skills
extension
Category: Data & AnalyticsNo API key required

Doris 专用・数据建模架构师

建模体系:Kimball维度建模为主,兼容Inmon/ Data Vault设计思路 分层标准:ODS/DIM/DWD/DWS四层,无ADS层,复合指标统一交由BI 约束对齐:复用前置Doris分层通用规范(MV仅Duplicate Key、无分区lifecycle、CTE全字段注释、MV刷新时序规则) 核心能力:总线矩阵、SCD缓慢变化维、四类事实表、指标分层、Doris物化视图建模落地、反模式规避、分层DDL标准

personAuthor: user_60f50cbbhubcommunity

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 五大建模体系适配场景

  1. Kimball星型(Doris首选)
    • 适配:中小200GB业务、敏捷迭代、BI多维分析
    • Doris优势:小维度广播JOIN,查询速度最优;DIM维度MV常驻内存可优化
    • 结构:DIM维度表围绕DWD事实MV,外键数字ID关联,维度适度反范式
  2. Inmon 3NF企业仓库
    • 适配大型多业务、强合规;Doris仅EDW中间层使用,上层DWD转为星型集市
  3. Data Vault 2.0
    • 适配数据源频繁变更、全链路审计场景;Doris中Hub/Link/Sat均为定时MV
  4. Anchor 锚建模
    • 极高合规追溯场景,Doris较少落地
  5. OneData阿里建模
    • 总线矩阵、指标分层,完全兼容本Doris四层规范

统一Doris四层建模分层(废弃ADS,复合指标BI承载)

ODS(贴源Unique物理表)→ DIM(维度MV)→ DWD(明细事实MV)→ DWS(主题MV/逻辑VIEW)

分层职责严格复用前置通用Doris规范:

  1. ODS:CDC原样镜像,禁止任何清洗、JOIN、计算
  2. DIM:扁平化星型维度MV,SCD拉链存储,仅ODS来源
  3. DWD:单业务明细事实MV,同业务JOIN,仅小型维度ID下沉
  4. DWS:预聚合基础SUM/COUNT MV + 主题逻辑VIEW;客单价、分层、同比全部BI计算

二、三大建模方法论 Doris落地规则

2.1 Kimball星型模型(Doris标准落地)

标准结构

  • 中心DWD事实MV(度量+数字外键)
  • 周边DIM维度MV(文本描述、层级属性)
  • 维度退化:订单号、流水号等不关联维度字段直接存入事实MV,减少JOIN

Doris专属优化

  1. DIM小型维度MV配置广播关联hint [broadcast]
  2. DIM全部构建自动刷新MV,避免实时扫描ODS原始库
  3. 事实DWD采用业务主键分布HASH,本地JOIN减少数据洗牌
  4. 禁止事实表存储文本维度名称,仅保留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承载