4. 数据模型设计:投研数据分类、实体关系建模、标签体系设计、数据字典规范

数据模型设计,说白了就是给投研平台搭骨架。

我见过太多团队,一上来就写代码,结果数据越存越乱,最后连自己都搞不清「这个字段到底存的是什么」。嗯,今天我们就聊聊怎么把这块地基打牢。

4.1 投研数据分类:先分清楚家里有什么

我个人习惯,先把数据分成三大类。这样后面建模才不会乱。

分类 说明 举例
基础数据 相对稳定的底层数据 公司信息、行业分类、交易日历
行情数据 高频变动的市场数据 日K线、分钟线、实时报价
投研数据 分析师产出的核心数据 研究报告、财务预测、估值模型

你想想看,如果把行情数据和投研数据混在一起存,查询效率会非常低。我在项目中遇到过,有人把研报的PDF直接塞进数据库的BLOB字段里,结果一张表几十个G,备份一次要两小时。后来我们拆成了文件存储+元数据索引,问题才解决。

核心原则: 按数据更新频率和访问模式分类,不要把所有鸡蛋放在一个篮子里。

4.2 实体关系建模:画清楚谁跟谁有关系

实体关系建模,就是搞清楚「公司」和「研报」之间是什么关系。

我一般用ER图来画。核心实体就这几个:

  • 公司(Company):股票代码、公司名称、行业、上市日期
  • 研报(Report):报告ID、标题、分析师、发布日期、评级
  • 财务数据(Financial):报告期、营收、净利润、EPS
  • 标签(Tag):标签ID、标签名称、标签分类

它们之间的关系是这样的:

公司 研报 财务数据 标签 1:N 1:N M:N

这张图看着简单,但实际落地时坑不少。举个例子:一家公司可能被多家券商覆盖,一份研报也可能涉及多家公司(比如行业对比报告)。所以「公司」和「研报」之间其实是多对多的关系,需要一张关联表来解耦。

避坑指南: 我曾经在设计时忽略了「研报版本」这个实体。结果同一份研报更新了三次,数据库里只有一条记录,历史版本全丢了。后来加了版本号字段,才把坑填上。

4.3 标签体系设计:给数据打上「记号」

标签体系,说白了就是给数据贴标签。但怎么贴、贴什么,这里头有讲究。

我建议把标签分成三层:

  1. 基础标签:行业、板块、市值区间等客观属性
  2. 业务标签:成长股、价值股、周期股等分析维度
  3. 行为标签:近期被调研、评级上调、机构重仓等动态信息

为什么要分层?因为不同角色的关注点不一样。研究员可能更关心业务标签,而交易员可能更关注行为标签。分层之后,查询效率会高很多。

设计原则: 标签要「可枚举、可组合、可继承」。比如「消费电子」这个标签,可以继承「电子」和「消费」两个父标签。

4.4 数据字典规范:让每个人说同一种语言

数据字典,就是给每个字段写「说明书」。没有数据字典的数据库,就像没有菜单的餐厅——你永远不知道端上来的是什么。

我一般要求数据字典包含以下内容:

字段名 类型 长度 说明 示例
stock_code VARCHAR 10 股票代码,A股用6位数字 600519
report_title VARCHAR 200 研报标题,不含副标题 贵州茅台深度研究
rating ENUM - 评级:买入/增持/中性/减持 买入
eps_ttm DECIMAL 10,4 滚动市盈率,保留4位小数 2.3567

你可能会问:「字段名用中文不行吗?」我的建议是——别。字段名用英文,注释用中文。这样既方便程序调用,也方便人阅读。

注意: 数据字典不是写一次就完事了。每次表结构变更,都要同步更新数据字典。我曾经吃过这个亏——改了字段类型忘了更新文档,结果下游系统解析报错,排查了整整一天。

4.5 小结:数据模型设计的三条铁律

最后,我总结三条经验,供你参考:

  • 先分类,后建模:数据分类决定了存储策略,别上来就建表
  • 标签要分层:一层标签解决不了所有问题,三层刚刚好
  • 字典要活着:数据字典不是摆设,要跟着数据库一起迭代

数据模型设计这块,说白了就是「磨刀不误砍柴工」。前期多花点时间把模型理清楚,后面写代码、做报表、跑模型,都会顺畅很多。嗯,今天就聊到这儿,下一节我们聊聊数据采集和清洗的那些事儿。


专注资料整理