2012-04-28 59 views
2

这是空间与时间的问题,我想。派生属性应该作为列进行复制还是每次计算?

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

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

Quiz表中,我没有用于存储问题数量的列。 要找出一些问题,我可以做

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

注意Quiz_dataQuizQuestion_bank交叉表(即它同时存储2表的PKS)。

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

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

回答

2

你需要知道

(1)多久你的数据的变化,
(2)需要多少努力来确定该号码。

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

  • 如果数据变化极少 - >您应该计算,然后存储该值。

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

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

这不是一个明确的是或否的决定 - 这真的取决于你的数据,你的要求,以及如何昂贵的它是计算这样一个数/计数。

+0

由于问题的数量很少发生变化,并且准确性不重要(对于'中等'/'小'),我会去存储在一列中。谢谢! – 2012-04-28 14:56:50

2

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

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

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

相关问题