[1.2] 数据库 DDL - 六张表完整建表 + 初始化脚本

This commit is contained in:
ericwyuan
2026-08-19 22:18:22 +08:00
parent 3a315c7129
commit d6d294bbbe
2 changed files with 256 additions and 0 deletions

131
scripts/ddl.sql Normal file
View File

@@ -0,0 +1,131 @@
-- ============================================================
-- 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') NULL COMMENT '失败阶段',
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;