01-数据库选型说明
趋势定投分析的数据基础设施选型。核心判断:数据量在百 MB 级、读多写少、单机使用、零运维优先。SQLite 是最合适的选择。
选型结论
主库:SQLite(启用 WAL 模式)
理由概要:
- 数据量在 50-500MB 级别,SQLite 舒适区
- 站点分析以读取查询为主,每日批量更新写入,读多写少
- Python 内置
sqlite3,零依赖零运维 - 单文件,复制即备份,迁移成本低
- 趋势定投不是量化交易,不需要毫秒级响应、高并发写入、分布式存储
为什么不选其他方案
DuckDB
DuckDB 是列式 OLAP 数据库,分析查询性能优于 SQLite,但本场景不选,原因:
- 本项目数据量级下,SQLite 配合合理索引已足够快,DuckDB 的列式优势发挥不出来
- DuckDB 生态较新,Python 集成需额外安装,不如 SQLite 开箱即用
- 如果未来分析查询遇到性能瓶颈,DuckDB 可直接读取 SQLite 文件作为分析层补充,届时再加不迟
PostgreSQL / MySQL
关系型数据库服务端方案,本场景明显过重:
- 需要安装和运维数据库服务,与"个人投资分析"的轻量定位不符
- 单用户场景下,并发写入能力用不上
- 备份迁移复杂度高于单文件方案
CSV / Parquet
文件方案查询能力弱:
- 多表关联分析需要手动 join,维护成本高
- 数据更新需要重写整个文件
- 适合作为数据导出格式,不适合作为主存储
SQLite 配置说明
本项目采用以下配置,兼顾性能与可靠性:
各 PRAGMA 的作用:
版本管理策略
SQLite 数据库文件(.db)是二进制文件,直接进 git 会造成仓库膨胀且 diff 不可读。策略如下:
.db文件不进版本库:.gitignore排除05-数据库/03-数据文件/*.db- 建表脚本进版本库:
db.py中的 schema 定义是版本管理的核心 - 数据快照可选进库:每月末导出一次 SQL dump(
trend_invest_YYYYMM.sql.gz),可选提交到仓库或单独存储 - schema 版本号:在
db_meta表记录 schema 版本,便于后续迁移
容量预估
按 数据库概览 定义的数据范围粗估:
合计约 55 MB,加索引后约 80-120 MB。SQLite 单文件上限 140TB,完全不是瓶颈。
何时需要迁移
出现以下情况时,考虑迁移到 DuckDB 或 PostgreSQL:
- 数据量超过 10GB(短期不会出现)
- 查询响应超过 5 秒且索引优化无效
- 需要多用户并发写入
- 需要实时行情接入(本场景不涉及)
在可预见的趋势定投分析需求下,SQLite 至少够用 5 年。