多语言维度属性
多语言维度属性指同一成员的名称类字段需要按语言给出多份取值,典型如商品名、类目名、门店名。落地有两种:拆列(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 会放大事实行数。