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

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