Files
sentinel-home-ai/scripts/ddl.sql
ericwyuan 8cb5553beb fix: Edge端三处修复 — API key丢失致全模型失败 + 失败结果黑洞 + 重派发死锁
根因: Edge服务手动重启未source .env,GEMINI/NVIDIA key丢失,
所有视觉模型调用失败("All models failed"),且失败结果永不回传NAS。

1. config_loader: 启动时自动加载.env(export KEY=VALUE),已存在环境变量不覆盖
2. queue_manager.enqueue: FAILED(或已交付SUCCESS)行重置为PENDING复用重跑,
   修复 INSERT OR IGNORE + UNIQUE(nas_task_id) 导致的静默忽略死锁
3. get_undelivered_results: 包含FAILED状态,/results构造failed负载,
   NAS Poller可感知失败避免僵尸循环空转重传
4. ddl.sql: failure_stage ENUM 增加 'process'(与db_layer valid_stages对齐),
   修复 pymysql DataError 1265

验证: task 293(压缩后22MB) NVIDIA降级分析成功→event_id=13;
task 295 全链路成功→event_id=14;NAS端ENUM已同步ALTER
2026-08-20 15:35:40 +08:00

132 lines
6.5 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ============================================================
-- Sentinel Home AI - 数据库 DDL
-- 版本: v1.0
-- 日期: 2026-08-19
-- 数据库: MariaDB (MySQL 兼容)
-- ============================================================
-- 创建数据库(如不存在)
CREATE DATABASE IF NOT EXISTS sentinel_home_ai
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE sentinel_home_ai;
-- ============================================================
-- 1. 任务表 process_tasks
-- ============================================================
CREATE TABLE IF NOT EXISTS process_tasks (
task_id INT AUTO_INCREMENT PRIMARY KEY,
video_path VARCHAR(500) NOT NULL COMMENT '视频在 NAS 上的绝对路径',
video_url VARCHAR(500) NOT NULL COMMENT 'Video-Server 提供的下载 URL',
status ENUM('PENDING','PROCESSING','SUCCESS','FAILED') DEFAULT 'PENDING',
retry_count INT DEFAULT 0,
max_retries INT DEFAULT 3,
next_retry_at DATETIME NULL COMMENT '下次重试时间(退避策略)',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
error_message TEXT NULL,
failure_stage ENUM('download','extract','vlm_visual','vlm_fusion','callback','process') NULL COMMENT '失败阶段process=Edge 消费者处理异常)',
heartbeat_at DATETIME NULL COMMENT '心跳时间戳(首期预留,不写入)',
INDEX idx_status (status),
INDEX idx_created (created_at),
INDEX idx_next_retry (next_retry_at)
) ENGINE=InnoDB COMMENT='视频分析任务表';
-- ============================================================
-- 2. 事件表 monitor_events
-- ============================================================
CREATE TABLE IF NOT EXISTS monitor_events (
event_id INT AUTO_INCREMENT PRIMARY KEY,
task_id INT NOT NULL,
event_start_time DATETIME NOT NULL COMMENT '事件开始时间',
event_end_time DATETIME NOT NULL COMMENT '事件结束时间',
camera_name VARCHAR(50) COMMENT '摄像头名称/位置',
global_summary TEXT COMMENT 'VLM 生成的整体摘要',
entities_json JSON NOT NULL COMMENT '实体列表 JSON 数组',
compute_provider JSON NOT NULL COMMENT '模型来源数组,如 ["ollama","gemini"]',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_event_start (event_start_time),
INDEX idx_compute_provider (compute_provider),
FOREIGN KEY (task_id) REFERENCES process_tasks(task_id) ON DELETE CASCADE
) ENGINE=InnoDB COMMENT='监控事件聚合表';
-- ============================================================
-- 3. 每日摘要表 daily_summaries预留
-- ============================================================
CREATE TABLE IF NOT EXISTS daily_summaries (
id INT AUTO_INCREMENT PRIMARY KEY,
target_date DATE NOT NULL UNIQUE COMMENT '目标日期',
summary_text TEXT COMMENT '当日摘要文本',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB COMMENT='每日摘要表(首期预留)';
-- ============================================================
-- 4. 事件明细表 event_details
-- 每关键帧一条,由 VLM 输出 frame_details 拆分落库
-- ============================================================
CREATE TABLE IF NOT EXISTS event_details (
detail_id INT AUTO_INCREMENT PRIMARY KEY,
event_id INT NOT NULL COMMENT '关联 monitor_events.event_id',
task_id INT NOT NULL COMMENT '冗余,便于查询',
frame_index INT NOT NULL COMMENT '关键帧序号1-8',
frame_timestamp DATETIME NOT NULL COMMENT '该帧对应的绝对时间点',
camera_name VARCHAR(50) COMMENT '摄像头位置(如"客厅"',
person VARCHAR(50) NOT NULL COMMENT '成员名或"人物A/B/C"或"未知访客"',
action VARCHAR(200) NOT NULL COMMENT '动作描述AI 自由生成,无枚举)',
clothing VARCHAR(100) COMMENT '衣着描述',
is_attention_event BOOLEAN DEFAULT FALSE COMMENT 'AI 自行判断是否为关注事件',
source_providers JSON NOT NULL COMMENT '识别到该明细的模型来源数组',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_event_id (event_id),
INDEX idx_frame_timestamp (frame_timestamp),
INDEX idx_person (person),
INDEX idx_queried_date (frame_timestamp),
FOREIGN KEY (event_id) REFERENCES monitor_events(event_id) ON DELETE CASCADE
) ENGINE=InnoDB COMMENT='事件明细表(每关键帧一条)';
-- ============================================================
-- 5. 对话记录表 chat_history
-- ============================================================
CREATE TABLE IF NOT EXISTS chat_history (
chat_id INT AUTO_INCREMENT PRIMARY KEY,
user_question TEXT NOT NULL COMMENT '用户问题',
ai_answer TEXT NOT NULL COMMENT 'AI 回答',
context_summary TEXT COMMENT '问答时使用的上下文摘要',
queried_date DATE COMMENT '查询的日期范围',
queried_person VARCHAR(50) COMMENT '查询的人物',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_created (created_at),
INDEX idx_queried_date (queried_date),
INDEX idx_queried_person (queried_person)
) ENGINE=InnoDB COMMENT='用户与 AI 问答记录表';
-- ============================================================
-- 6. 家庭成员表 family_members
-- 交互式命名VLM 自动按特征提取"人物A/B/C",用户命名为真实名字
-- ============================================================
CREATE TABLE IF NOT EXISTS family_members (
member_id INT AUTO_INCREMENT PRIMARY KEY,
abstract_label VARCHAR(20) NOT NULL UNIQUE COMMENT 'VLM 首次提取的抽象标识,如"人物A"',
real_name VARCHAR(50) COMMENT '用户命名的真实名字,如"汤圆"NULL 表示未命名',
feature_description TEXT COMMENT 'VLM 提取的特征描述',
first_seen_at DATETIME COMMENT '首次被提取的时间',
named_at DATETIME NULL COMMENT '用户命名的时间',
named_by VARCHAR(50) COMMENT '命名人',
is_active BOOLEAN DEFAULT TRUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_real_name (real_name),
INDEX idx_abstract_label (abstract_label),
INDEX idx_is_active (is_active)
) ENGINE=InnoDB COMMENT='家庭成员表(交互式命名)';
-- ============================================================
-- 验证
-- ============================================================
SELECT 'DDL 执行完成' AS message;
SELECT TABLE_NAME, TABLE_COMMENT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'sentinel_home_ai'
ORDER BY TABLE_NAME;