2

我猜这是空间与时间的问题。

考虑一个在线测验应用程序。在浏览测验中,对于每个测验,我希望显示它有多少问题。

  • 如果测验有 10 个问题,我可以将其显示为“10 个问题”或“中等持续时间测验”。
  • 如果测验有 5 个问题,我可以将其显示为“5 个问题”或“短期测验”。

Quiz表中,我没有用于存储问题数量的列。要找到这么多问题,我可以

SELECT COUNT(question_id) 
FROM Quiz 
NATURAL JOIN Quiz_data 
WHERE quiz_id = '$quiz_id'

请注意,这是一个和Quiz_data的交叉表(即它存储两个表的 PK)。QuizQuestion_bank

请注意,如果我将 *number_of_question* 存储在测验中,则可能会从测验中添加/减去问题。因此,除了deleteand之外insert,还需update要这样做。

问题:我应该每次计算,还是将值存储在Quiz表中?帖子标题在一般意义上说同样的问题。

4

2 回答 2

2

你得知道

(1) 您的数据多久更改一次,以及
(2) 确定该数字需要付出多少努力。

作为一般建议,我会看看:

  • 如果数据很少更改->您应该计算然后存储该值。

  • 如果确定该数字的成本非常高 -> 尝试计算一次,存储并重复使用。

  • 另一方面,如果准确计数至关重要 -> 根据需要确定。

这不是一个明确的是或否决定——它实际上取决于您的数据、您的要求以及计算这样一个数字/计数的成本。

于 2012-04-28T14:49:27.193 回答
2

在正常情况下,您应该在运行时计算行数。在运行时计数将始终为您提供正确的行数。但在某些情况下,在运行时计数需要太长时间。(不过,在您的情况下,它看起来不应该花费太长时间。)

在运行时计数需要太长时间的情况下,将计数存储在某处是有意义的。就个人而言,我什至不喜欢这样做来提高性能,但如果我可以对 dbms 进行编程以保证计数始终正确,我不会太介意。

如果无法对 dbms 进行编程以保证完整性,并且计数很关键,我通常会运行一个 cron 作业来更新所有计数或查找与行不匹配的计数。

于 2012-04-28T13:17:36.443 回答