首页/数据/数仓建模速查/多语言维度属性设计
维度与事实设计149 条

多语言维度属性设计

名称类属性按语言拆列或拆行:拆列实现简单,拆行扩展语种更灵活;都要定义缺失语种的回退规则。

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

多语言维度属性

多语言维度属性指同一成员的名称类字段需要按语言给出多份取值,典型如商品名、类目名、门店名。落地有两种:拆列(name_zh、name_en 并列),实现简单、查询不加 join,但加语种要改表结构;拆行(locale 一行一语言),扩语种只加数据,代价是查询必须带语种条件。两种方案都要定义缺失语种时的回退规则。

基本信息

拆列方案name_zh / name_en 并列字段,查询无 join
拆行方案成员 + locale 唯一一行,利于扩语种
主键拆行时是「成员键 + 语种」组合
回退规则缺失语种回退到基线语言(通常 en 或 zh_CN)
排序值各语种单独维护,避免用中文排序英文字段
适用对象跨境商品、多语言站点、海外门店与仓

典型使用场景

  • 跨境商品目录:同一 SKU 在中英日站点展示不同名称与描述
  • 海外门店报表:按用户会话语言输出门店、区域名称
  • 发票与单据:对账单据按客户所在地语言出中文或英文抬头
  • 类目导航:同一类目树在不同语言站点下的翻译与排序
  • 运营后台:给翻译团队提供待补语种清单,跟踪翻译覆盖率

两种写法的查询对照

两种写法的查询对照
-- 拆列:一行取多语种,无 join
SELECT product_id, product_name_zh, product_name_en
FROM dim_product;   -- 加语种要 ALTER TABLE,回退用 COALESCE
-- 拆行:按语种过滤,扩语种只加数据
SELECT p.product_id, COALESCE(i.product_name, b.product_name) AS product_name
FROM dim_product p
LEFT JOIN dim_product_i18n i ON p.product_id = i.product_id AND i.locale = :locale
LEFT JOIN dim_product_i18n b ON p.product_id = b.product_id AND b.locale = 'en_US'
WHERE p.is_current = 1;   -- 缺当前语种时回退到基线语言

两种方案取舍

维度拆列拆行
扩语种要改表结构并回刷只新增数据行
查询复杂度直接 select需带 locale 条件或 join
适用语种数2-4 种较合适语种多、变动频繁时更合适
成员完整性每个成员都有一行可只翻译部分成员
回退规则要写成明确链路,例如「请求语种 -> 基线英文 -> 中文原名」,并在维表里保留 fallback_locale 字段;前端拿到空串会直接显示空白,比显示原文更难排查。
拆行方案常把 locale 作为分区键,配合语言维使用;同时要约定是否允许同一成员同一语种存在多行(一般禁止),否则 join 会放大事实行数。

易错点

  • 把多语言名称混填进同一列,导致检索、排序、去重全部失效
  • 缺失语种没有回退规则,前端展示空白或显示内部编码
  • 拆行表允许「同一成员同一语种」重复,join 事实表后金额被重复计算
  • 用中文字符串排序去给英文字段排序,站点导航顺序错乱

数据来源与参考

  • 数仓建模实践:多语言维度
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌