别再为“收入”吵了!聊聊集团型企业的指标治理“骚操作”

0 阅读8分钟

“王总,为什么你们 BI 上这个月的‘销售收入’比我们财务系统里多了 500 万?”
“李总,我们按合同额算的啊,你们呢?”
“我们按回款算的,而且扣了退货...”
“那市场部昨天汇报的那个‘销售收入’又是啥?”
“... ...”(沉默是今晚的康桥)

得,又来了。在集团型企业里,这种对话每个月都得来几轮。财务、销售、市场,各说各的“收入”,老板看着三份报表,血压直接拉满。这还不是最头疼的,最近集团搞数据中台,想把各子公司的数据接进来做统一分析,法务和信安部门第一个跳出来:“数据混在一起,权限怎么控?出事了谁负责?”

指标口径乱如麻,数据安全像筛子——这几乎是所有业务多元化、组织架构复杂企业的通病。今天不聊虚的,就结合最近接触的一个项目,聊聊在这种“多业务线+多租户”的魔鬼场景下,一种基于 NoETL 语义编织 的指标治理新思路,看看它是不是真能治得了这“老毛病”。

一、 困局解剖:为什么传统数仓模式在这里“失灵”?

问题出在架构上。我们熟悉的“DWD -> DWS/ADS -> BI”经典数仓模式,在单一业务线里很好用,但一旦面对集团多业务线、多租户(子公司)的场景,就开始“水土不服”。

  1. 口径统一,成本爆炸
    想让全集团“收入”口径一致?传统做法是:召集各业务线大佬开会吵架 -> 定下一个“标准”口径 -> 数据开发根据新口径,为每个业务线重新开发一遍宽表(DWS/ADS)。且不说沟通成本,光是开发、测试、上线、运维的成本就指数级上升。业务线稍作调整,整个链条就得重来一遍。结果往往是:要么标准定不下来,要么定了也落不了地,大家还是各玩各的。

  2. 安全隔离,复杂度上天
    多租户数据隔离是刚需。传统方案无非几种:

  • 物理隔离:给每个租户建一套独立的数仓库表。干净是干净,但资源浪费严重,管理运维是噩梦。
  • 视图隔离:在公共表上创建大量带 WHERE tenant_id = 'xxx' 的视图。视图一多,管理混乱,性能也容易成问题。
  • 应用层过滤:在BI或应用里写死过滤逻辑。这是最危险的,一旦有漏洞或配置错误,数据就泄露了。

这些方案都把业务逻辑(该看什么数据) 和物理存储(数据怎么存) 死死绑在一起,导致系统僵化,变更成本极高。

  1. 管控失衡,一管就死一放就乱
    集团想管核心指标,但审批流程长,业务抱怨不敏捷;放权给业务部门自己定义吧,没多久就发现同一个指标冒出七八个版本,集团报表根本没法看。缺乏一个既能集中管控核心口径,又能弹性授权业务创新的柔性管控体系。

说到底,传统模式是 “物理模型驱动” 的。业务需求一变,物理表结构就得跟着变,牵一发而动全身。在稳定单一的业务场景下还行,但在复杂多变的集团环境下,就成了枷锁。

二、 破局思路:NoETL 语义编织,把逻辑层和物理层“拆开”

最近接触的 Aloudata CAN 这个平台,其核心思路很有意思,它不做物理宽表,而是在现有 DWD 明细数据之上,构建了一个 “统一语义层”。

你可以把它理解为一个虚拟的、逻辑上的业务事实网络。在这个网络里,你用声明式的方式告诉系统:“销售收入这个指标,来自于 订单事实表.金额,但需要关联 产品维表 过滤掉特定品类,并且按 已付款 状态统计。”

关键来了:这个定义是纯逻辑的,不产生物理表。 当用户查询时,它的语义引擎会实时将这个逻辑定义,结合用户的查询维度和权限,编译成最优的物理 SQL,下推到数据源(比如Doris, ClickHouse, Spark)去执行。

这种架构带来了几个根本性的变化:

  1. 口径统一,只需“定义一次”
    在语义层统一定义好 “集团标准销售收入” (原子指标)。所有业务线、所有报表都引用这个唯一逻辑定义。财务想按净额算?市场想按签约额算?没问题,你们可以在原子指标基础上,通过配置不同的 “业务限定” (比如过滤不同的订单状态)派生出自己的指标,但原子计算逻辑是统一的。源头干净了,下游再怎么衍生也不会跑偏。

  2. 安全隔离,在逻辑层天然实现
    权限控制被提升到了语义层。我可以给“上海分公司”这个角色配置一条行级权限规则:region = '上海'。当这个角色的用户查询任何涉及区域的数据时,语义引擎会自动把这个过滤条件下推到生成的 SQL 里。对于用户和BI工具来说,他“看到”的就是一个已经过滤好的、逻辑隔离的数据视图。无需创建无数物理视图或副本,安全策略在逻辑中心统一管理,清晰又安全。

  3. 分级管控,变得顺理成章
    基于这个逻辑层,可以轻松实现指标的分级管理:

  • 战略级指标(如集团利润率):由数据治理委员会在语义层严格定义、审批发布。
  • 业务级指标(如某产品线毛利率):授权给事业部数据负责人,允许他在标准原子指标上派生。
  • 部门级指标(如某个营销活动的转化率):一线业务人员可以自助创建,快速验证想法。

“管”和“放”的边界,通过权限和流程在逻辑层清晰划定,而不是在物理表权限上纠缠。

三、 实战拆解:它到底是不是“假 NoETL”?

作为一个老DBA,我对“NoETL”这种词天然警惕。很多产品不过是把ETL过程藏到了后台配置里,换汤不换药。但仔细研究 Aloudata CAN 的语义引擎,发现它有点不一样。

核心在于“定义即开发”和“动态下推”。

  • 声明式定义:你定义的是 SUM(订单金额) FILTER (WHERE 状态='完成') 这样的业务意图,而不是一段具体的 JOIN ... GROUP BY ... SQL。
  • 动态编译与优化:引擎会根据你的查询(比如按“城市”、“产品”分组),结合已定义的业务事实网络,实时编译出包含所有必要 JOIN 和 WHERE 条件的最优 SQL。它会利用底层数据源的能力,做谓词下推、聚合下推等优化。
  • 智能加速:对于热点查询,它确实会在后台自动创建物化视图(加速表)。但这和传统ETL有本质区别:物化是结果,而非前提。你是先有逻辑定义和查询需求,系统为了性能自动物化;而不是先花几周开发好宽表,才能开始分析。物化对业务用户透明,且可以按租户、按查询模式进行个性化加速,避免资源争抢。

所以,它更像是一个 “SQL 编译器” ,把高级的业务查询语言(MQL)编译成优化的物理执行计划(SQL)。ETL 的“T”(转换)逻辑被沉淀到了可复用的语义定义中,而不是分散在无数脚本里。

四、 一些思考与建议

这种模式特别适合业务变化快、组织复杂、对数据安全合规要求高的集团企业。比如文中提到的某股份制银行案例,用这套方法在总行统一核心指标,同时授权分行做本地化派生,并严格隔离数据,效果很直观。

当然,它也不是银弹。它的性能极度依赖底层查询引擎(如Doris, ClickHouse)的能力和语义引擎的优化水平。如果业务查询极其复杂、数据量巨大,对实时编译和查询下推都是考验。

给想尝试的兄弟几点建议:

  1. 起点要对:别一上来就想治理全集团。从一个痛点明确、价值易显的“小场景”切入,比如“管理层经营日报”,快速让老板看到“一个数”的威力。
  2. 数据基础要牢:它不建宽表,但极度依赖底层干净、规范的 DWD 明细数据层。如果明细层还是一团乱麻,先补课。
  3. 组织要协同:这不仅是技术工具,更是治理流程的变革。业务、数据、IT必须坐在一起,明确各层级指标的“主人”和决策流程。

把跟业务方扯皮“口径”的时间,用来琢磨怎么让数据更准、更快、更安全,这才是我们数据工程师的价值。这个基于语义层的思路,至少指出了一个可能的方向。链接我就不放了,搜 Aloudata 应该能找到,建议先拿个边缘业务跑跑看,验证一下是不是真能让你少写点那些让人头秃的ETL和权限管理脚本。