Files
aitsc/create_history_tables.sql
2025-10-10 23:39:54 +08:00

203 lines
7.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.
-- 创建优化历史功能相关表
-- 执行此脚本前请备份数据库
-- 1. 创建历史记录表
CREATE TABLE IF NOT EXISTS prompt_history (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
user_id INT NOT NULL COMMENT '用户ID',
wx_user_id INT COMMENT '微信用户ID',
original_input TEXT NOT NULL COMMENT '原始输入',
generated_prompt TEXT NOT NULL COMMENT '生成的提示词',
template_id INT COMMENT '使用的模板ID',
template_name VARCHAR(100) COMMENT '模板名称',
generation_time INT COMMENT '生成耗时(毫秒)',
satisfaction_rating TINYINT COMMENT '满意度评分(1-5)',
tags JSON COMMENT '标签列表',
is_favorite BOOLEAN DEFAULT FALSE COMMENT '是否收藏',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_user_id (user_id),
INDEX idx_wx_user_id (wx_user_id),
INDEX idx_created_at (created_at),
INDEX idx_template_id (template_id),
INDEX idx_is_favorite (is_favorite),
INDEX idx_satisfaction_rating (satisfaction_rating)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='提示词历史记录表';
-- 2. 创建历史标签表
CREATE TABLE IF NOT EXISTS history_tags (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
history_id INT NOT NULL COMMENT '历史记录ID',
tag_name VARCHAR(50) NOT NULL COMMENT '标签名称',
tag_type VARCHAR(20) DEFAULT 'custom' COMMENT '标签类型',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
FOREIGN KEY (history_id) REFERENCES prompt_history(id) ON DELETE CASCADE,
INDEX idx_history_id (history_id),
INDEX idx_tag_name (tag_name),
INDEX idx_tag_type (tag_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='历史记录标签表';
-- 3. 创建用户统计表
CREATE TABLE IF NOT EXISTS user_statistics (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
user_id INT UNIQUE NOT NULL COMMENT '用户ID',
total_generations INT DEFAULT 0 COMMENT '总生成数',
favorite_count INT DEFAULT 0 COMMENT '收藏数',
avg_rating DECIMAL(3,2) DEFAULT 0.00 COMMENT '平均评分',
last_generation_at TIMESTAMP NULL COMMENT '最后生成时间',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_user_id (user_id),
INDEX idx_total_generations (total_generations),
INDEX idx_last_generation_at (last_generation_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户统计信息表';
-- 4. 添加外键约束(如果存在相关表)
-- 注意:这些外键约束是可选的,根据实际数据库结构调整
-- 如果存在user表添加外键约束
-- ALTER TABLE prompt_history ADD CONSTRAINT fk_prompt_history_user_id
-- FOREIGN KEY (user_id) REFERENCES user(uid) ON DELETE CASCADE;
-- 如果存在wx_user表添加外键约束
-- ALTER TABLE prompt_history ADD CONSTRAINT fk_prompt_history_wx_user_id
-- FOREIGN KEY (wx_user_id) REFERENCES wx_user(id) ON DELETE SET NULL;
-- 如果存在prompt_template表添加外键约束
-- ALTER TABLE prompt_history ADD CONSTRAINT fk_prompt_history_template_id
-- FOREIGN KEY (template_id) REFERENCES prompt_template(id) ON DELETE SET NULL;
-- 5. 创建一些示例数据(可选)
-- INSERT INTO user_statistics (user_id, total_generations, favorite_count, avg_rating)
-- VALUES (1, 0, 0, 0.00);
-- 6. 创建视图(可选,用于统计查询)
CREATE OR REPLACE VIEW history_statistics AS
SELECT
h.user_id,
COUNT(*) as total_count,
COUNT(CASE WHEN h.is_favorite = TRUE THEN 1 END) as favorite_count,
AVG(h.satisfaction_rating) as avg_rating,
MAX(h.created_at) as last_generation_at,
COUNT(CASE WHEN h.created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY) THEN 1 END) as week_count,
COUNT(CASE WHEN h.created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY) THEN 1 END) as month_count
FROM prompt_history h
GROUP BY h.user_id;
-- 7. 创建存储过程(可选,用于清理旧数据)
DELIMITER //
CREATE PROCEDURE CleanOldHistory(IN days_to_keep INT)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
START TRANSACTION;
-- 删除指定天数前的历史记录
DELETE FROM prompt_history
WHERE created_at < DATE_SUB(NOW(), INTERVAL days_to_keep DAY);
-- 更新用户统计
UPDATE user_statistics us
SET
total_generations = (
SELECT COUNT(*) FROM prompt_history h
WHERE h.user_id = us.user_id
),
favorite_count = (
SELECT COUNT(*) FROM prompt_history h
WHERE h.user_id = us.user_id AND h.is_favorite = TRUE
),
avg_rating = (
SELECT AVG(h.satisfaction_rating) FROM prompt_history h
WHERE h.user_id = us.user_id AND h.satisfaction_rating IS NOT NULL
),
last_generation_at = (
SELECT MAX(h.created_at) FROM prompt_history h
WHERE h.user_id = us.user_id
),
updated_at = NOW()
WHERE us.user_id IN (
SELECT DISTINCT user_id FROM prompt_history
);
COMMIT;
END //
DELIMITER ;
-- 8. 创建触发器(可选,用于自动更新统计)
DELIMITER //
CREATE TRIGGER update_user_stats_after_insert
AFTER INSERT ON prompt_history
FOR EACH ROW
BEGIN
INSERT INTO user_statistics (user_id, total_generations, favorite_count, avg_rating, last_generation_at)
VALUES (NEW.user_id, 1, IF(NEW.is_favorite, 1, 0), NEW.satisfaction_rating, NEW.created_at)
ON DUPLICATE KEY UPDATE
total_generations = total_generations + 1,
favorite_count = favorite_count + IF(NEW.is_favorite, 1, 0),
avg_rating = (
SELECT AVG(satisfaction_rating)
FROM prompt_history
WHERE user_id = NEW.user_id AND satisfaction_rating IS NOT NULL
),
last_generation_at = NEW.created_at,
updated_at = NOW();
END //
DELIMITER ;
DELIMITER //
CREATE TRIGGER update_user_stats_after_update
AFTER UPDATE ON prompt_history
FOR EACH ROW
BEGIN
UPDATE user_statistics
SET
total_generations = (
SELECT COUNT(*) FROM prompt_history WHERE user_id = NEW.user_id
),
favorite_count = (
SELECT COUNT(*) FROM prompt_history
WHERE user_id = NEW.user_id AND is_favorite = TRUE
),
avg_rating = (
SELECT AVG(satisfaction_rating) FROM prompt_history
WHERE user_id = NEW.user_id AND satisfaction_rating IS NOT NULL
),
updated_at = NOW()
WHERE user_id = NEW.user_id;
END //
DELIMITER ;
DELIMITER //
CREATE TRIGGER update_user_stats_after_delete
AFTER DELETE ON prompt_history
FOR EACH ROW
BEGIN
UPDATE user_statistics
SET
total_generations = (
SELECT COUNT(*) FROM prompt_history WHERE user_id = OLD.user_id
),
favorite_count = (
SELECT COUNT(*) FROM prompt_history
WHERE user_id = OLD.user_id AND is_favorite = TRUE
),
avg_rating = (
SELECT AVG(satisfaction_rating) FROM prompt_history
WHERE user_id = OLD.user_id AND satisfaction_rating IS NOT NULL
),
updated_at = NOW()
WHERE user_id = OLD.user_id;
END //
DELIMITER ;
-- 执行完成提示
SELECT '历史记录表创建完成!' as message;