2011-09-20 66 views
3

假設我有一個rails應用程序,包含3個表格,一個用於提問,一個用於選項(可能對此問題的答案),另一個用於投票。Rails,數據結構和性能

當前,當請求關於給定問題的統計信息時,我必須爲每個選項進行一次SQL查詢,它將查找「票數」表(大約150萬個條目)並計算此選項的次數選擇。這很慢,需要4/5秒。

我正在考慮在問題表中直接添加一列,以便每次有人進行投票時存儲統計信息並更新它們。這是不錯的做法嗎?因爲對於已經在投票表中的信息似乎是多餘的,所以加載只會更快。 或者,也許我應該創建另一個表,這將保存這些統計數據爲每個問題? 感謝您的諮詢!

回答

3

的Rails提供了一個功能叫做counter_cache這將有助於你的目的

的counter_cache選項添加到票模型

class Vote < AR::Base 
     belongs_to :question, :counter_cache => true 
    end 

及以下遷移

add_column :questions, :votes_count, :integer, :default => 0 

This sho ULD遞增的問題表votes_count現場爲每一位新紀錄票表

欲瞭解更多信息:RailsCast

+1

我認爲'投票belongs_to:選項'不是':問題',但是這基本上是他應該使用的。 – Mischa

+0

非常感謝,我會盡力 – Emmanuel

0

你可能可以使用GROUP BY做一個「聰明」的SQL查詢,它會在一個查詢中給你預期的結果。如果你的查詢很慢,你可能需要在你的表上添加一些索引。

+0

是的,我想過這樣做太多,但即使通過它「聰明」組還是有點慢,我我會嘗試counter_cache解決方案上面 – Emmanuel