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='设备维度表';
我的经验:物理模型设计时,一定要预留扩展字段。我曾经在一个项目里,设备属性从10个涨到30个,就因为当初没留扩展位,后面改表结构改到崩溃。建议加一个 ext_info JSON 字段兜底。

4.2 元数据管理:数据的数据,比数据本身还重要

元数据是什么?就是「数据的数据」。你想想看,一个数字孪生平台里可能有上千张表、上万个字段。如果没有元数据管理,你根本不知道某个字段是什么意思、从哪里来的、被哪些应用用过。

元数据管理分三类:

  • 技术元数据:数据库表结构、字段类型、索引、分区信息等。这些通常可以从数据库系统表中自动采集。
  • 业务元数据:字段的业务含义、计算逻辑、数据质量规则等。这部分需要业务人员参与维护。
  • 操作元数据:数据抽取时间、处理记录、访问日志等。用于追踪数据流转过程。

我个人最看重的是数据血缘。说白了,就是能查清楚「这个字段的数据是从哪个源系统来的,中间经过了哪些加工」。我曾经在一个项目里,发现某个报表数据对不上,顺着血缘一查,发现是上游一个ETL脚本改了字段映射,但下游没同步更新。如果没有血缘追踪,这种问题查起来就像大海捞针。

避坑指南:我曾经见过一个团队,元数据全靠Excel维护。结果版本一多,根本分不清哪个是最新的。我的建议是,一定要用专门的元数据管理工具,比如Apache Atlas或者自建元数据平台。元数据要自动化采集,人工维护只做补充。

4.3 主数据管理:数字孪生的「身份证」系统

主数据,就是那些跨系统、跨业务共享的核心数据。在数字孪生场景里,主数据通常包括:设备主数据、物料主数据、组织主数据、人员主数据等。

主数据管理的核心目标就一个:一数一源,一源多用。同一个设备,在MES系统里叫「设备A」,在ERP系统里叫「DEV-001」,在数字孪生平台里叫「设备#1」——这肯定不行。必须有一个统一的主数据标识,所有系统都认这个ID。

怎么做?我建议分三步走:

  1. 主数据识别:梳理出哪些数据是主数据。标准很简单——如果这个数据被三个以上系统使用,那它大概率就是主数据。
  2. 主数据建模:定义主数据的属性结构、编码规则、校验规则。比如设备编码,我习惯用「设备类型(2位)+工厂代码(3位)+流水号(5位)」的格式。
  3. 主数据分发:主数据变更后,要能实时或准实时地同步到所有下游系统。这里我推荐用消息队列,比如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);
我的习惯:数据字典一定要版本化管理。每次修改都要记录变更人和变更原因。我曾经在一个项目里,因为有人偷偷改了字典值没通知大家,导致下游系统解析数据全部出错。从那以后,我要求所有字典变更必须走审批流程。

嗯,数据架构管理这块,说白了就是四个字:标准先行。模型设计定结构,元数据管理定描述,主数据管理定核心,数据字典定规矩。四者缺一不可。你想想看,如果这四个基础打好了,数字孪生平台的数据底座就稳了,后面做分析、做可视化、做仿真,都会顺畅很多。


专注资料整理