派生属性应该作为列重复还是每次计算?

时间:2012-04-28 12:57:02

标签: sql database-design

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

考虑在线测验应用程序。在浏览测验中,每次测验都要展示它有多少问题。

  • 如果测验有10个问题,我可能会将其显示为“10个问题”或“中期测验”。
  • 如果测验有5个问题,我可能会将其显示为“5个问题”或“短期测验”。

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

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

请注意,Quiz_dataQuizQuestion_bank的交叉表(即它存储了2个表的PK)。

请注意,如果我在测验中存储* number_of_question *,则可以在测验中添加/减去问题。除了deleteinsert之外,还需要update

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

2 个答案:

答案 0 :(得分:2)

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

如果在运行时计数太长,将计数存储在某处是有意义的。就个人而言,我甚至不喜欢这样做以提高性能,但如果我可以编程dbms以保证计数总是正确的,我不会太介意。

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

答案 1 :(得分:2)

你需要知道

(1)您的数据更改频率,以及
(2)确定该数字需要多少努力。

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

  • 如果数据变化非常少 - >你应该计算然后存储该值。

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

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

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