数据库设计文档
TimescaleDB 数据库结构、索引策略与自动化运维
概览
- 数据库: TimescaleDB(基于 PostgreSQL 16)
- 数据库名:
crypto_data
- 容器名:
crypto_timescaledb
- 版本: 1.2(含交易模块表结构)
| 指标 |
数值 |
| 表数量 |
7 张 |
| Hypertable |
4 个 |
| 索引总数 |
21+ |
| 压缩策略 |
4 个 |
| 连续聚合 |
1 个 |
表结构详解
1. klines — K 线数据表(Hypertable)
存储多币种、多周期的 K 线 OHLCV 数据。
| 字段 |
类型 |
说明 |
time |
TIMESTAMPTZ |
K 线时间(主键) |
symbol |
TEXT |
交易对(如 PURR/USDC:USDC) |
timeframe |
TEXT |
周期(5m / 1h / 4h) |
open |
DOUBLE PRECISION |
开盘价 |
high |
DOUBLE PRECISION |
最高价 |
low |
DOUBLE PRECISION |
最低价 |
close |
DOUBLE PRECISION |
收盘价 |
volume |
DOUBLE PRECISION |
成交量 |
volume_usd |
DOUBLE PRECISION |
成交额(USD) |
return_pct |
DOUBLE PRECISION |
收益率 |
created_at |
TIMESTAMPTZ |
写入时间(默认 NOW()) |
- 主键:
(time, symbol, timeframe)
- Chunk: 7 天
- 保留: 90 天自动清理
- 压缩: 7 天后按
symbol, timeframe 分段压缩
| 字段 |
类型 |
说明 |
symbol |
TEXT |
交易对(主键) |
base_asset |
TEXT |
基础资产 |
quote_asset |
TEXT |
报价资产 |
listing_time |
TIMESTAMPTZ |
上线时间 |
is_active |
BOOLEAN |
是否活跃 |
data_quality_score |
DOUBLE PRECISION |
数据质量分 |
total_klines |
BIGINT |
K 线总数 |
created_at |
TIMESTAMPTZ |
创建时间(默认 NOW()) |
updated_at |
TIMESTAMPTZ |
更新时间(默认 NOW()) |
3. analysis_results — 分析结果表(Hypertable)
| 字段 |
类型 |
说明 |
id |
SERIAL |
自增 ID(主键之一,用于同一分析时间多行区分) |
analysis_time |
TIMESTAMPTZ |
分析时间(主键) |
symbol |
TEXT |
目标币种 |
base_symbol |
TEXT |
基准币种 |
kline_time |
TIMESTAMPTZ |
K 线原始时间 |
analysis_delay_seconds |
FLOAT |
分析延迟(秒) |
corr_5m_7d / corr_1h_30d / corr_4h_60d |
DOUBLE PRECISION |
多周期相关系数 |
zscore_5m / zscore_1h / zscore_4h |
DOUBLE PRECISION |
多周期 Z-Score |
cointegration_passed |
BOOLEAN |
协整检验是否通过 |
adf_pvalue |
DOUBLE PRECISION |
ADF 检验 p 值 |
is_anomaly |
BOOLEAN |
是否异常信号 |
trading_direction |
TEXT |
交易方向 |
signal_strength |
TEXT |
信号强度 |
created_at |
TIMESTAMPTZ |
创建时间(默认 NOW()) |
- 主键:
(analysis_time, id)
- Chunk: 30 天
- 保留: 永久
- 压缩: 30 天后按
symbol 分段压缩
4. trading_signals — 交易信号记录(Hypertable)
| 字段 |
类型 |
说明 |
signal_id |
UUID |
信号唯一 ID |
signal_time |
TIMESTAMPTZ |
信号时间(主键) |
signal_type |
TEXT |
entry / exit |
symbol |
TEXT |
目标币种 |
base_symbol |
TEXT |
基准币种 |
direction |
TEXT |
long / short |
zscore_5m / zscore_1h / zscore_4h |
DOUBLE PRECISION |
Z-Score 快照 |
avg_zscore_4h |
DOUBLE PRECISION |
4H 周期平均 Z-Score |
cointegration_count |
INTEGER |
协整通过数量(多周期汇总) |
signal_strength |
TEXT |
信号强度 |
latest_alt_price |
DOUBLE PRECISION |
信号时刻目标币种最新价 |
action_taken |
TEXT |
none / opened / closed / rejected |
reject_reason |
TEXT |
拒绝原因 |
network |
TEXT |
mainnet / testnet(默认 testnet) |
raw_data |
JSONB |
原始分析数据 |
created_at |
TIMESTAMPTZ |
创建时间(默认 NOW()) |
5. pair_positions — 配对仓位表
| 字段 |
类型 |
说明 |
position_id |
UUID |
仓位 ID(主键) |
symbol / base_symbol |
TEXT |
币种对 |
direction |
TEXT |
long / short |
status |
TEXT |
pending / opening / open / closing / closed / error |
pair_mode |
TEXT |
single / pair |
alt_side / alt_size / alt_entry_price / alt_exit_price |
— |
目标币种仓位 |
base_side / base_size / base_entry_price / base_exit_price |
— |
基准币种仓位 |
entry_zscore_4h / entry_adaptive_z / entry_avg_zscore_4h / entry_signal_strength |
— |
信号快照 |
unrealized_pnl / realized_pnl / peak_pnl_pct |
DOUBLE PRECISION |
盈亏 |
open_time / close_time |
TIMESTAMPTZ |
开/平仓时间 |
entry_signal_id / exit_signal_id |
UUID |
关联的入场/出场信号 ID |
network |
TEXT |
mainnet / testnet(默认 testnet) |
created_at / updated_at |
TIMESTAMPTZ |
创建/更新时间(默认 NOW()) |
6. trade_orders — 订单明细(Hypertable)
| 字段 |
类型 |
说明 |
order_id |
SERIAL |
自增订单 ID(主键之一) |
order_time |
TIMESTAMPTZ |
订单时间(主键) |
position_id |
UUID |
关联仓位 |
coin |
TEXT |
币种 |
side |
TEXT |
buy / sell |
size / price |
DOUBLE PRECISION |
数量/价格 |
exchange_order_id |
BIGINT |
交易所订单 ID |
status |
TEXT |
filled / partial / rejected / error |
order_type |
TEXT |
market / limit |
error_message |
TEXT |
失败时的错误信息 |
raw_response |
JSONB |
原始响应 |
network |
TEXT |
mainnet / testnet(默认 testnet) |
created_at |
TIMESTAMPTZ |
创建时间(默认 NOW()) |
- 主键:
(order_time, order_id)
7. daily_trading_stats — 每日交易统计
| 字段 |
类型 |
说明 |
stat_date |
DATE |
统计日期(主键) |
network |
TEXT |
mainnet / testnet |
total_signals / entry_signals / exit_signals |
INTEGER |
信号统计 |
trades_opened / trades_closed / trades_rejected |
INTEGER |
交易统计 |
total_realized_pnl |
DOUBLE PRECISION |
已实现盈亏 |
max_drawdown |
DOUBLE PRECISION |
最大回撤 |
max_open_pairs |
INTEGER |
最大同时持仓数 |
created_at / updated_at |
TIMESTAMPTZ |
创建/更新时间(默认 NOW()) |
索引策略
klines 表(6 个索引)
| 索引 |
列 |
类型 |
用途 |
idx_klines_symbol_timeframe_time |
symbol, timeframe, time DESC |
复合 |
最常用查询 |
idx_klines_symbol_time_close |
symbol, time DESC, close |
覆盖 |
含 close 列查询 |
idx_klines_5m |
symbol, time DESC WHERE timeframe='5m' |
局部 |
5 分钟查询优化 |
idx_klines_1h |
symbol, time DESC WHERE timeframe='1h' |
局部 |
1 小时查询优化 |
idx_klines_4h |
symbol, time DESC WHERE timeframe='4h' |
局部 |
4 小时查询优化 |
analysis_results 表(6 个索引)
| 索引 |
列 |
用途 |
idx_analysis_symbol_time |
symbol, analysis_time DESC |
按币种查询 |
idx_analysis_anomaly_time |
analysis_time DESC WHERE is_anomaly=TRUE |
异常信号过滤 |
idx_analysis_kline_time |
symbol, kline_time DESC |
K 线时间查询 |
idx_analysis_delay |
analysis_delay_seconds DESC WHERE >5 |
延迟监控 |
idx_analysis_results_symbol_timeframe |
symbol, base_symbol, analysis_time DESC |
组合查询 |
交易模块索引
| 表 |
索引 |
用途 |
trading_signals |
symbol + signal_time DESC |
按币种查询信号 |
trading_signals |
signal_type + signal_time DESC |
按类型查询 |
pair_positions |
symbol + status |
仓位状态查询 |
pair_positions |
status WHERE IN ('open','opening','closing') |
活跃仓位快查 |
pair_positions |
open_time DESC |
按时间排序 |
trade_orders |
position_id + order_time DESC |
按仓位查订单 |
trade_orders |
coin + order_time DESC |
按币种查订单 |
连续聚合视图
daily_analysis_stats
自动汇总每日分析统计:
SELECT
time_bucket('1 day', analysis_time) AS day,
symbol, base_symbol,
COUNT(*) AS analysis_count,
COUNT(*) FILTER (WHERE is_anomaly = TRUE) AS anomaly_count,
AVG(corr_5m_7d), AVG(corr_1h_30d), AVG(corr_4h_60d),
AVG(zscore_5m), AVG(zscore_1h), AVG(zscore_4h)
FROM analysis_results
GROUP BY day, symbol, base_symbol;
连接池配置建议
| 服务实例数 |
POOL_MAX_SIZE |
备注 |
| 1-3 |
10(默认) |
直连 |
| 4-6 |
15 |
直连 |
| 7-10 |
20 |
建议启用 PgBouncer |
| >10 |
10 |
必须启用 PgBouncer |
使用 PgBouncer 时将端口切换为 6432。
常用运维命令
# 连接数据库
docker exec -it crypto_timescaledb psql -U postgres -d crypto_data
# 查看表结构
\d klines
# 查看索引
\di
# 查看 Hypertable 信息
SELECT * FROM timescaledb_information.hypertables;
# 查看压缩策略
SELECT * FROM timescaledb_information.compression_settings;
# 查看 chunk 信息
SELECT * FROM timescaledb_information.chunks WHERE hypertable_name = 'klines';
# 手动触发压缩
SELECT compress_chunk(c) FROM show_chunks('klines', older_than => INTERVAL '7 days') c;
# 查看数据量
SELECT symbol, timeframe, COUNT(*) FROM klines GROUP BY symbol, timeframe;