Files
Web_BLS_Heartbeat_Server/openspec/changes/update-heartbeat-db-v2/proposal.md

21 lines
1.7 KiB
Markdown
Raw Normal View History

# 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-treeservice_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` 会触发“对象正在使用”限制;因此采用“预创建分区(安装/定时任务/启动时调用)”。