|
|
|
|
|
# 数据库结构重设计 - 完成总结
|
|
|
|
|
|
|
|
|
|
|
|
## 概述
|
|
|
|
|
|
|
|
|
|
|
|
已完成数据库表结构从单一宽表向拆分表的迁移设计,并实现了完整的数据同步流程。
|
|
|
|
|
|
|
|
|
|
|
|
## 主要改动
|
|
|
|
|
|
|
|
|
|
|
|
### 1. 数据模型层 (app/repositories/models.py)
|
|
|
|
|
|
|
|
|
|
|
|
**新增拆分表模型:**
|
|
|
|
|
|
- `StockKLine1DBase` - 日线基础表 (OHLCV)
|
|
|
|
|
|
- `StockKLine1DQuote` - 日线行情表 (涨跌幅、均线、MACD、乖离率、涨跌停状态)
|
|
|
|
|
|
- `StockKLine1DFinance` - 日线财务表 (市值、股本、机构持股、利润)
|
|
|
|
|
|
- `StockRealTimeQuote` - 实时行情快照表
|
|
|
|
|
|
- `StockBasicInfo` - 股票基础信息表
|
|
|
|
|
|
|
|
|
|
|
|
**向后兼容:**
|
|
|
|
|
|
- 添加 `StockKLine1D = StockKLine1DBase` 别名,保持旧代码兼容
|
|
|
|
|
|
|
|
|
|
|
|
### 2. 数据仓库层 (app/repositories/stock_repository_v2.py)
|
|
|
|
|
|
|
|
|
|
|
|
**新增 Repository:**
|
|
|
|
|
|
- `StockRepositoryV2` - 支持拆分表结构的新仓库
|
|
|
|
|
|
- `get_klines_base()` / `save_klines_base()` - 基础数据操作
|
|
|
|
|
|
- `get_klines_quote()` / `save_klines_quote()` - 行情数据操作
|
|
|
|
|
|
- `get_klines_finance()` / `save_klines_finance()` - 财务数据操作
|
|
|
|
|
|
- `get_realtime_quote()` / `save_realtime_quote()` - 实时行情操作
|
|
|
|
|
|
|
|
|
|
|
|
### 3. 适配器接口层 (app/adapters/base.py)
|
|
|
|
|
|
|
|
|
|
|
|
**新增抽象方法:**
|
|
|
|
|
|
- `fetch_kline_base()` - 获取基础K线数据
|
|
|
|
|
|
- `fetch_kline_quote()` - 获取行情指标数据
|
|
|
|
|
|
- `fetch_kline_finance()` - 获取财务数据
|
|
|
|
|
|
- `fetch_stock_basic_info()` - 获取股票基础信息
|
|
|
|
|
|
|
|
|
|
|
|
### 4. AmazingData适配器 (app/adapters/amazingdata_adapter.py)
|
|
|
|
|
|
|
|
|
|
|
|
**新增实现方法:**
|
|
|
|
|
|
- `_fetch_kline_base_sync()` - 从 query_kline 获取基础数据
|
|
|
|
|
|
- `_fetch_kline_quote_sync()` - 计算均线/MACD/乖离率等指标
|
|
|
|
|
|
- `_fetch_kline_finance_sync()` - 从股本结构数据计算市值
|
|
|
|
|
|
- `_fetch_stock_basic_info_sync()` - 获取股票列表和基础信息
|
|
|
|
|
|
|
|
|
|
|
|
### 5. 数据同步服务 (app/services/data_sync_service.py)
|
|
|
|
|
|
|
|
|
|
|
|
**新增服务:**
|
|
|
|
|
|
- `DataSyncService` - 协调数据拉取和存储
|
|
|
|
|
|
- `sync_kline_base()` - 同步基础K线
|
|
|
|
|
|
- `sync_kline_quote()` - 同步行情指标
|
|
|
|
|
|
- `sync_kline_finance()` - 同步财务数据
|
|
|
|
|
|
- `sync_full_stock_data()` - 全量同步
|
|
|
|
|
|
- `sync_daily_incremental()` - 每日增量同步
|
|
|
|
|
|
|
|
|
|
|
|
### 6. 管理API层 (app/api/admin_routes.py)
|
|
|
|
|
|
|
|
|
|
|
|
**新增端点:**
|
|
|
|
|
|
- `POST /admin/data/sync` - 手动触发数据同步
|
|
|
|
|
|
- 支持 sync_type: base/quote/finance/full
|
|
|
|
|
|
- 支持指定日期范围和标的列表
|
|
|
|
|
|
- `POST /admin/data/sync/incremental` - 增量同步(最近30天)
|
|
|
|
|
|
|
|
|
|
|
|
### 7. 类型定义 (app/models/admin_types.py)
|
|
|
|
|
|
|
|
|
|
|
|
**新增类型:**
|
|
|
|
|
|
- `DataSyncType` - 同步类型枚举
|
|
|
|
|
|
- `DataSyncRequest` - 同步请求
|
|
|
|
|
|
- `DataSyncResult` - 单个标的同步结果
|
|
|
|
|
|
- `DataSyncData` - 同步响应
|
|
|
|
|
|
|
|
|
|
|
|
### 8. 迁移脚本 (scripts/create_split_tables.py)
|
|
|
|
|
|
|
|
|
|
|
|
**功能:**
|
|
|
|
|
|
- 自动创建所有新表
|
|
|
|
|
|
- 支持 `--drop-existing` 参数重建表
|
|
|
|
|
|
|
|
|
|
|
|
## 表结构对比
|
|
|
|
|
|
|
|
|
|
|
|
### 旧表 (stock_klines_1d)
|
|
|
|
|
|
```
|
|
|
|
|
|
symbol_id, ts, trade_date, open, high, low, close, volume, amount,
|
|
|
|
|
|
is_limit_up, is_limit_down, total_market_cap, float_market_cap,
|
|
|
|
|
|
inst_holding_ratio, trading_days
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 新表
|
|
|
|
|
|
```
|
|
|
|
|
|
stock_klines_1d_base:
|
|
|
|
|
|
symbol_id, ts, trade_date, open, high, low, close, volume, amount
|
|
|
|
|
|
|
|
|
|
|
|
stock_klines_1d_quote:
|
|
|
|
|
|
symbol_id, trade_date, change_pct, change_Nd_pct, maN,
|
|
|
|
|
|
macd_dif/dea/bar, biasN, is_limit_up/down, limit_up/down_price, is_st
|
|
|
|
|
|
|
|
|
|
|
|
stock_klines_1d_finance:
|
|
|
|
|
|
symbol_id, trade_date, total_market_cap, float_market_cap,
|
|
|
|
|
|
total_shares, float_shares, inst_holding_shares, inst_holding_ratio,
|
|
|
|
|
|
top10_holders_ratio, net_profit, revenue, eps, roe, trading_days
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## API使用示例
|
|
|
|
|
|
|
|
|
|
|
|
### 1. 全量同步
|
|
|
|
|
|
```bash
|
|
|
|
|
|
curl -X POST "http://localhost:8080/admin/data/sync" \
|
|
|
|
|
|
-H "Content-Type: application/json" \
|
|
|
|
|
|
-d '{
|
|
|
|
|
|
"symbols": ["600519.SH", "000001.SZ"],
|
|
|
|
|
|
"sync_type": "full",
|
|
|
|
|
|
"start_date": "20240101",
|
|
|
|
|
|
"end_date": "20240301"
|
|
|
|
|
|
}'
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 2. 只同步基础数据
|
|
|
|
|
|
```bash
|
|
|
|
|
|
curl -X POST "http://localhost:8080/admin/data/sync" \
|
|
|
|
|
|
-H "Content-Type: application/json" \
|
|
|
|
|
|
-d '{
|
|
|
|
|
|
"symbols": ["600519.SH"],
|
|
|
|
|
|
"sync_type": "base"
|
|
|
|
|
|
}'
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 3. 增量同步
|
|
|
|
|
|
```bash
|
|
|
|
|
|
curl -X POST "http://localhost:8080/admin/data/sync/incremental" \
|
|
|
|
|
|
-H "Content-Type: application/json" \
|
|
|
|
|
|
-d '["600519.SH", "000001.SZ"]'
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 代码使用示例
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
from app.repositories.stock_repository_v2 import StockRepositoryV2
|
|
|
|
|
|
from app.repositories.database import SessionLocal
|
|
|
|
|
|
from app.models import Frequency
|
|
|
|
|
|
|
|
|
|
|
|
db = SessionLocal()
|
|
|
|
|
|
repo = StockRepositoryV2(db)
|
|
|
|
|
|
|
|
|
|
|
|
# 只查询基础数据(高效)
|
|
|
|
|
|
base_data = repo.get_klines_base(
|
|
|
|
|
|
symbol="600519.SH",
|
|
|
|
|
|
freq=Frequency.FREQ_1D,
|
|
|
|
|
|
start=datetime(2024, 1, 1),
|
|
|
|
|
|
end=datetime(2024, 3, 1)
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
# 只查询行情指标
|
|
|
|
|
|
quote_data = repo.get_klines_quote(
|
|
|
|
|
|
symbol="600519.SH",
|
|
|
|
|
|
start_date="2024-01-01",
|
|
|
|
|
|
end_date="2024-03-01"
|
|
|
|
|
|
)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 性能优势
|
|
|
|
|
|
|
|
|
|
|
|
1. **查询优化**:只需OHLCV时只查询轻量的base表
|
|
|
|
|
|
2. **更新解耦**:基础数据可高频更新,财务数据按财报季更新
|
|
|
|
|
|
3. **扩展灵活**:新增指标只需修改quote表,不影响基础数据
|
|
|
|
|
|
|
|
|
|
|
|
## 后续建议
|
|
|
|
|
|
|
|
|
|
|
|
1. **定时任务**:配置每日凌晨执行增量同步
|
|
|
|
|
|
2. **数据校验**:定期校验基础数据和行情指标的一致性
|
|
|
|
|
|
3. **分区优化**:对大表按trade_date进行分区
|
|
|
|
|
|
4. **缓存优化**:热点数据使用Redis缓存
|
|
|
|
|
|
|
|
|
|
|
|
## 文件清单
|
|
|
|
|
|
|
|
|
|
|
|
**新增文件:**
|
|
|
|
|
|
- `app/repositories/stock_repository_v2.py` (636 lines)
|
|
|
|
|
|
- `app/services/data_sync_service.py` (387 lines)
|
|
|
|
|
|
- `scripts/create_split_tables.py` (106 lines)
|
|
|
|
|
|
- `DATABASE_REFACTOR.md` - 详细设计文档
|
|
|
|
|
|
|
|
|
|
|
|
**修改文件:**
|
|
|
|
|
|
- `app/repositories/models.py` - 添加新表模型和向后兼容别名
|
|
|
|
|
|
- `app/adapters/base.py` - 添加新抽象方法
|
|
|
|
|
|
- `app/adapters/amazingdata_adapter.py` - 添加新数据获取方法 (~300 lines)
|
|
|
|
|
|
- `app/api/admin_routes.py` - 添加数据同步端点
|
|
|
|
|
|
- `app/models/admin_types.py` - 添加同步相关类型
|
|
|
|
|
|
- `app/models/__init__.py` - 导出新类型
|