# 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 | **建表语句示例:** ```sql 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 天)。 ```sql ALTER DATABASE aiot_db KEEP 180; ```