4. 基础数据表结构设计
精算模型延迟尖峰告警系统的核心在于数据驱动的实时监控与历史回溯。本章设计四张基础数据表,分别承载模型运行状态、依赖拓扑、告警阈值与告警事件。表结构遵循第三范式(3NF),兼顾查询性能与扩展性,为后续 SQL 监控脚本提供稳定的数据底座。
设计原则:所有表均包含
created_at 与 updated_at 时间戳字段,用于数据血缘追踪与增量抽取。主键采用自增整数或业务唯一键,避免 UUID 对索引性能的影响。
4.1 模型运行日志表(model_run_log)
记录每次精算模型调度的执行快照,包括开始时间、结束时间、状态、延迟秒数及错误信息。该表是延迟尖峰检测的原始数据源,写入频率高,需按日期分区。
| 字段名 | 数据类型 | 约束 | 说明 |
|---|---|---|---|
| log_id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 日志唯一标识 |
| model_code | VARCHAR(64) | NOT NULL, INDEX | 模型编码,如 MORTALITY_2025Q1 |
| run_date | DATE | NOT NULL, INDEX | 运行日期(业务日期) |
| start_time | DATETIME(3) | NOT NULL | 实际开始时间,毫秒精度 |
| end_time | DATETIME(3) | NULL | 实际结束时间,未完成时为 NULL |
| expected_duration_sec | INT | NOT NULL | 预期运行时长(秒),来自模型配置 |
| actual_duration_sec | INT | NULL | 实际运行时长(秒),计算列 |
| delay_sec | INT | NULL | 延迟秒数 = actual - expected,负值表示提前完成 |
| status | TINYINT | NOT NULL, DEFAULT 0 | 0=运行中, 1=成功, 2=失败, 3=超时 |
| error_message | TEXT | NULL | 异常堆栈或错误描述 |
| created_at | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 记录创建时间 |
-- 按日期分区的建表语句示例(MySQL)
CREATE TABLE model_run_log (
log_id BIGINT AUTO_INCREMENT,
model_code VARCHAR(64) NOT NULL,
run_date DATE NOT NULL,
start_time DATETIME(3) NOT NULL,
end_time DATETIME(3) NULL,
expected_duration_sec INT NOT NULL,
actual_duration_sec INT GENERATED ALWAYS AS (
TIMESTAMPDIFF(SECOND, start_time, end_time)
) STORED,
delay_sec INT GENERATED ALWAYS AS (
actual_duration_sec - expected_duration_sec
) STORED,
status TINYINT NOT NULL DEFAULT 0,
error_message TEXT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (log_id, run_date),
INDEX idx_model_date (model_code, run_date),
INDEX idx_status_delay (status, delay_sec)
) PARTITION BY RANGE (TO_DAYS(run_date)) (
PARTITION p2024 VALUES LESS THAN (TO_DAYS('2025-01-01')),
PARTITION p2025 VALUES LESS THAN (TO_DAYS('2026-01-01')),
PARTITION p_future VALUES LESS THAN MAXVALUE
);
性能要点:使用
GENERATED ALWAYS ... STORED 列避免每次查询计算延迟;按 run_date 分区可快速裁剪历史数据,配合 idx_model_date 索引覆盖大部分监控查询。
4.2 模型依赖关系表(model_dependency)
定义模型之间的上下游依赖拓扑。当上游模型延迟或失败时,下游模型可能产生级联尖峰。该表支持有向无环图(DAG)的存储与遍历。
| 字段名 | 数据类型 | 约束 | 说明 |
|---|---|---|---|
| dep_id | INT | PRIMARY KEY, AUTO_INCREMENT | 依赖关系唯一标识 |
| upstream_model_code | VARCHAR(64) | NOT NULL, INDEX | 上游模型编码(被依赖方) |
| downstream_model_code | VARCHAR(64) | NOT NULL, INDEX | 下游模型编码(依赖方) |
| dependency_type | TINYINT | NOT NULL, DEFAULT 0 | 0=强依赖, 1=弱依赖, 2=数据源依赖 |
| max_allowed_delay_sec | INT | NULL | 上游允许的最大延迟秒数,NULL 表示继承全局规则 |
| is_active | TINYINT | NOT NULL, DEFAULT 1 | 1=生效, 0=失效 |
| created_at | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 记录创建时间 |
-- 查询指定下游模型的所有上游依赖
SELECT d.upstream_model_code,
d.dependency_type,
d.max_allowed_delay_sec,
l.status,
l.delay_sec
FROM model_dependency d
LEFT JOIN model_run_log l
ON l.model_code = d.upstream_model_code
AND l.run_date = CURDATE()
AND l.log_id = (
SELECT MAX(log_id) FROM model_run_log
WHERE model_code = d.upstream_model_code
AND run_date = CURDATE()
)
WHERE d.downstream_model_code = 'MORTALITY_2025Q1'
AND d.is_active = 1;
级联告警陷阱:当上游模型延迟超过
max_allowed_delay_sec 时,下游模型即使自身运行正常,也应触发“上游延迟”告警。依赖关系表是避免告警风暴的关键——通过拓扑剪枝,只对根因模型发送告警。
4.3 告警规则配置表(alert_rule_config)
定义延迟尖峰的判定逻辑。支持按模型、按依赖关系、按时间窗口配置不同的阈值与静默策略。规则引擎在每次模型运行结束后,根据该表生成告警事件。
| 字段名 | 数据类型 | 约束 | 说明 |
|---|---|---|---|
| rule_id | INT | PRIMARY KEY, AUTO_INCREMENT | 规则唯一标识 |
| rule_name | VARCHAR(128) | NOT NULL, UNIQUE | 规则名称,如“死亡率模型延迟尖峰” |
| scope_type | TINYINT | NOT NULL, DEFAULT 0 | 0=全局, 1=按模型, 2=按依赖链路 |
| scope_value | VARCHAR(256) | NULL | scope_type 对应的值,如模型编码或链路 ID |
| metric_field | VARCHAR(32) | NOT NULL | 监控指标字段:delay_sec / actual_duration_sec |
| comparison_operator | VARCHAR(8) | NOT NULL | 比较运算符:> / >= / < / <= / BETWEEN |
| threshold_value | DECIMAL(12,2) | NOT NULL | 阈值数值,BETWEEN 时表示下限 |
| threshold_high | DECIMAL(12,2) | NULL | BETWEEN 时的上限值 |
| eval_window_minutes | INT | NOT NULL, DEFAULT 5 | 评估时间窗口(分钟),用于滑动平均或连续命中 |
| consecutive_hits | TINYINT | NOT NULL, DEFAULT 1 | 连续命中次数,大于 1 可减少误报 |
| silence_seconds | INT | NOT NULL, DEFAULT 300 | 告警静默期(秒),避免重复告警 |
| severity | TINYINT | NOT NULL, DEFAULT 2 | 1=信息, 2=警告, 3=严重, 4=灾难 |
| is_enabled | TINYINT | NOT NULL, DEFAULT 1 | 1=启用, 0=禁用 |
| created_at | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 记录创建时间 |
-- 查询适用于某模型的所有启用规则
SELECT rule_id, rule_name, metric_field,
comparison_operator, threshold_value,
threshold_high, eval_window_minutes,
consecutive_hits, silence_seconds, severity
FROM alert_rule_config
WHERE is_enabled = 1
AND (scope_type = 0
OR (scope_type = 1 AND scope_value = 'MORTALITY_2025Q1')
OR (scope_type = 2 AND scope_value IN (
SELECT dep_id FROM model_dependency
WHERE downstream_model_code = 'MORTALITY_2025Q1'
))
);
规则优先级:当多条规则同时命中时,取
severity 最高的规则生成告警;若 severity 相同,则取 threshold_value 最严格的规则。该逻辑在告警生成 SQL 中通过 ROW_NUMBER() 窗口函数实现。
4.4 告警历史记录表(alert_history)
存储所有已触发的告警事件,用于事后分析、报表统计与机器学习模型训练。该表为只追加写入,查询频率高,需按告警时间分区。
| 字段名 | 数据类型 | 约束 | 说明 |
|---|---|---|---|
| alert_id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 告警唯一标识 |
| rule_id | INT | NOT NULL, INDEX | 关联的告警规则 ID |
| model_code | VARCHAR(64) | NOT NULL, INDEX | 触发告警的模型编码 |
| log_id | BIGINT | NOT NULL, INDEX | 关联的运行日志 ID |
| alert_time | DATETIME(3) | NOT NULL, INDEX | 告警触发时间,毫秒精度 |
| metric_value | DECIMAL(12,2) | NOT NULL | 触发告警时的指标实际值 |
| threshold_value | DECIMAL(12,2) | NOT NULL | 触发告警的阈值 |
| severity | TINYINT | NOT NULL | 告警级别,继承自规则 |
| status | TINYINT | NOT NULL, DEFAULT 0 | 0=未确认, 1=已确认, 2=已处理, 3=误报 |
| acknowledged_by | VARCHAR(64) | NULL | 确认人 |
| acknowledged_at | DATETIME | NULL | 确认时间 |
| resolution_notes | TEXT | NULL | 处理备注 |
| created_at | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 记录创建时间 |
-- 统计最近 7 天各模型的告警分布
SELECT model_code,
severity,
COUNT(*) AS alert_count,
AVG(metric_value) AS avg_metric,
MAX(metric_value) AS peak_metric
FROM alert_history
WHERE alert_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY model_code, severity
ORDER BY model_code, severity DESC;
数据保留策略:告警历史表建议按月分区,保留 12 个月在线数据,超过 12 个月的历史归档至冷存储。分区裁剪配合
alert_time 索引,可保证 3 秒内返回任意时间范围的聚合查询。
4.5 表关系与索引策略总结
四张表通过外键逻辑关联,形成完整的告警数据闭环。以下表格汇总核心索引建议,确保监控查询在毫秒级返回。
| 表名 | 核心查询模式 | 推荐索引 | 分区策略 |
|---|---|---|---|
| model_run_log | 按模型+日期查最新状态;按延迟排序查尖峰 | (model_code, run_date); (status, delay_sec) | 按 run_date 月分区 |
| model_dependency | 查下游模型的所有上游;查全量活跃依赖 | (downstream_model_code, is_active); (upstream_model_code) | 不分区(数据量小) |
| alert_rule_config | 查某模型或链路的启用规则 | (is_enabled, scope_type, scope_value) | 不分区(数据量小) |
| alert_history | 按时间范围查告警;按模型聚合统计 | (alert_time); (model_code, alert_time) | 按 alert_time 月分区 |
索引维护建议:每月执行
ANALYZE TABLE 更新统计信息;对于 model_run_log 和 alert_history 的分区表,在分区交换或删除后立即重建全局索引。监控查询若出现全表扫描,优先检查谓词是否包含分区键。