dd98b4d45b
- 新增 02-计划/计划-数据存储SQLite.md(PLAN-007) - 新增 04-迭代记录/06-数据存储SQLite/ 五份文档(迭代目标/技术实现方案/验收标准/UI交互调用分析/迭代复盘) - 归档 R-008 至 已完成/(含归档头 + 讨论记录索引),索引更新为已实现(已归档) - 设计约束更新:技术方案约束-012 标注 SQLite 变更、数据存储设计.md 第 9 节变更预告 - 需求池说明.md 新增「归档与转正规范」;迭代记录说明.md 新增「实现经验沉淀」 - 验收标准修正 db 文件名笔误(one-divine-lot.db → store.db)
6.2 KiB
6.2 KiB
R-008 数据存储管理(JSON → SQLite)· 已完成
归档日期:2026-09-01 | 需求状态:已完成 原索引:docs/05-需求池/需求池索引.md(主索引保留 R-008 条目,指向本归档) 实现迭代:06-数据存储SQLite(验收通过,迭代复盘见 docs/04-迭代记录/06-数据存储SQLite/迭代复盘.md) 讨论记录:需求从 T-008 草稿转正,2026-09-01 定稿(D1-D8);实现过程中的语义迁移 Bug 修复与「一键清零」移除见迭代 06 技术实现方案变更记录
状态:已定稿(2026-09-01,老师确认)| 登记日期:2026-09-01 来源:T-008 草稿转正(docs/05-需求池/草稿/T-008-数据存储管理SQLite.md) 优先级:P1 关联:docs/03-设计约束/数据存储设计.md(将变更)、技术约束-012(将变更)
想法描述
将神之一手的数据存储从 JSON 文件(store.json / store.market.json / store.schema.json)升级为 SQLite 数据库,并引入「数据存储管理」能力。
背景:当前存储基于 JSON data store(R-006,2026-08-31 定),设计约束明确「数据量很少,无需数据库」。现准备引入 SQLite,意味着数据量/查询复杂度已增长到需要数据库的程度,需重新评估该设计决策。
现状(代码审查 2026-09-01)
| 项 | 现状 |
|---|---|
| 存储介质 | JSON 文件:store.schema.json(schema)/ store.json(份额分配,策略为中心)/ store.market.json(行情快照缓存) |
| 存储模块 | src/component/DataStore.js(读写/迁移/schema)、MarketDataHub.js(行情缓存写回)、AllocationStorage.js(遗留旧存储,迁移源) |
| 数据流 | 启动 load → 实盘 ingest → 防抖 3s 写回 store.market.json;原子写(临时文件 + rename) |
| 依赖 | 无数据库依赖(package.json 无 sqlite) |
| 设计约束 | docs/03-设计约束/数据存储设计.md:「数据量很少(无需数据库/Circe),用 JSON 文件 + 类 JSON Schema」 |
动机(为什么要 SQLite)
(待老师补充确认 —— 初步推测):
- 数据量增长:行情缓存 / 交易记录 / 复盘记录等数据积累,JSON 全量读写成本变高?
- 查询需求:按 code / 时间 / 策略做复杂查询(如历史行情、交易复盘筛选),JSON 内存过滤不便?
- 写入频率:盘中行情防抖写回 + 未来更多高频写入,JSON 原子写压力大?
- 多数据集统一管理:份额 / 行情 / 交易记录 / 复盘记录统一入一个库?
待讨论点
- 动机确认:老师确认上 SQLite 的具体原因(上述哪条 / 其他)——决定改造范围;
- 库选型:better-sqlite3(同步 API,Node 原生绑定)?node:sqlite(Node 22+ 内置)?其他?(技术约束-001:复用优先,需论证)
- schema 设计:表结构 —— strategies / allocation(份额)/ market_quotes / trades / reviews?如何对齐现有 store.schema.json 语义?
- 迁移策略:现有 store.json / store.market.json / 旧 allocations.json 如何迁入 SQLite(一次性迁移?启动自动迁移 + 备份?参照 R-006 迁移模式)?
- 保留还是废弃 JSON:SQLite 落地后 JSON 文件是否完全废弃(读兼容 / 写切换 / 双写过渡)?
- 策略定义位置:策略(id/name/visible/order)仍存 DSH settings 还是迁入 SQLite?(现有设计决策:存 settings)
- 数据存储管理能力:本需求「数据存储管理」具体指什么 —— 数据浏览/导出?备份/恢复?清理(行情缓存膨胀治理)?还是仅存储引擎替换?
- 设计约束变更:数据存储设计.md 的「无需数据库」决策需修订 —— 变更理由与记录;
- 依赖引入:新增原生依赖(better-sqlite3 需编译)对插件构建/分发的影响(技术约束-005 bundle 格式);
- 优先级与排期:机制定稿后确定。
成熟后按「三要素」(边界清楚 / 核心逻辑明确 / 老师确认)讨论定稿,再转正到根目录形成正式需求。
讨论结论(2026-09-01 第一轮)
已确认决策
| # | 决策点 | 结论 |
|---|---|---|
| D1 | 动机 | 需要复杂查询/筛选 + 为未来功能铺路(多数据集统一管理);非数据量/写入压力问题 |
| D2 | 库选型 | node:sqlite(Node ≥22.5,实测本机 22.23.1 可用);存储层封装独立模块隔离 experimental 风险 |
| D3 | 能力范围 | 仅存储引擎替换(JSON→SQLite),对外行为不变,最小改动;本期不做数据管理界面/导出/清理 |
| D4 | 表范围 | 本期:strategies + allocation + market_quotes 三表;不建 trades 表(R-007 时再建) |
| D5 | 策略定义位置 | 仍存 DSH settings(不迁 SQLite,设置页交互不变) |
| D6 | 迁移策略 | 一次性迁移脚本 + 启动检测自动迁移(检测旧 JSON 存在且 SQLite 空 → 自动迁移,幂等) |
| D7 | JSON 去留 | 迁移后废弃(迁移前自动备份) |
| D8 | 优先级 | P1 |
实测验证记录(2026-09-01)
- 本机 Node v22.23.1,
node:sqlite可用(DatabaseSync,内置 SQLite 3.51.3),但标记 Experimental(ExperimentalWarning); - better-sqlite3 实测 ESM 加载正常,但原生模块需编译;分发需预编译产物;
- 选型考量:本项目倾向稳妥 + 零依赖分发 → node:sqlite;存储层封装(SqliteStore)隔离 experimental 风险,未来可切换。
设计约束变更(待执行)
- 技术约束-012(数据存储遵循 JSON data store)需变更:SQLite 落地后更新为遵循 SQLite 存储设计;
- docs/03-设计约束/数据存储设计.md 需修订:「无需数据库」决策 → SQLite(记录变更理由:复杂查询 + 未来功能铺路);
- 变更需在定稿时同步执行(本需求转正后)。
转正条件(三要素核对)
- 边界清楚:仅引擎替换 + 三表 + 不建 trades + 策略仍存 settings;
- 核心逻辑明确:node:sqlite + 自动迁移 + JSON 废弃(D1-D8 全部确认);
- 老师确认定稿(待确认)—— 确认后转正为正式需求 R 编号,进入计划/迭代。