做数据仓库这些年,只要聊到企业级数据模型,几乎绕不开一个名字:FS-LDM。全称是金融服务逻辑数据模型(Financial Services Logical Data Model),在很多资料里也常被记录为NCR FS-LDM。初次接触这套模型的人,很容易被它庞大的实体数量吓到,但大多数项目真正卡住的环节,反而不是实体设计,而是最上面那一层——主题域怎么划分。
主题域划分听起来就是个分组归类,实际做起来却特别容易跑偏:要么照搬公司系统的模块结构,要么把应用主题当成业务主题,要么在十个主题域之间来回纠结。这篇文章我会结合自己在企业级数据仓库建设中使用FS-LDM框架做主题域划分的实操经验,把这层东西拆开讲清楚:主题域到底在模型里扮演什么角色、FS-LDM的十大主题域是怎么划分出来的、落到你自己的项目里该按什么步骤操作、以及哪些坑我踩过之后建议你绕着走。适合数仓工程师、数据架构师、数据治理岗位的同事参考。
1. 主题域为什么存在:它解决的是数据组织方式问题
1.1 几十套系统各说各话,才是主题域出现的真正原因
一家中大型金融机构,跑着上百套系统很正常。核心系统里有客户信息,信贷系统里有借款人、担保人,渠道系统里有交易流水,财务系统里有科目余额。这些系统各自设计表结构、各自定义字段、各自维护口径,看起来都离不开“客户”“交易”“产品”,但真要跨系统分析的时候,你会发现同一个客户在三套系统里是三套编码,同一个“贷款余额”可以算出三个结果。
主题域的价值,就是在这一团乱麻里先立一个骨架。它不管表名怎么起、字段怎么设计、数据库怎么存储,只管一个问题:一类数据在业务概念上属于什么。客户表、借款人表、担保人表,在概念上都指向参与业务的人,所以归到“当事人”域;柜面交易流水、手机银行流水、第三方支付流水,都是业务行为的事实记录,所以归到“事件”域。
这个“先定义业务概念,再谈表结构”的顺序,恰恰是很多团队容易反着来的地方。不少项目一启动就打开数据库看物理表,然后按系统模块把表分成“客户域”“交易域”“报表域”,这套做法做出来的模型,本质上是原系统的影子,换一个数据源系统就得改一遍模型,等于没建模型。
1.2 FS-LDM为什么能成为业界参考标准
FS-LDM之所以被反复提及,核心原因是它几乎没有绑定任何一家企业的系统差异。它站在银行、保险、证券这类金融服务行业共有的业务概念上,把数据组织成一套可复用、可裁剪的逻辑框架。行业里大量数据仓库项目以它为蓝本做过定制,后来做数据中台、做监管数据集市,也常常回头参考它的主题域划分思路。
FS-LDM对企业级数据建模最重要的贡献,就是给了你一套现成的、经过大量实践验证的“数据地图”。你不需要从零开始发明主题域,也不用自己拍脑袋决定某个实体该放哪,而是先理解这套地图的逻辑,再按自己企业的业务范围做裁剪和调整。主题域边界定准了,后续实体设计、关系设计、物理表映射全部会顺着这个框架走,事半功倍。
1.3 主题域不等于系统模块,也不等于应用主题
我见过不少团队把“客户管理”“贷款管理”“风控报表”当成主题域。这些词听起来很像主题,实际却分属另外两个层面:系统模块描述的是“功能从哪里来”,客户管理系统、贷款核心系统这些是功能边界;应用主题描述的是“数据给谁用”,风控报表、经营分析看板是使用场景;而主题域描述的是“数据本身是什么”,不管数据从哪个系统来、给哪个报表用,它在业务概念上就是当事人、就是协议、就是事件。
主题域、系统模块、应用主题三者混在一起,模型就会变得既不像业务模型也不像应用模型。判断方法很简单:如果这个分组换个系统、换个报表依然成立,它才有资格当主题域;如果它的存在依赖于某个特定系统或特定报表,那它只是应用层的分类。这个标准建议在建模启动会的时候就讲清楚,能省掉后面无数场争论。
2. 三层建模结构中,主题域到底被定义在哪一层
2.1 概念模型层:给业务专家看的那张“地图”
企业级数据模型通常分概念模型、逻辑模型、物理模型三层。概念模型是最精简的一层,画出来一般就是一张图:十个主题域,每个主题域下放几个核心实体,实体之间画几条关系线。这一层的目标不是建模,而是沟通——让业务专家在不需要理解任何技术细节的前提下,确认“我们公司的数据大致分为这几个板块”。
概念模型层虽然简单,但主题域的边界恰恰是在这一层讨论定稿的。很多项目在这一层草草画一张图就算完,直接跳到物理表设计,这等于地基没夯实就盖楼。主题域的命名、个数、边界,必须在这一层和业务专家逐项对齐,一旦确认,后面逻辑模型和物理模型都要严格遵守。
2.2 逻辑模型层:主题域划分真正的主战场
逻辑模型层是FS-LDM真正值钱的地方。这一层在每个主题域内部,把实体、属性、关系按第三范式逐步细化,例如“当事人”域下面会有自然人、法人、机构内部人员等实体,以及他们之间的关联关系;“协议”域下面会有存款协议、贷款协议、担保协议等。到了这一层,数据的业务含义已经完整固化,物理表再怎么调整,逻辑模型都保持不变。
实际操作中,很多团队为了赶工期,从概念模型直接跳到物理建表,逻辑模型被彻底跳过。后果就是主题域只剩一个表名前缀或schema名,实体关系、属性口径全丢,模型退化成一套命名规范,FS-LDM里沉淀的业务经验一点都没用上。如果你希望模型能长期使用,逻辑模型这层不能省,哪怕裁剪,也要留下一套完整的、带属性定义和关系说明的逻辑模型文档。
2.3 物理模型层:主题域如何“翻译”进数据库
物理模型层解决的是性能与存储问题,包括表结构、索引、分区、存储策略等。在物理层,主题域通常体现为库或schema的划分,比如数据仓库的DWD层按主题域组织表,每张表归属一个主题域前缀或schema。这里有一个实践建议:可以允许跨主题域的宽表、汇总表存在,尤其是支撑报表和指标计算的汇总表,但它们的“所属主题域”仍按主业务对象归类,不要另立山头。
更需要注意的是,绝对不要拿物理表反推主题域归属。物理表为了性能会有冗余、有反范式设计、有快照表、有汇总表,一张宽表里可能既有客户信息又有协议信息,如果你从物理表出发定义主题域,模型会被性能和存储带偏,越推越乱。正确的顺序永远是:先有逻辑层的主题域划分,再有物理层的表归属。
3. FS-LDM十大主题域的划分逻辑与边界判定
3.1 十个主题域的全景视图
不同版本资料的FS-LDM,主题域名可能略有差异,但划分思想一脉相承。我按自己在项目里常用的一套中文命名,把最核心的十个主题域整理成一张表,方便对照:
| 主题域 | 职责定位 | 典型实体举例 |
|---|---|---|
| 当事人 | 业务参与者,包括自然人、法人、机构内部人员 | 客户、借款人、担保人、内部行员 |
| 产品 | 可售卖的金融服务与业务产品的定义 | 存款产品、贷款产品、产品定价规则 |
| 协议 | 当事人之间形成的具体契约关系 | 存款合同、贷款合同、担保合同 |
| 事件 | 业务行为与业务过程的事实记录 | 交易流水、还款事件、利息计提事件 |
| 资产 | 被用于抵质押或形成价值的资产 | 抵押房产、质押股权、抵债资产 |
| 财务 | 账务处理与会计核算相关数据 | 科目余额、内部账、损益记录 |
| 区域 | 业务发生的地理位置与组织区域 | 网点、分支机构、省市区地址 |
| 渠道 | 业务触点和交易发生的途径 | 柜面、网银、手机银行、自助设备 |
| 营销活动 | 营销活动定义及活动参与信息 | 活动名单、活动响应记录、权益发放 |
| 通用 | 以上主题域都不归属的通用数据 | 公共代码、汇率、节假日表 |
这张表看上去简单,但每个主题域的粒度定义需要格外注意。比如“事件”域,它包含的是业务行为发生的事实记录,强调的是“发生了什么”;而“财务”域包含的是账务处理与核算结果,强调的是“账上怎么记”。“事件”先发生,“财务”后入账,两者是顺序关系,边界不能混。
3.2 用一笔贷款拉通所有主题域
十个主题域听起来抽象,用一个具体业务串一遍就直观了。假设客户张三申请一笔个人消费贷款:
张三这个人,进入“当事人”域,他的客户信息、身份信息都在这里沉淀。他申请的“等额本息个人消费贷”产品,是银行可售卖的标准化产品定义,进入“产品”域。审批通过后张三签了借款合同,合同编号、额度、利率、期限这些具体契约内容,进入“协议”域。银行放款、张三按月还款,每一笔放款和还款动作产生的事实记录,进入“事件”域。张三用于抵押的房产,进入“资产”域。银行按合同计提利息、确认收入,相关科目记录进入“财务”域。这笔贷款在某个城市的某个支行办理,涉及“区域”域;如果张三是通过手机银行自助申请的,还涉及“渠道”域;如果张三是因为某个营销活动被客户经理拓展来的,还会关联“营销活动”域。
一笔贷款业务,牵动九个主题域。这说明主题域划分不是按业务流程切段,而是按业务对象聚类。同一个业务事实会被拆到多个主题域里,主题域之间的实体关系自然形成跨域的虚线连接,这是模型设计的正常形态。
3.3 三组高频边界判定原则
主题域划分最常见的问题是边界模糊,我列举三组高频判断场景。
第一组:协议 vs 产品。判断标准是“有没有具体的合同编号、有没有当事人双方关系”。有具体合同编号、有借贷关系的真实契约,是协议;只是产品模板、利率定价规则、期限选项,属于产品定义。简而言之,签了字的进协议域,挂在价目表上的进产品域。
第二组:事件 vs 财务。判断标准是“是业务事实,还是记账结果”。交易发生了但没有入账,流水记录是事件;入账后的科目余额、损益记录是财务。当然,FS-LDM里“事件”也可能影响“财务”,但在归属上不能既是事件又是财务,项目里必须定死这个原则。
第三组:当事人 vs 协议。当事人是“参与业务的角色”,协议是“角色之间的关系契约”。张三这个人本身永远在当事人域,他和银行之间的借款契约在协议域。不要因为某个实体和协议强相关,就把它扔进协议域,身份数据和契约数据要分开管。
边界判定没有绝对唯一的答案,但一个团队必须有一套统一的判定原则,并且写进建模规范。遇到争议实体时,建模负责人要拍板,不要追求所有业务线完全一致,只要数据字典里留下归属理由,后续变更就有据可查。
4. 从FS-LDM到自有模型:主题域划分的实际落地步骤
4.1 六步走,把主题域从纸面落到项目里
第一步,圈定业务范围。明确本次建模覆盖哪些业务条线、涉及哪些系统清单,先划定边界,再谈划分。没有边界框架的主题域划分,最后一定会失控。
第二步,识别核心业务事件。从事件出发做梳理,开户、存款、取款、申请贷款、还款、核销、结转……把业务事件清单列出来。事件是业务发生的锚点,围绕事件去反推需要哪些当事人、产品、协议数据,自然比凭空想主题域要高效。
第三步,抽取实体并命名。这一层最容易犯的错是直接用系统表名当实体名,比如把“客户信息表”写成“CIF_TABLE”。正确做法是用业务名词命名,例如“法人客户”“自然客户”“担保人”,实体名要让人不看表结构也能理解业务含义。
第四步,归并到主题域。用FS-LDM的十大主题域做初步归类。归类过程中经常发现两个实体其实描述同一个对象,需要在域内做合并,这是逻辑模型层最耗精力的环节。
第五步,评审对齐。和业务专家、各系统数据负责人逐域确认边界。评审不是为了走流程,而是把“当事人域和协议域的边界是否清晰”“客户和担保人到底算一个实体还是两个实体”这类问题彻底敲定。
第六步,形成逻辑模型并映射物理。整理实体关系图、属性字典、关系说明,形成开发规范。逻辑模型评审通过后,物理表和ETL开发才有依据。
4.2 不是每家企业都需要十个主题域
很多团队看到十大主题域就发愁,担心自己企业体量撑不起这么完整的框架。实际上FS-LDM本来就是可裁剪的。一家没有资金交易业务的城市商业银行,完全可以不建独立的财务域,只在事件域和协议域里保留必要的账务参考属性;一家渠道单一的小型机构,可以把渠道和营销活动合并成一个域。
反过来,大型集团和同业业务机构往往还需要把某个主题域进一步拆细,比如财务域下再分“总账”“分户账”“损益”等子主题域。裁剪原则只有一条:裁剪的是范围子集,不是另起炉灶。FS-LDM里的标准命名、实体关系、属性定义能做参考的尽量保留,否则又会退化成每家一套方言的乱局。
4.3 主题域名和编码规范,看着小事坑最深
主题域名称建议用业务短语,不要用系统缩写。我遇到过一个真实案例,某公司的主题域名直接用系统代号命名,后来源系统下线,整个主题域没人知道对应什么业务,模型文档几乎作废,重建成本极高。
编码规范建议尽早定下来。主题域可以用两位或三位英文编码加中文名,例如PTY表示当事人、AGR表示协议、EVT表示事件。实体命名遵循主题域编码加实体英文名的格式,全公司统一。这个规范越早定,后面数据资产目录、指标血缘、数据权限管理都会省力很多。
4.4 评审会议不要开成“辩论赛”,要有标准问题清单
我参加过不少主题域评审会,低效的会都有一个共同特征:没有判定标准,全靠个人感觉。后来我习惯用一组标准问题来引导评审,效果立竿见影:
- 这条数据描述的对象是谁?是“参与业务的角色”还是“角色之间形成的契约”?
- 它是业务发生的事实记录,还是业务发生后形成的账务结果?
- 它是可以批量售卖的模板,还是已经和客户签订的具体合同?
- 换一个系统来看,这条数据还应该属于同一个主题域吗?
这四个问题基本能覆盖九成以上的边界争议。对于剩下的争议实体,用“建模负责人拍板 + 数据字典记录归属理由”的方式处理,比没完没了开会更务实。主题域划分的最终目标不是让每个业务部门都满意,而是让全公司有一份统一、稳定的数据语言。
5. 主题域划分完之后,还要接上数据资产和治理的最后一公里
5.1 数据资产目录要以主题域为一级骨架
主题域划分完成,画完图不是终点,它应该成为数据资产目录的一级分类。规范的资产目录层级是:主题域、业务数据对象、实体、属性。用户找数据时最先问的是“我要看客户、协议还是事件”,而不是“我要看哪张表”,所以主题域作为入口最自然。
我在项目里通常这样组织:一个主题域对应资产目录的一个一级节点,其下先列业务数据对象,再展开实体的属性清单。属性要做到一一映射到物理表字段,这样数据地图、数据检索、数据权限申请都能挂在这套结构上,资产目录才真正可运营。
5.2 指标落地要有主题域归属,不能挂在报表上
指标字典建设经常犯一个错:指标挂在报表下面,报表下线指标就失联。正确做法是把指标挂在主题域下。比如“存款余额”是协议域指标,“不良贷款率”是协议域或资产域指标,“客户流失率”是当事人域指标。主题域是稳定的,报表会不停变化,指标挂在主题域下,即使支撑它的报表下线了,指标的组织位置也不会消失。
做指标血缘分析时,主题域层面的归属也能快速圈定影响范围。某个主题域的数据质量出问题,能直接回溯到哪些指标、哪些报表受影响,治理效率会明显提升。
5.3 每个主题域都要有数据owner,模型才不会烂尾
主题域划分得再漂亮,没有数据owner就等于没人负责。数据owner虽然更多是治理范畴的事,但建议在建模启动阶段就把每个主题域对应的责任人岗位列进责任矩阵。当事人域的数据owner要管客户身份要素质量,协议域的数据owner要管金额、利率、期限准确性,事件域的数据owner要管流水完整性。
数据质量规则也建议按主题域配置。你不可能给几千张表逐张配质量规则,但你可以给每个主题域配置一套核心质量规则,再下钻到关键实体和关键属性的技术规则。一个主题域的质量分出来了,整个域的数据健康度也就有数了。
5.4 主题域层面的变更管理要克制
主题域级变更属于企业级模型的重型变更,不能频繁发生。我的实践经验是:三个月内不要随便加域,至少半年做一次整体评审。日常新增实体时,先尝试放入已有主题域,确实找不到归属再考虑开新域,而开新域必须经过数据治理层面的评审。
另外我习惯保留“通用”域作为临时存放区,但要求每季度清空一次。这样做的好处是,建模过程中暂时无法判定归属的实体可以先放进去,不阻塞开发进度,同时强制性地每个季度清理一次,防止它变成谁也不管的垃圾桶。主题域框架的稳定性,是靠这种“能不开新域就不开新域”的克制维持的。
最后说点个人体会。我用FS-LDM做主题域划分,前后经历过好几个项目,最大的感受是:画一张主题域全局图最多一周时间,真正耗时间的是让所有团队对边界达成一致。有些团队一开始想“一次到位”,把所有域全部细化到实体,评审会开了两个月,大家越吵越细;后来改成先定六个核心域,跑通数据链路后再扩展财务、区域这些辅助域,反而顺利得多。
如果你正准备在自己公司推主题域模型,我建议优先从事件域开始梳理。事件是业务发生的锚点,把事件域理清了,当事人、产品、协议、渠道、财务这些域会自动围着它转,主题域之间的跨域关系也会自然浮现。主题域不是画出来的,是一轮一轮业务对齐全出来的——这句话我用了很多年,希望对你也有用。