Files
aiot-platform-cloud/docs/technical-overview/05-数据存储设计.md

5.2 KiB
Raw Blame History

Part 5: 数据存储设计

文档定位:详细阐述平台的混合存储架构,明确不同类型数据的存储选型、模型设计及数据流转策略。

5.1 存储选型策略

AIoT 平台的数据呈现出明显的冷热分层结构差异,因此采用“一主多从、动静分离”的混合存储策略。

数据类型 典型特征 选型方案 选型理由
业务元数据 强事务一致性、关联查询多、数据量中等 MySQL 8.0 关系型数据库事实标准,生态成熟,支持复杂事务。
设备遥测数据 数据量极巨大、写多读少、时序性强、无需事务 TDengine 3.0 专为物联网设计的时序数据库,写入性能是传统 DB 的 10 倍以上,支持超级表聚合查询。
热点/缓存数据 读多写多、对延迟极度敏感 (ms级) Redis 7.0 内存数据库用于缓存设备在线状态、Token、分布式锁。
非结构化数据 图片、视频片段、Excel 报表 MinIO S3 兼容的对象存储,支持分布式部署与纠删码容错。

5.2 关系型数据库设计 (MySQL)

核心业务数据存储于 MySQL采用 aiot_platform 库(逻辑上可拆分)。

5.2.1 核心 ER 关系图

  • 多租户模型system_tenant (租户) 1:N system_users (用户) / iot_device (设备)。
  • 业务闭环iot_device (设备) 1:N iot_device_event (告警) 1:1 ops_work_order (工单)。

5.2.2 关键表结构说明

1. 设备表 (iot_device)

设备的“户口本”,存储设备的静态属性与认证信息。

字段名 类型 说明 备注
id BIGINT 设备主键 分布式 ID
product_id BIGINT 产品ID 关联产品物模型
device_name VARCHAR 设备编码 唯一标识(如 IMEI、SN
auth_type VARCHAR 认证方式 Secret / Certificate / None
device_secret VARCHAR 设备密钥 一机一密模式下使用
status TINYINT 启用状态 0-禁用1-启用
tenant_id BIGINT 租户ID 多租户隔离键

2. 工单表 (ops_work_order)

业务运营的核心载体,与 Flowable 流程实例绑定。

字段名 类型 说明 备注
id BIGINT 工单主键
work_order_no VARCHAR 工单编号 业务唯一,带日期前缀
type VARCHAR 工单类型 REPAIR(维修), CLEAN(保洁), PATROL(巡逻)
priority INT 优先级 1-低, 2-中, 3-高
status VARCHAR 状态 PENDING, PROCESSING, FINISHED
process_instance_id VARCHAR 流程实例ID 关联 Flowable 流程
device_id BIGINT 关联设备 可为空(非设备类工单)

5.3 时序数据库设计 (TDengine)

用于存储海量的设备上报消息与日志,采用 “超级表 (Super Table)” 设计模式。

5.3.1 模型设计思路

  • 一个超级表:定义同一类数据(如“设备消息”)的通用 Schema。
  • 一个设备一张子表:每个设备对应超级表下的一个子表,子表名通常为 d_{deviceId}
  • 标签 (Tags):将设备的元数据(device_id, product_id, tenant_id)作为 Tag便于按维度聚合查询例如查询某租户下所有设备的平均温度

5.3.2 消息超级表 (iot_device_message)

存储所有从 Gateway 流入的原始消息及解析后的 Payload。

Schema 定义 (Fields):

字段名 类型 说明
ts TIMESTAMP 消息上报时间(主键)
method NCHAR(64) 消息类型 (jt808.loc.report)
params JSON 消息体JSON 格式存储)
code INT 响应码
data JSON 响应数据

Tags 定义:

标签名 类型 说明
device_id BIGINT 设备 ID
product_id BIGINT 产品 ID
tenant_id BIGINT 租户 ID

建表语句示例:

CREATE STABLE iot_device_message (
    ts TIMESTAMP, 
    method NCHAR(64), 
    params JSON, 
    code INT
) TAGS (
    device_id BIGINT, 
    product_id BIGINT, 
    tenant_id BIGINT
);

5.4 缓存设计 (Redis)

5.4.1 Key 命名规范

遵循 模块:业务:ID 的格式,例如 iot:device:online:1001

5.4.2 核心缓存场景

  1. 设备在线状态
    • Key: iot:device:online:{deviceId}
    • Value: String ("ONLINE" / "OFFLINE")
    • TTL: 动态续期(心跳间隔 * 1.5
  2. 鉴权 Token
    • Key: iot:auth:{token}
    • Value: DeviceDetail JSON
    • TTL: 2 小时
  3. 防重锁
    • Key: lock:device:cmd:{deviceId}:{cmdId}
    • Value: Timestamp
    • TTL: 5 秒(防止指令短时重复下发)

5.5 数据归档与清理

  • MySQL: 业务数据原则上永久存储。对于极早期3年以上的历史工单可迁移至历史库。
  • TDengine: 利用其 TTL 特性,配置数据保留策略(例如保留 180 天)。
    ALTER DATABASE aiot_db KEEP 180;