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 时,下游模型即使自身运行正常,也应触发“上游延迟”告警。依赖关系表是避免告警风暴的关键——通过拓扑剪枝,只对根因模型发送告警。
模型依赖拓扑与延迟传播 上游模型 A 上游模型 B 中间模型 C 下游模型 D 延迟 120s 延迟 85s 级联延迟 说明:上游 A/B 延迟导致中间 C 启动推迟,进而引发下游 D 的级联尖峰。 告警系统通过依赖关系表定位根因节点 A/B,避免对 C/D 重复告警。

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 秒内返回任意时间范围的聚合查询。
告警数据流与表关系 模型运行日志表 模型依赖关系表 告警规则配置表 告警规则引擎 (SQL + 定时任务) 告警历史记录表 (只追加写入) 反馈回路:告警历史用于规则阈值动态调整

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 的分区表,在分区交换或删除后立即重建全局索引。监控查询若出现全表扫描,优先检查谓词是否包含分区键。