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

127 lines
5.2 KiB
Markdown
Raw Normal View 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 |
**建表语句示例:**
```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;
```