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

Sql 派生属性应该作为列复制还是每次计算?,sql,database-design,Sql,Database Design,我想这是一个空间与时间的问题 考虑一个在线测验应用程序。在浏览测验中,每次测验中,我都想展示它有多少个问题 如果一个测验有10个问题,我可以将其显示为“10个问题”或“中等持续时间测验” 如果一个测验有5个问题,我可以显示为“5个问题”或“短期测验” 在测验表中,我没有存储问题数量的列。 要找到那么多的问题,我可以 SELECT COUNT(question_id) FROM Quiz NATURAL JOIN Quiz_data WHERE quiz_id = '$quiz_id'

我想这是一个空间与时间的问题

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

  • 如果一个测验有10个问题,我可以将其显示为“10个问题”或“中等持续时间测验”
  • 如果一个测验有5个问题,我可以显示为“5个问题”或“短期测验”
测验
表中,我没有存储问题数量的列。 要找到那么多的问题,我可以

SELECT COUNT(question_id) 
FROM Quiz 
NATURAL JOIN Quiz_data 
WHERE quiz_id = '$quiz_id'
请注意,
quick\u data
quick
Question\u bank
的交叉表(即它存储两个表的PK)

请注意,如果我在测验中存储*问题数量*,则可以从测验中添加/减去问题。因此,除了
删除
插入
之外,还需要
更新


问题:我应该每次计算,还是将值存储在
quick
表中?文章标题从一般意义上讲也是同样的问题。

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

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


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

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

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

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

您需要知道

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

作为一般性建议,我将考虑:

  • 如果数据很少更改->则应计算并存储该值

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

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

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

您需要知道

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

作为一般性建议,我将考虑:

  • 如果数据很少更改->则应计算并存储该值

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

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


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

由于问题的数量很少改变,准确性也不重要(对于“中”/“小”),我将选择在列中存储。谢谢由于ques的数量很少更改,而且准确性也不重要(对于“中”/“小”),因此我将选择在列中存储。谢谢