首页/数据/数仓建模速查/维度派生属性与规范化
维度与事实设计149 条

维度派生属性与规范化

把可推导属性(年龄分段、区域归类)在维度加工时固化,避免下游各写一套 CASE;派生规则要版本化登记。

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

派生属性是什么

派生属性指能从维度已有字段按固定规则算出来的属性:由出生日期得年龄段、由订单金额得价格带、由邮编或经纬度得大区归属。它不引入新的业务事实,价值在于把散落在各报表里的 CASE WHEN 收敛成唯一一份口径。做法是在维度加工层一次算好并物化成列,下游直接取用,不再各自判断区间。

基本信息

典型属性年龄段 / 价格带 / 区域归类 / 会员等级
计算位置维度加工层一次算好,物化成列
前提条件原始字段必须保留(出生日期、金额原值)
规则登记分段边界写进数据字典并标注生效日期
变更处理规则调整后重算派生列,已发布报表单独评估
常见引擎Hive / Spark SQL / MySQL 8 等数仓引擎

典型使用场景

  • 统一口径:多个报表都要按年龄段统计时,只保留维度里这一份定义
  • 简化查询:下游直接按 age_band 过滤,不必每条 SQL 重写区间判断
  • BI 建模:拖字段即可出图,不用在报表工具里维护计算字段
  • 用户分群:按价格带、活跃分层做圈选与投放名单
  • 跨系统对齐:把业务系统口径与报表口径的分段边界一次对齐

分段与价格带示例

分段与价格带示例
SELECT customer_id,
       CASE WHEN age < 18 THEN '未成年'
            WHEN age < 30 THEN '18-29'
            WHEN age < 45 THEN '30-44'
            ELSE '45+' END AS age_band,   -- 边界左闭右开,段与段不重叠
       CASE WHEN amt < 100 THEN 'P1'
            WHEN amt < 1000 THEN 'P2'
            ELSE 'P3' END AS price_band
FROM stg_customer
WHERE age IS NOT NULL;   -- 空值单独落「未知」段,不要漏进 ELSE

设计与治理要点

要点做法忽略后果
分段边界只在一处定义,登记生效时间同一分段在不同报表结果不一致
空值处理显式归入「未知」分段由 ELSE 兜底会把空值混进最高段
原始值保留出生日期、金额原值规则调整后无法回溯重算
规则版本记录规则生效日期跨期对比时新旧边界混算
分段边界变更属于口径变更:历史事实要不要按新规则重算,取决于业务是否要求跨期可比。若要求可比,应同时保留新旧两套派生列,而不是直接覆盖旧列。
候选值集合有限且稳定的属性(年龄段个数不随数据增长)适合物化成维度列;候选值会随业务无限增长的(如自定义标签)应放到标签表,否则维度列会不断膨胀。

易错点

  • 分段边界散落在多个报表里,同一个「新客」定义在不同看板上人数对不上
  • 不保留原始值(出生日期、金额),规则调整后只能等下次全量抽取才能重算
  • 把空值交给 ELSE 兜底,NULL 客户被算进最高年龄段,人群包投放发错人
  • 规则改了却覆盖旧列,跨期同比用的是两套边界,趋势线出现无法解释的跳变

数据来源与参考

  • 数仓建模实践:维度属性派生
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌