|
|
|
|
|
# 数据库设计文档
|
|
|
|
|
|
|
|
|
|
|
|
## 一、设计概述
|
|
|
|
|
|
|
|
|
|
|
|
本数据库设计用于存储股票交易数据、市场统计信息和板块动量数据,支持股票分析系统的运行。设计采用关系型数据库,主要存储以下数据:
|
|
|
|
|
|
|
|
|
|
|
|
- 股票基本信息
|
|
|
|
|
|
- 股票实时行情
|
|
|
|
|
|
- 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:主从复制 + 哨兵模式
|
|
|
|
|
|
- 定期备份:每日全量备份,每小时增量备份
|