4、数据架构管理:数据模型设计、元数据管理、主数据管理、数据字典建设
数据架构管理,说白了就是给数字孪生平台搭骨架。骨架搭不好,后面再多的数据也撑不起来。我做了这么多年数据治理,见过太多项目在架构上栽跟头——要么模型设计得过于理想化,跑不动;要么元数据一团乱麻,查个字段得翻半天文档。
今天咱们就把这块掰开揉碎了讲。核心就四个东西:数据模型设计、元数据管理、主数据管理、数据字典建设。它们之间的关系,我画了张图,你先看个全貌。
4.1 数据模型设计:别让业务和技术打架
数据模型设计,是数据架构的起点。我个人的习惯是,先画概念模型,再画逻辑模型,最后才落到物理模型。三步走,一步都不能跳。
概念模型,说白了就是跟业务方聊出来的。比如数字孪生平台里,有「设备」、「产线」、「工厂」、「订单」这些实体,它们之间是什么关系?一台设备属于哪条产线?一个订单对应哪些产品?这些用简单的方框和连线画清楚就行。
逻辑模型,就要开始加属性了。比如「设备」这个实体,得有设备ID、设备名称、设备类型、安装位置、运行状态……嗯,这里要注意,属性名最好用英文,但注释一定要写中文。我在项目中遇到过,有些团队图省事,属性名直接用拼音缩写,结果半年后自己都看不懂了。
物理模型,就是真正落地到数据库里的表结构。这时候要考虑性能、存储、索引。举个例子:
-- 设备表物理模型示例
CREATE TABLE dim_device (
device_id VARCHAR(32) NOT NULL COMMENT '设备唯一标识',
device_name VARCHAR(128) NOT NULL COMMENT '设备名称',
device_type VARCHAR(32) NOT NULL COMMENT '设备类型编码',
location_code VARCHAR(16) NOT NULL COMMENT '安装位置编码',
status TINYINT DEFAULT 1 COMMENT '状态:1-运行 2-停机 3-维修',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (device_id),
INDEX idx_location (location_code),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='设备维度表';
ext_info JSON 字段兜底。
4.2 元数据管理:数据的数据,比数据本身还重要
元数据是什么?就是「数据的数据」。你想想看,一个数字孪生平台里可能有上千张表、上万个字段。如果没有元数据管理,你根本不知道某个字段是什么意思、从哪里来的、被哪些应用用过。
元数据管理分三类:
- 技术元数据:数据库表结构、字段类型、索引、分区信息等。这些通常可以从数据库系统表中自动采集。
- 业务元数据:字段的业务含义、计算逻辑、数据质量规则等。这部分需要业务人员参与维护。
- 操作元数据:数据抽取时间、处理记录、访问日志等。用于追踪数据流转过程。
我个人最看重的是数据血缘。说白了,就是能查清楚「这个字段的数据是从哪个源系统来的,中间经过了哪些加工」。我曾经在一个项目里,发现某个报表数据对不上,顺着血缘一查,发现是上游一个ETL脚本改了字段映射,但下游没同步更新。如果没有血缘追踪,这种问题查起来就像大海捞针。
4.3 主数据管理:数字孪生的「身份证」系统
主数据,就是那些跨系统、跨业务共享的核心数据。在数字孪生场景里,主数据通常包括:设备主数据、物料主数据、组织主数据、人员主数据等。
主数据管理的核心目标就一个:一数一源,一源多用。同一个设备,在MES系统里叫「设备A」,在ERP系统里叫「DEV-001」,在数字孪生平台里叫「设备#1」——这肯定不行。必须有一个统一的主数据标识,所有系统都认这个ID。
怎么做?我建议分三步走:
- 主数据识别:梳理出哪些数据是主数据。标准很简单——如果这个数据被三个以上系统使用,那它大概率就是主数据。
- 主数据建模:定义主数据的属性结构、编码规则、校验规则。比如设备编码,我习惯用「设备类型(2位)+工厂代码(3位)+流水号(5位)」的格式。
- 主数据分发:主数据变更后,要能实时或准实时地同步到所有下游系统。这里我推荐用消息队列,比如Kafka,保证数据一致性。
| 主数据类别 | 典型属性 | 编码示例 | 来源系统 |
|---|---|---|---|
| 设备主数据 | 设备ID、名称、型号、位置、状态 | EQ-PL01-00001 | MES/SCADA |
| 物料主数据 | 物料编码、名称、规格、单位 | MAT-10001 | ERP |
| 组织主数据 | 组织编码、名称、层级、负责人 | ORG-0101 | HR系统 |
| 空间主数据 | 位置编码、名称、坐标、所属区域 | LOC-A1-001 | GIS/规划系统 |
4.4 数据字典建设:给数据立规矩
数据字典,就是给每个字段立规矩。它规定了字段叫什么、什么类型、取值范围、业务含义。没有数据字典,数据就是一堆乱码。
数据字典建设,我建议从三个维度入手:
- 字段级字典:每个字段的名称、类型、长度、精度、默认值、是否必填、注释。这是最基础的。
- 编码级字典:枚举值的含义。比如设备状态字段,1代表什么、2代表什么,必须统一。我习惯用一张单独的字典表来维护。
- 标准级字典:跨系统的数据标准。比如日期格式统一用YYYY-MM-DD,金额单位统一用元,等等。
举个例子,设备状态字典表的设计:
-- 数据字典表结构
CREATE TABLE sys_dict (
dict_code VARCHAR(32) NOT NULL COMMENT '字典编码',
dict_name VARCHAR(64) NOT NULL COMMENT '字典名称',
item_code VARCHAR(32) NOT NULL COMMENT '字典项编码',
item_value VARCHAR(128) NOT NULL COMMENT '字典项值',
sort_order INT DEFAULT 0 COMMENT '排序',
status TINYINT DEFAULT 1 COMMENT '状态',
PRIMARY KEY (dict_code, item_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据字典表';
-- 设备状态字典数据
INSERT INTO sys_dict VALUES ('DEVICE_STATUS', '设备状态', '1', '运行中', 1, 1);
INSERT INTO sys_dict VALUES ('DEVICE_STATUS', '设备状态', '2', '停机', 2, 1);
INSERT INTO sys_dict VALUES ('DEVICE_STATUS', '设备状态', '3', '维修中', 3, 1);
INSERT INTO sys_dict VALUES ('DEVICE_STATUS', '设备状态', '4', '报废', 4, 1);
嗯,数据架构管理这块,说白了就是四个字:标准先行。模型设计定结构,元数据管理定描述,主数据管理定核心,数据字典定规矩。四者缺一不可。你想想看,如果这四个基础打好了,数字孪生平台的数据底座就稳了,后面做分析、做可视化、做仿真,都会顺畅很多。