1. 背景
笔者所在的公司是差不多二十年前搞CIM(公共信息模型的)起家的。当时公司的前辈搞了基于CIS协议的模型服务器、数据服务器、模式编辑器等,形成了一套基于公共信息模型建模的平台系统。其中可视化建模,建好了模式类以后,就有一套面向对象的接口,可以对数据进行增删改查的特性,让我记忆深刻,与使用JDBC或者JPA开发代码操纵数据形成鲜明的对比。在我看来,随着时代的发展,那一套产品已经显得有些不合时宜了,在此处不想去例举太多理由,但我始终觉得其思想仍然有非常多闪光的地方。我一直认为产品可能会落伍、有时代和技术的局限性,但人类解决问题的思路和思想却不会过时。所以我很早就开始构思在大数据平台里面,借鉴这套思想实现一套能和大数据平台契合的“数据建模”模块。
恰好现在有这样一个项目机会,能让我可以开始把它实现出来。幸运的是,笔者构建整个大数据平台的产品,基本都是有相应的项目实践场景,能让我理论和实际相结合,避免造出一个空中楼阁。说实在的,这很累,一边做项目,带新人,一边还得开发大数据平台,作为项目和产品的负责人,很多东西并不总是有可以借鉴的,在真正把产品实现,把路走通之前,眼前经常是迷雾重重的。特别是在做可视化实时计算的时候,那真是一种绝望地坚持,还好走通了,让平台在流式计算、实时同步方面有了坚强的支柱。为数据资产的后台数据推送发布和同步提供了实时同步能力。
2. 数据建模的功能目标
- 基础建模功能。包括以下功能点:
- 基于关系数据库的物理层建模能力
- 基于涛思库的时序数据物理层建模能力
- 以物理层为基础轻度的业务层建模能力。包括提供基于单表、多表同对象id连接、关联连接的模式类定义能力。
- 支持字典数据定义
- 支持EventLog型模式类定义。
- 支持将外部数据源引入进行,将其中的某些表定义为模式类,从而能利用系统基于模型的数据服务能力
模型定义的通用数据访问接口
- 基于模型的通用数据增、删、改、查接口。
- 模型定义的接口(对模式类的操纵将自动作用于数据库表):
- 创建模式类定义的接口
- 修改模式类定义的接口
- 删除模式类定义的接口
- 分页过滤查找模式类接口
- 取得指定id或名称的模式类接口
- 对于关系型模型,提供以下接口:
- 创建指定类型的对象
- 更新指定对象
- 删除指定对象
- 分页取得指定类型对象的接口
- 自动维护parentId(父节点id),pathName(路径名)、pathId(id路径)、createTime(创建时间)、createUserId(创建者Id)、lastEditTime(最近更新时间)、lastEditUserId(最近编辑者用户id)等特性的字段。
- 对于有parentId特性字段的表,提供树形查询接口
- 模型定义的接口(对模式类的操纵将自动作用于数据库表):
- 可视化建模能力。提供类似UML的可视化建模能力。能在上面增删改查模式类,查看模式类之间的关联关系。
- 模型的操作审计、模型版本冻结、模型反演功能。对通过接口对模型进行的增删改操作,有以下能力:
- 将记录操作内容。
- 支持模型版本冻结。
- 支持从某一冻结版本开始,根据操作内容反演出任一时刻、任一操作时的模型。
- 模型实例数据的操作审计、模式类数据版本冻结、模式类数据反演功能
- 在模型的版本冻结和模型反演能力基础上,支持对于完全通过接口进行增删改实例数据的某一类数据:
- 支持操作内容记录
- 支持某一类数据进行版本冻结
- 支持从某一冻结版本开始,根据操作内容反演出任一时刻、任一操作时的数据。
- 基于模型的定制化数据发布能力。基于模型中的模式类,勾选其中某些字段,生成过滤查找、搜索的接口。系统将自动根据选择的过滤查找字段,进行索引优化。分局需要会修改、创建索引。
- 对于已建模的涛思时序数据,提供常用的通用时序数据访问接口。
- 对于已建模的存储在关系数据库中的EventLog数据,提供通用的Event访问接口。
3. 数据建模的模块架构
在大数据平台里面的“数据建模”和CIM建模有些许不同。CIM(公共信息模型)建模是一种业务层数据建模,它有类,继承、属性、角色/关联的概念,注重类型,没有描述继承和关联该怎么建表。 而此处的“数据建模”是偏向物理层的建模,以更好地适应大数据平台环境下数据集成、数据分析所需,所以废除了继承,通过组合实现类似继承的效果,在一定程度上能表达业务层的类型概念。
在现在的数据平台上有一种现象,就是对于一对一关联,通常在实体表中建一个字段来存储;对于一对多关联,一般通过实体表的一个字段或关联表存储;对于多对多关联,通常用关联表存储,但以上情形都不会建外键约束。数据建模中通过定义关联,记录了这种关联关系,并没有建外键。
作为大数据平台中的数据建模,很重要的一点是保持它的开放性和包容性。开放性主要体现在偏物理层建模,方便数据集成和数据分析,包容性体现在可以将外部的数据源通过定义的方式引入到建模平台中,获得和自建模型相同的接口服务。当然引入的外部数据源,数据建模工具是不会修改其数据表的。
4. 数据建模的意义
主要有以下几点:
- “设计即开发”。建模的过程就获得了通常情况下已经够用的增、删、改、查接口。节省了接口开发时间,增加了可控性。
- 可以将其作为一种已定义的数据资产,在“数据资产”中,可以将其纳入到数据资产目录中,方便管控和发布。
- 方便和“智能助理”模块对接,获得基于大模型的问答获取数据的能力。