多值字段怎么处理
01

文本不是成员列表

02

拆开后才能过滤

03

一笔事实只能计一次

04

桥表负责多对多

05

拆分规则要有版本

结论:塞在一个字段里的标签还不是维度

订单上有一个字段写着“直播,短视频,店铺”。想筛直播时,用等号会漏掉这行,因为它不等于“直播”;用包含“直播”又会命中“直播回放”或其他带同样字的值。想按标签数订单时,若先把字段拆成三行再计数,这一单会被算成三单。多值文本可以保留作原始字段,但不能直接当成维度成员。

维度建模里,一行事实代表一次业务。标签和订单是多对多。星型模型期望用维度表上的成员去过滤事实,而不是在一个字符串里做包含。要么建桥表,一行一个订单加一个标签;要么声明该字段只供搜索,不参与指标。

拆分规则本身会改变成员

分隔符可能是逗号、顿号或空格,标签两边会有空格,大小写和同义词也不统一。“直播”和“直播间”是不是同一个成员,要有对照表,而不是让模型临时决定。拆分规则一改,历史查询的成员就会变,所以规则要有版本。空字段表示没有标签,还是表示未知,也要分开,不能拆出一行空成员后又把它算进每个过滤。

包含查询还有顺序问题。字段以“短视频,直播”存储,和拆成两行再过滤,结果集合可以相同,但“第一个标签”这种问题只存在于文本顺序里。若业务不承认顺序,就不要提供“主标签”这种派生,除非另有字段写明主标签。

计数和金额只能在事实粒度上发生

按标签看销售额时,一笔 100 元、带两个标签的订单,可以在每个标签上显示 100,但所有标签相加不能等于公司销售额。正确的公司销售额仍按订单计一次。桥表适合回答“带有该标签的订单金额”,不适合把桥表行直接求和当成总销售额。这个区别要写在指标上:一个是“含某标签的金额”,一个是“订单金额”。

Kimball 对粒度的声明在这里决定能不能相加。若指标没有写明防止重复,问数会把拆开的行求和,两个标签的活动会各自邀功,合计超过店铺。

两条路径

路径一是桥表加维度成员。过滤、权限和计数都落在成员上,适合活动、渠道、标签会参加正式指标的情况。成本是要维护拆分和对账。路径二是把原字段留在事实旁边,只做展示或模糊搜索,指标一律不按它分组。适合标签还不稳定、只是备注的情况。

不适合的是半拆:有时用包含,有时用等号,有时把拆开的行求和。三种语义会在不同报表里同时出现。

反例与验收

反例:等号过滤漏掉“直播,短视频”;包含过滤把“直播回放”算进直播;按标签把订单金额加总后大于店铺销售额;空标签被算成一个正式渠道。验收准备一笔双标签、一笔空标签、一笔相似词。检查含直播的金额、订单是否只计一次,以及全部标签金额之和是否被误当成总销售额。

BuildTable.ai 可作为语义层候选,用来声明多值字段走桥表还是只作文本。本文不证明其当前版本已经拆分标签或阻止重复计数;要用实际字段核验。

桥表和原文本要能对上。抽一笔双标签订单,桥表应有两行,金额仍只在事实表计一次。若桥表行上又存了一份订单金额并被求和,验收失败。拆分版本变更后,旧查询应仍能按旧版本重放。相似词不要靠包含来合并。直播和直播回放应是两个成员,除非对照表明确写成同义词。模型临时合并成员,会导致活动范围随问法变化。

公开参考资料

开始构建 AI 友好的数据基础

联系我们讨论企业数据建模场景和部署支持。

联系我们