这是我的结构体(附带值):
user_eval_history table
user_eval_id | user_id | is_good_eval
--------------+---------+--------------
1 | 1 | t
2 | 1 | t
3 | 1 | f
4 | 2 | t
user_metrics table
user_metrics_id | user_id | nb_good_eval | nb_bad_eval
-----------------+---------+--------------+-------------
1 | 1 | 2 | 1
2 | 2 | 1 | 0
为了提高访问速度(性能),我希望避免每次都从历史记录重新计算用户评估。我想在每次给用户进行新的评估时(也就是每次在 user_eval_history 表中插入时),存储/更新评估总和(针对给定的用户),以便更新相应的 user_metrics 表。
我觉得可以通过触发器和存储过程来实现,但我无法找到正确的语法。
我认为需要执行以下步骤:
1. 在用户指标上创建一个触发器:
CREATE TRIGGER update_user_metrics_trigger AFTER INSERT
ON user_eval_history
FOR EACH ROW
EXECUTE PROCEDURE update_user_metrics('user_id');
2. 创建一个存储过程 update_user_metrics,它
2.1 从 user_eval_history 表中计算 user_id 的指标
SELECT
user_id,
SUM( CASE WHEN is_good_eval='t' THEN 1 ELSE 0) as nb_good_eval,
SUM( CASE WHEN is_good_eval='f' THEN 1 ELSE 0) as nb_bad_eval
FROM user_eval_history
WHERE user_id = 'user_id' -- don't know the syntax here
2.2.1 如果不存在,创建用户度量的条目
INSERT INTO user_metrics
(user_id, nb_good_eval, nb_bad_eval) VALUES
(user_id, nb_good_eval, nb_bad_eval) -- Syntax?????
2.2.2 如果已存在,则更新user_metrics条目
UPDATE user_metrics SET
(user_id, nb_good_eval, nb_bad_eval) = (user_id, nb_good_eval, nb_bad_eval)
我认为我已经接近所需的内容,但不知道如何实现。特别是我不了解语法。
有任何想法吗?
注意:请不要给出"RTFM"的答案,我查了几个小时也没有找到除了一些基本示例以外的任何东西。
\t tbl
得到的内容)将非常有用,它展示了数据类型、约束以及其他所有信息。 - Erwin Brandstetter