# 数据库设计文档 ## 一、设计概述 本数据库设计用于存储股票交易数据、市场统计信息和板块动量数据,支持股票分析系统的运行。设计采用关系型数据库,主要存储以下数据: - 股票基本信息 - 股票实时行情 - K线历史数据 - 板块信息 - 板块动量数据 - 市场统计数据 ## 二、数据模型设计 ### 1. 股票基本信息表 (`stock_basic`) | 字段名 | 数据类型 | 约束 | 描述 | |-------|---------|------|------| | `code` | `VARCHAR(10)` | `PRIMARY KEY` | 股票代码 | | `name` | `VARCHAR(50)` | `NOT NULL` | 股票名称 | | `sector_code` | `VARCHAR(10)` | `NULL` | 所属板块代码 | | `list_date` | `DATE` | `NULL` | 上市日期 | | `is_etf` | `BOOLEAN` | `DEFAULT FALSE` | 是否ETF | | `market` | `VARCHAR(10)` | `NULL` | 市场(沪市/深市) | | `updated_at` | `TIMESTAMP` | `DEFAULT CURRENT_TIMESTAMP` | 更新时间 | ### 2. 股票实时行情表 (`stock_quote`) | 字段名 | 数据类型 | 约束 | 描述 | |-------|---------|------|------| | `code` | `VARCHAR(10)` | `PRIMARY KEY` | 股票代码 | | `price` | `DECIMAL(10,2)` | `NULL` | 最新价 | | `change_pct` | `DECIMAL(6,2)` | `NULL` | 涨跌幅(%) | | `change_amount` | `DECIMAL(10,2)` | `NULL` | 涨跌额 | | `volume` | `BIGINT` | `NULL` | 成交量 | | `amount` | `DECIMAL(18,2)` | `NULL` | 成交额 | | `turnover_rate` | `DECIMAL(8,4)` | `NULL` | 换手率(%) | | `amplitude` | `DECIMAL(6,2)` | `NULL` | 振幅(%) | | `high` | `DECIMAL(10,2)` | `NULL` | 最高价 | | `low` | `DECIMAL(10,2)` | `NULL` | 最低价 | | `open` | `DECIMAL(10,2)` | `NULL` | 开盘价 | | `updated_at` | `TIMESTAMP` | `DEFAULT CURRENT_TIMESTAMP` | 更新时间 | ### 3. 股票K线数据表 (`stock_kline`) | 字段名 | 数据类型 | 约束 | 描述 | |-------|---------|------|------| | `id` | `BIGINT` | `PRIMARY KEY AUTO_INCREMENT` | 自增主键 | | `code` | `VARCHAR(10)` | `NOT NULL` | 股票代码 | | `date` | `DATE` | `NOT NULL` | 日期 | | `open` | `DECIMAL(10,2)` | `NULL` | 开盘价 | | `high` | `DECIMAL(10,2)` | `NULL` | 最高价 | | `low` | `DECIMAL(10,2)` | `NULL` | 最低价 | | `close` | `DECIMAL(10,2)` | `NULL` | 收盘价 | | `volume` | `BIGINT` | `NULL` | 成交量 | | `amount` | `DECIMAL(18,2)` | `NULL` | 成交额 | | `pct_chg` | `DECIMAL(6,2)` | `NULL` | 涨跌幅(%) | | `INDEX` | | `(code, date)` | 复合索引 | ### 4. 板块信息表 (`sector_info`) | 字段名 | 数据类型 | 约束 | 描述 | |-------|---------|------|------| | `code` | `VARCHAR(10)` | `PRIMARY KEY` | 板块代码 | | `name` | `VARCHAR(50)` | `NOT NULL` | 板块名称 | | `stock_count` | `INT` | `DEFAULT 0` | 成分股数量 | | `updated_at` | `TIMESTAMP` | `DEFAULT CURRENT_TIMESTAMP` | 更新时间 | ### 5. 板块动量表 (`sector_momentum`) | 字段名 | 数据类型 | 约束 | 描述 | |-------|---------|------|------| | `id` | `BIGINT` | `PRIMARY KEY AUTO_INCREMENT` | 自增主键 | | `sector_code` | `VARCHAR(10)` | `NOT NULL` | 板块代码 | | `date` | `DATE` | `NOT NULL` | 日期 | | `momentum_value` | `DECIMAL(10,4)` | `NULL` | 动量值 | | `n` | `INT` | `NULL` | 板块内动量个股数 | | `N` | `INT` | `NULL` | 板块总个股数 | | `rank` | `INT` | `NULL` | 动量排名 | | `rank_change` | `INT` | `NULL` | 排名变化 | | `updated_at` | `TIMESTAMP` | `DEFAULT CURRENT_TIMESTAMP` | 更新时间 | | `INDEX` | | `(sector_code, date)` | 复合索引 | ### 6. 市场统计表 (`market_stats`) | 字段名 | 数据类型 | 约束 | 描述 | |-------|---------|------|------| | `id` | `BIGINT` | `PRIMARY KEY AUTO_INCREMENT` | 自增主键 | | `date` | `DATE` | `NOT NULL UNIQUE` | 日期 | | `up_count` | `INT` | `DEFAULT 0` | 上涨家数 | | `down_count` | `INT` | `DEFAULT 0` | 下跌家数 | | `flat_count` | `INT` | `DEFAULT 0` | 平盘家数 | | `limit_up_count` | `INT` | `DEFAULT 0` | 涨停家数 | | `limit_down_count` | `INT` | `DEFAULT 0` | 跌停家数 | | `total_amount` | `DECIMAL(20,2)` | `NULL` | 两市成交额 | | `updated_at` | `TIMESTAMP` | `DEFAULT CURRENT_TIMESTAMP` | 更新时间 | ## 三、索引设计 ### 1. 主键索引 - `stock_basic.code` - `stock_quote.code` - `sector_info.code` - `stock_kline.id` - `sector_momentum.id` - `market_stats.id` ### 2. 复合索引 - `stock_kline(code, date)`:加速按股票代码和日期范围查询 - `sector_momentum(sector_code, date)`:加速按板块和日期查询 ### 3. 唯一索引 - `market_stats.date`:确保每日只存储一条市场统计记录 ## 四、数据同步策略 ### 1. 实时数据 - **同步频率**:30秒一次 - **同步方式**:批量更新 - **存储策略**:只保留最新数据 ### 2. K线数据 - **同步频率**:每日收盘后 - **同步方式**:增量更新 - **存储策略**:保留完整历史数据 ### 3. 板块数据 - **同步频率**:每日一次 - **同步方式**:全量更新 - **存储策略**:保留完整历史数据 ### 4. 市场统计 - **同步频率**:每日收盘后 - **同步方式**:增量更新 - **存储策略**:保留完整历史数据 ## 五、数据清理策略 ### 1. 实时数据 - 无需清理,覆盖更新 ### 2. K线数据 - 保留完整历史数据,不清理 ### 3. 板块动量 - 保留最近一年数据 - 自动清理一年前的数据 ### 4. 市场统计 - 保留完整历史数据,不清理 ## 六、性能优化建议 1. **分区表**:对 `stock_kline` 表按日期分区,提高查询性能 2. **批量操作**:使用批量插入和更新,减少数据库连接次数 3. **索引优化**:根据查询模式优化索引 4. **缓存层**:使用Redis缓存热点数据 5. **读写分离**:主库用于写入,从库用于读取 6. **连接池**:使用数据库连接池,减少连接建立开销 ## 七、扩展性考虑 1. **分库分表**:数据量增长时,可考虑按股票代码分库分表 2. **时间序列数据库**:K线数据可考虑使用时间序列数据库(如InfluxDB) 3. **数据仓库**:历史数据可迁移到数据仓库,用于分析 4. **API接口**:提供标准化的API接口,支持外部系统集成 ## 八、安全考虑 1. **访问控制**:设置数据库用户权限,限制访问 2. **数据加密**:敏感数据加密存储 3. **备份策略**:定期备份数据库,确保数据安全 4. **审计日志**:记录数据库操作日志,便于追溯 ## 九、技术选型 - **数据库**:PostgreSQL 14+ - **连接池**:PgBouncer - **ORM**:SQLAlchemy - **缓存**:Redis 7.0+ - **监控**:Prometheus + Grafana ## 十、部署建议 1. **开发环境**:单节点数据库 2. **测试环境**:主从复制 3. **生产环境**: - 数据库:主从复制 + 自动故障转移 - Redis:主从复制 + 哨兵模式 - 定期备份:每日全量备份,每小时增量备份