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) 确定这个数字需要多少努力 作为一般性建议,我将考虑:
- 如果数据很少更改->则应计算并存储该值
- 如果确定该数字的成本非常高->尝试计算一次,存储并重新使用
- 另一方面,如果有一个准确的计数是至关重要的->根据需要确定它
(2) 确定这个数字需要多少努力 作为一般性建议,我将考虑:
- 如果数据很少更改->则应计算并存储该值
- 如果确定该数字的成本非常高->尝试计算一次,存储并重新使用
- 另一方面,如果有一个准确的计数是至关重要的->根据需要确定它
这不是一个明确的“是”或“否”决定——它实际上取决于您的数据、您的要求以及计算此类数字/计数的成本。由于问题的数量很少改变,准确性也不重要(对于“中”/“小”),我将选择在列中存储。谢谢由于ques的数量很少更改,而且准确性也不重要(对于“中”/“小”),因此我将选择在列中存储。谢谢