保持更新记录的更新记录
Keeping an updated tally of changing records
我有一份学生名单和他们的科目:
id | student | subject
---|---------|--------
1 | adam | math
2 | bob | english
3 | charlie | math
4 | dan | english
5 | erik | math
我根据上面的列表创建了一个统计表,汇总了每个学科有多少学生:
id | subject | students
---|---------|--------
1 | math | 3
2 | english | 2
学生名单会不断扩大,并且会定期进行汇总。
首先我将 Tally 放在单独的 table 中的原因是因为原来的 table 应该很大(这只是我原来问题的简化)因此,要快速查询原始 table 当前的计数是不可行的。
无论如何,只要学生不改变他们的主题,聚合就非常简单。
但现在我想添加一个功能,让学生可以改变他们的主题。
我以前的方法是这样的:在更新 Tally 时,我保留一个 counter
变量,直到我已经计算过哪一行学生。下次我只考虑在该行之后添加的记录。
另外,我保留 counter
的原因是因为学生 table 很大,我不想每次都扫描整个 table,因为它不会'扩展性好。
如果所有学生都是独一无二的并且没有人改变他们的主题,则效果很好。
但它现在分崩离析了,因为我无法再解释在计数器之前更新的行。
我的第二种方法是使用 updated_at
字段(而不是 counter
)并以这种方式跟踪新修改的行。
但我仍然不知道如何准确地更新 Tally。
比如说,Erik 在上述场景中将他的主题从“数学”更改为“英语”。当我 运行 更新 Tally 的脚本时,虽然它确实找到了新更新的行,但它只是说 {"erik": "english"}
。我怎么知道它从 改变了什么?我需要知道这一点才能正确减少 Tally table 中的“math”,同时增加“english”。
有什么办法可以解决这个问题吗?
再次总结我的问题,我想找到一种方法来准确地更新 Tally table(一个 运行s 定期更新的过程)updated/modified 学生中的行 table.
如果需要的话,我会使用 NodeJS 和 PostgreSQL。
当学生添加主题、删除主题或更改主题时,你为什么不这样做。
- 学生添加新科目时: 增加
UPDATE tbl_tally SET student = student + 1 WHERE subject = :subject
;
- 当学生删除主题时: 只需减少
UPDATE tbl_tally SET student = student - 1 WHERE subject = :subject
;
- 学生换科目时: 新科目加一,旧科目减一
UPDATE tbl_tally SET student = student - 1 WHERE subject = :old_subject
;
UPDATE tbl_tally SET student = student + 1 WHERE subject = :new_subject
;
我不熟悉 PostgreSQL,但在 MySQL 中,您甚至可以使用触发器来完成。我觉得PostgreSQL也有触发器。
我有一份学生名单和他们的科目:
id | student | subject
---|---------|--------
1 | adam | math
2 | bob | english
3 | charlie | math
4 | dan | english
5 | erik | math
我根据上面的列表创建了一个统计表,汇总了每个学科有多少学生:
id | subject | students
---|---------|--------
1 | math | 3
2 | english | 2
学生名单会不断扩大,并且会定期进行汇总。
首先我将 Tally 放在单独的 table 中的原因是因为原来的 table 应该很大(这只是我原来问题的简化)因此,要快速查询原始 table 当前的计数是不可行的。
无论如何,只要学生不改变他们的主题,聚合就非常简单。
但现在我想添加一个功能,让学生可以改变他们的主题。
我以前的方法是这样的:在更新 Tally 时,我保留一个 counter
变量,直到我已经计算过哪一行学生。下次我只考虑在该行之后添加的记录。
另外,我保留 counter
的原因是因为学生 table 很大,我不想每次都扫描整个 table,因为它不会'扩展性好。
如果所有学生都是独一无二的并且没有人改变他们的主题,则效果很好。
但它现在分崩离析了,因为我无法再解释在计数器之前更新的行。
我的第二种方法是使用 updated_at
字段(而不是 counter
)并以这种方式跟踪新修改的行。
但我仍然不知道如何准确地更新 Tally。
比如说,Erik 在上述场景中将他的主题从“数学”更改为“英语”。当我 运行 更新 Tally 的脚本时,虽然它确实找到了新更新的行,但它只是说 {"erik": "english"}
。我怎么知道它从 改变了什么?我需要知道这一点才能正确减少 Tally table 中的“math”,同时增加“english”。
有什么办法可以解决这个问题吗?
再次总结我的问题,我想找到一种方法来准确地更新 Tally table(一个 运行s 定期更新的过程)updated/modified 学生中的行 table.
如果需要的话,我会使用 NodeJS 和 PostgreSQL。
当学生添加主题、删除主题或更改主题时,你为什么不这样做。
- 学生添加新科目时: 增加
UPDATE tbl_tally SET student = student + 1 WHERE subject = :subject
; - 当学生删除主题时: 只需减少
UPDATE tbl_tally SET student = student - 1 WHERE subject = :subject
; - 学生换科目时: 新科目加一,旧科目减一
UPDATE tbl_tally SET student = student - 1 WHERE subject = :old_subject
;UPDATE tbl_tally SET student = student + 1 WHERE subject = :new_subject
;
我不熟悉 PostgreSQL,但在 MySQL 中,您甚至可以使用触发器来完成。我觉得PostgreSQL也有触发器。