很多人背过数据模型三要素的另一个版本,换成数据集、数据视图、数据模式就懵了,不知道这三个词各指哪一层、为什么要放一起说。这篇不堆定义,先把三者的边界划清,再给一套能拿去做事的对照方法和排查顺序,顺带说清什么场景下这套划分并不好使。
很多人背过的数据模型三要素是另一个版本,一换成数据集、数据视图、数据模式就发懵:这三个词看着都眼熟,但不知道各指哪一层,更不知道为什么要把它们放一起说。这篇不堆定义,先把边界划清楚,再给一套能直接拿去做事的对照方法和排查顺序,最后说清什么场景下这套划分其实不好使。
先说结论:数据集管「有哪些数据」,数据视图管「从哪个角度看」,数据模式管「结构怎么定、约束是什么」。三者叠在一起,才等于一个别人敢用的数据模型。缺一个,要么是「有数据没人敢用」,要么是「有结构没数据」,两种情况在真实项目里都很常见。
先搞清楚这三个词各管什么
这三个词最容易被混着用,是因为它们经常出现在同一段需求描述里。分开看就简单了:数据集是名词,指的是能被人引用、能打版本、能说清来源的那一批数据;数据视图是从这批数据里裁剪出来的角度,面向不同角色、不同用途;数据模式是规则本身,字段叫什么、什么类型、能不能为空、谁跟谁关联。
- 数据集管的是「有哪些数据」:一份可被引用、可被版本化的数据集合,跟它存在哪、用什么格式存没关系;
- 数据视图管的是「从哪个角度看这批数据」:给不同角色、不同用途裁剪出来的子集与字段口径;
- 数据模式管的是「结构怎么定、约束是什么」:字段名、类型、是否可空、主外键这类规则;
- 三者叠在一起才等于一个能用的数据模型,缺一个就会出现「有数据没人敢用」或「有结构没数据」的尴尬
| 要素 | 回答的问题 | 典型产物 | 改动它谁受影响 |
|---|---|---|---|
| 数据集 | 有哪些数据 | 表、主题域、数据源清单 | 下游所有引用方 |
| 数据视图 | 从哪个角度看 | 报表视图、接口字段、角色权限集 | 用到该视图的报表与接口 |
| 数据模式 | 结构怎么定 | 字段定义、类型、约束、关系 | 所有依赖该结构的数据与视图 |
三者怎么咬合:一次改动的传导顺序
教科书式的顺序是先定模式、再圈数据集、最后开视图。但真实项目里改需求时,顺序常常是反的:先有人提「我要看这个维度的数据」,也就是先冒出一个视图需求,才回头去动数据集和模式。理解这一点,比记住名词重要得多。
判断一次改动风险大不大,就一个标准:它同时碰到几层。只加一个视图最轻,动数据集中等,动模式最重,因为模式一变,所有依赖它的视图都得重新核一遍。团队里把「谁负责模式、谁负责视图」写清楚,比争论该把它们叫什么名词有用得多。
- 只改视图
- 最轻,换口径或加减字段,影响范围通常只限那一两个报表或接口
- 改数据集
- 中等,数据来源或范围变了,所有引用方都要确认还能不能对得上
- 改模式
- 最重,字段名、类型、约束一变,所有依赖结构的东西都要重新核
- 三层联动
- 最麻烦,通常说明需求本身没想清楚,建议先停下来对齐口径
上手前的对照清单与排查顺序
真开始干活的时候,按下面这个顺序走,能少绕很多弯。第一步问数据从哪来、更新频率多高、谁能改,先把数据集这一层落下来;第二步列出所有使用方和各自要看的字段,据此拆视图,别急着建一张大宽表;第三步才定模式,类型和约束宁严勿松,因为这三层里改起来代价最小的恰恰是视图。
- 落数据集确认数据来源、更新频率、谁能改;能拉到一份小样本最好,先把范围圈住。
- 拆视图列出全部使用方和各自关心的字段,按角色和用途拆,不要用一张宽表糊弄所有人。
- 定模式字段名、类型、约束、关系一次写清;改起来代价最小的是视图,所以这一层宁严勿松。
- 按顺序排查数据对不上,先查视图口径;视图没错,再查数据集版本;最后才怀疑模式定义。
- 小样本回归改完任何一层,用一份小样本从头到尾跑一遍,确认三层仍然对得上再收工。
顺带提一句,涉及工具选型和数据管道搭建时,别人的实测结论只能当参考。想看当下的通行做法和数字,可以到 /tools/speed-test 核对当时的实际情况,再结合自己的数据量做判断。
什么情况下这套划分不适用
任何一套划分都有它管不到的地方,这套三要素也一样。硬套在不适用的场景里,不是严谨,是给自己找活干。下面几种情况值得停一下,别急着往上套。
- 流式、事件驱动场景里没有稳定的「数据集」概念,硬套等于给每个时间窗造一份假数据集;
- 以文档型、键值型存储为主的项目,模式约束本来就弱,把模式当强规范会拖慢迭代;
- 单人小项目、数据量小到一个文件能装下时,分三层是纯负担,一层够用就别硬拆;
- 跨组织数据交换时,真正卡人的往往是口径和授权而不是层级,这三要素解决不了那类问题
再补一个判断标准:如果一个改动你花在「这到底算数据集还是算视图」上的时间比动手实现还多,那说明当前的划分颗粒度不适合这个项目,直接按团队能共识的口径来,别为了名词对齐搭进去半天。
划分是为了减少沟通成本,一旦它本身变成沟通成本,就该换一套。下一步把这三层跟你手上正在做的项目对一遍,看有没有哪一层是空的;想横向比较不同方案的落地表现,可以去 /sites 和 /price-watch 看看各类工具与数据的当时情况,再回来决定要不要拆层。→
常见问题
数据集、数据视图、数据模式,哪个最应该先定?
没有固定答案,取决于你在改什么。新建项目通常先定数据集来源和模式骨架,再把视图按使用方拆开;如果是接手已有系统改需求,就从视图倒推,先确认使用方到底要看什么,再回头核数据集和模式。判断依据是改动代价,先动改起来最便宜的那层。
数据视图和数据库里的视图是一回事吗?
不完全是。数据库视图是一种实现手段,这里说的数据视图更偏逻辑概念,指面向某类使用方的数据口径。它可以用数据库视图实现,也可以是一张中间表、一段查询或一层接口。别把概念和实现绑死,否则换技术栈时整个模型设计都要重来。
三个要素里哪个最容易出错?
通常是视图。因为数据集有来源可查、模式有约束可验,唯独视图的口径是人为约定的,容易同名字段在不同使用方那里含义不一样。落地时可以给每个视图写一行用途说明和字段口径,改动时逐个核,成本不高但能挡掉大部分对不上的问题。