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

127 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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;
```