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.

187 lines
5.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.

# 数据库结构重设计 - 完成总结
## 概述
已完成数据库表结构从单一宽表向拆分表的迁移设计,并实现了完整的数据同步流程。
## 主要改动
### 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` - 导出新类型