首页/数据/数仓建模速查/Doris 表模型:明细、聚合、主键
湖仓与引擎63 条

Doris 表模型:明细、聚合、主键

三种模型按写入形态选择:明细模型保留全部行(适合日志)、聚合模型按 key 预聚合(适合指标)、主键模型支持更新与删除(适合维表)。

数仓建模速查数据更新于 2026-10-13

三种表模型是什么

Apache Doris 建表时要先选表模型,它决定同一 Key 的多行数据怎么处理。明细模型 Duplicate 不去重不聚合,写入多少行就存多少行;聚合模型 Aggregate 在建表时给指标列指定聚合函数(SUM、MAX、REPLACE 等),导入时按 Key 直接聚合;主键模型 Unique 对同 Key 的写入做覆盖,只保留最新一行。Key 列必须写在建表列的最前面,Doris 依据 Key 前缀生成索引,所以 Key 的顺序同时影响查询过滤效率。

基本信息

适用平台Apache Doris 1.x/2.x(StarRocks 有同名模型,参数写法不同)
三种模型Duplicate 明细 / Aggregate 聚合 / Unique 主键
Key 列约束必须位于建表列最前,并参与前缀索引
常用聚合函数SUM、MAX、MIN、REPLACE、REPLACE_IF_NOT_NULL、BITMAP_UNION、HLL_UNION
更新能力Unique 支持按主键更新与删除;Aggregate 与 Duplicate 不支持整行更新
分桶配合DISTRIBUTED BY HASH(Key 列) BUCKETS n

典型使用场景

  • 埋点、日志、行为流水需要保留每一行原始记录,用 Duplicate,查询可回溯到单条事件
  • 看板指标只按固定维度做求和,用 Aggregate 把聚合提前到导入阶段,查询更快且表更小
  • 维表、状态表需要按主键覆盖写,用 Unique,避免下游读到同一实体的多个历史版本
  • 需要精确去重计数(如日活用户数)时用 BITMAP_UNION,比在明细上 count distinct 更省资源
  • 同一份数据既要明细又要聚合,明细存 Duplicate,再用物化视图或另一张 Aggregate 表提供汇总

三种模型建表

三种模型建表
CREATE TABLE dw.dim_store (            -- 主键模型:同 key 覆盖
  store_id    VARCHAR(32) NOT NULL,
  store_name  VARCHAR(128),
  update_time DATETIME
)
UNIQUE KEY(store_id)
DISTRIBUTED BY HASH(store_id) BUCKETS 8;

CREATE TABLE dw.dws_trade_store_day (  -- 聚合模型:导入即聚合
  dt         DATE NOT NULL,
  store_id   VARCHAR(32) NOT NULL,
  order_cnt  BIGINT SUM DEFAULT '0',
  pay_amt    DECIMAL(18,2) SUM DEFAULT '0'
)
AGGREGATE KEY(dt, store_id)
DISTRIBUTED BY HASH(store_id) BUCKETS 16;

CREATE TABLE dw.dwd_trade_order_dup (  -- 明细模型:不去重
  order_id VARCHAR(32) NOT NULL,
  pay_amt  DECIMAL(18,2),
  dt       DATE NOT NULL
)
DUPLICATE KEY(order_id, dt)
DISTRIBUTED BY HASH(order_id) BUCKETS 16;

模型逐项对照

模型同 Key 行为数据保留典型场景
Duplicate 明细Key 仅用于索引与排序全部行原样保留日志、埋点、明细查询
Aggregate 聚合按聚合函数合并同 Key 汇成一行固定维度的 SUM/MAX 指标表
Unique 主键同 Key 覆盖为最新同 Key 一行维表、状态表、需要更新的实体表
Aggregate 的聚合在导入阶段完成,历史数据无法再还原成明细;比率类指标必须存分子与分母,查询时相除,直接存比率结果会在跨维度汇总时算错。
Unique 模型早期实现是读时合并,查询要额外付出合并开销;1.2 引入 Merge-on-Write 后写入阶段即完成合并,读性能接近明细表,具体是否默认启用随版本与配置而变。

易错点

  • 比率指标建成聚合表直接存结果值:换一组维度汇总时数字互相矛盾,只能重建表改存分子分母
  • Unique 表的 Key 选了非唯一列:同实体多行互相覆盖,聚合结果偏小且难以定位
  • 维表建成 Duplicate 模型:每次更新追加新行,下游不加过滤就取到旧版本数据
  • 聚合函数选错(本该 REPLACE 却写 SUM):指标在重复导入时翻倍,问题往往在月度对账才暴露
  • Key 列顺序与查询过滤顺序不一致:前缀索引命中率低,扫描数据量远大于预期

数据来源与参考

  • Apache Doris 官方文档:Data Model
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌