2012-04-28 62 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作業來更新所有計數或查找與行不匹配的計數。

相關問題