2013-03-24 46 views
2

我的頭正在閱讀有關數據庫的爆炸式增長。我明白你選擇哪一個取決於具體的用例。 所以這裏是我的:我的具體使用案例的哪個數據庫

  • 我有一個web應用程序。一個遊戲。
  • 它是基於水平的,你只能前進不回來。但是你可以繼續玩每個關卡。例如。你完成Level2然後玩Level3。然後再次啓動Level3並將其保存爲Level3b。您現在可以繼續使用Level3和Level3b。
  • 只有一個級別可以隨時播放。
  • 服務器上存儲了三個數據陣列:'progress','choices'和'vars'
  • 當您播放關卡時會對其進行修改,然後將其放入冷藏庫,以便您可以從其開始。

的currenty MySQL的設置是這樣的:

  • 甲表「保存」保存每個遊戲存檔,重要的是saveID和它所屬的用戶ID的元數據。
  • 每個數據數組都有一個對應的表。
  • 如果玩家做出的選擇,所述插入件看起來像這樣:

    INSERT INTO choices VALUES saveid=:saveid, choice=:choice 
    
  • 因此該陣列可以通過執行一個

    SELECT * FROM choices WHERE saveid=:saveid 
    
  • 當電平結束,則數據陣列來重構通過序列化並將它們存儲在'saving'表中,該表中有3列專用於冷藏。
  • 它們的值從其他三個表中清除。
  • 如果玩家從Level3b開始Level4,則序列化數組將從'saved'表中取出,並反序列化並放回到它們各自的表中,儘管使用了Level4的新saveID。

我希望這有點可以理解。 我估計:

  • 將會有更多的寫入速度比讀取
  • 我不需要一致性,如果我理解的正確,因爲玩家永遠只能操縱自己的數據
  • 我不我想我會做任何JOINS,因爲每個表都需要單獨讀取以填充其各自的數據數組
  • 所以我不認爲我會需要很多關係數據庫的方式
  • 它應該是真正輕量級的DB大部分w ay,因爲插頁很小

  • 數據存儲必須可靠!我不認爲如果我們經常開始失去存儲遊戲,玩家會堅持我們。儘管我認爲Redis每秒鐘刷新到磁盤就足夠了,因爲我們並沒有在這裏處理關鍵任務。如果遊戲忘記了最後一個或兩個玩家的遊戲,那麼不要忘記整個遊戲。

你可以在我的使用案例的DB上建議我嗎? 我已經開始使用MySQL,現在我已經閱讀了關於CouchDB,MongoDB,Riak,Cassandra的內容。我認爲Redis不在圖片中,因爲一旦數據集越過你的RAM,那個人似乎會嚴重退化。但我對任何事情都很開放。 我也開放給人們說:堅持MySQL或轉到PostgreSQL。

而且我也會接受對我設置存儲方式的批評。如果你說:選擇Cassandra並將其存儲爲這樣,我會聽。

這是一個完整的檢查,因爲現在是我最後一次能夠在遊戲上線之前更改數據庫,我想要做的最後一件事是在3個月內換掉數據庫,因爲它縮小嚴重。

哦,是的,應用程序是用JavaScript編寫的,與服務器的通信是通過PHP。

+0

您提到的這些數組:您是否曾經需要訪問其各個元素,或者始終將它們作爲數據庫級別的不可分割單元進行存儲(並將其讀取)? – 2013-03-24 19:40:59

+0

Read在數據庫級別始終是一個不可分割的單元。寫一次一個。 – Marcos 2013-03-24 22:16:08

回答

0

我不認爲你需要太擔心數據庫 - 除非你確定你將從第一天開始有一個龐大的用戶羣(網絡應用程序通常不會在一夜之間成名)。 (MySQL),但將所有的數據庫命令保存在一個單獨的包裝類(你應該這樣做)中會好得多。 如果你這樣做,只要你使用標準的SQL並且不做任何特定的數據庫,轉換到另一個數據庫並不那麼困難。

+0

謝謝你的回答。除了純粹的性能之外,我還對像CouchDB或MongoDB這樣的NoSQL數據庫對我的高度非關係案例更「自然」感興趣。我的意思是,我想我幾乎只會做主鍵查找。 – Marcos 2013-03-25 11:09:06

+0

我不是NoSQL的專家,所以很高興能夠糾正,但它看起來像你的數據可能類似於正常的銀行交易。您有一個用戶表(客戶),他們在遊戲中進行選擇(銀行交易),並將結果匯​​總以保存遊戲(帳戶)。話雖如此,如果你沒有未完成的截止日期(你說你有3個月才能發佈?),並且想要嘗試NoSQL作爲個人學習練習,然後花幾天/每週(?)並嘗試一下 - 參見它如何與一些虛擬數據進行比較。 – acutesoftware 2013-03-25 12:28:52

相關問題