2012-11-04 64 views
3

我們在Ruby on Rails/postgres服務器上託管iPhone社交遊戲的後端。使用種子隨機序列而不是100M行關係表

每個遊戲有54個問題通過數據庫中的關係表連接。由於我們目前有大約2百萬個正在進行的遊戲,所以關係表包含大約100M行。這消耗了大量的記憶。我們現在考慮構建一個使用由game_id播種的僞隨機序列生成54個問題ID的算法。這個想法是產生一個看似隨機的問題集合,而不會將明確的遊戲問題關係保存到數據庫中。這樣我們可以將加載從數據庫移動到應用程序服務器。這是一個好主意嗎?

僞代碼:

r = Random.new(game_id) 
q1_id = r.rand(n_questions) 
q2_id = r.rand(n_questions) 
... 
+1

您可能希望這樣的事情,而不是: 'n_questions.times.to_a.shuffle(隨機:Random.new(game_id))' –

+0

有什麼保證,該隨機算法不會隨着Ruby實現改變(MRI ,jruby,rbx)和ruby版本。 –

回答

2

是的,你需要的是一個確定性的函數,它的遊戲ID和產生的序列。簡單到向gameId添加一個salt並散列結果應該可以做得很好,那麼它只是將結果值映射到問題ID的問題。 (看看這種事情的combinatorics。)

如果你然後處理的東西看起來像一個由遊戲標識符鍵入的問題標識符列表,並且你需要對答案的持久性支持,那麼有更好的選項而不是RDBMS。先看看Redis吧。