You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

192 lines
6.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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