Files
aitsc/create_history_tables.sql

203 lines
7.5 KiB
MySQL
Raw Normal View History

2025-10-10 23:39:54 +08:00
-- 创建优化历史功能相关表
-- 执行此脚本前请备份数据库
-- 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;