127 lines
5.2 KiB
Markdown
127 lines
5.2 KiB
Markdown
# 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;
|
||
```
|