21 lines
1.7 KiB
Markdown
21 lines
1.7 KiB
Markdown
|
|
# Change: 升级心跳数据库为高吞吐日分区模型(v2)
|
|||
|
|
|
|||
|
|
## Why
|
|||
|
|
现有实现仅包含简化的 `heartbeat` 表(component/status/timestamp),无法满足“每分钟约 5 万条记录、按酒店/时间范围检索、按状态聚合”的高吞吐与长期存储需求。
|
|||
|
|
|
|||
|
|
## What Changes
|
|||
|
|
- **DB**:在既有数据库(默认 `log_platform`)内新增/升级为按 `ts_ms`(毫秒 epoch)日分区的心跳明细表,并提供分区预创建机制
|
|||
|
|
- **DB**:补齐指定索引(hotel_id/power_state/guest_type/device_id B-tree;service_mask BRIN)与约束(NOT NULL、CHECK、IP 格式)
|
|||
|
|
- **Docs**:补充 Kafka 生产者推送数据结构与推送方式说明
|
|||
|
|
|
|||
|
|
## Impact
|
|||
|
|
- Affected specs: `openspec/specs/db`, `openspec/specs/kafka`, `openspec/specs/processor`
|
|||
|
|
- Affected code: 未来 `src/db/databaseManager.js` 的表初始化/写入字段将需要适配(本变更提案先聚焦 DB 结构与脚本)
|
|||
|
|
|
|||
|
|
## Key Decisions / Risks (需要明确)
|
|||
|
|
- **分区 + 主键冲突风险**:PostgreSQL 分区表的全局唯一/主键通常需要包含分区键;需求写“主键仅 id(bigserial)”。
|
|||
|
|
- 本次脚本将采用 `PRIMARY KEY (ts_ms, id)` 来保证可创建与可执行。
|
|||
|
|
- **device_id 类型待确认**:脚本暂定为 `varchar(64)`(兼容序列号/MAC/混合编码);若确定为纯数字,可改为 `bigint` 获得更紧凑索引。
|
|||
|
|
- **中文排序规则**:不新建库时无法修改数据库级 collation;若需要中文排序建议使用 ICU collation(列级/表达式级)。
|
|||
|
|
- **自动建分区方式**:PostgreSQL 在单条 INSERT 执行过程中动态 `CREATE PARTITION` 会触发“对象正在使用”限制;因此采用“预创建分区(安装/定时任务/启动时调用)”。
|