2012-06-09 53 views
13

我正在一點點附加了一個遊戲,它需要存儲在播放器上的信息:什麼時候適合使用一個數據庫,在Python

  • 用戶名
  • IP地址
  • 在遊戲
  • 位置
  • 已經從來自該用戶名

該IP或替代IP地址來替換用戶名列表我讀到一篇文章前一段時間說,除非我儲存了大量不能用RAM存儲的信息,否則我不應該使用數據庫。所以我嘗試在Python中使用擱置模塊,但我不確定這是否是一個好主意。

你們什麼時候認爲使用數據庫是個好主意,什麼時候以其他方式存儲信息更好?除了數據庫和平面文件數據庫之外,還有其他什麼方式來存儲信息。

+1

想一想:你需要存儲一些東西會不會「持久」? – xvatar

+0

我會將它存儲在一個配置文件中,在程序執行期間將它讀入內存,如果發生任何更改,則將其寫回到配置文件中。 –

+3

@xvatar:如果你用「是」回答了這個問題,那麼下一個問題就是「我真的需要比文本文件重嗎?」 –

回答

8

最重要的是,除非您特別需要性能或高可靠性,否則請儘量讓您的代碼最簡單/最容易編寫。


如果您的數據非常結構化的(你知道SQL或願意學習),然後使用像sqlite3數據庫可能是適當的。 (您應該忽略關於數據庫大小和RAM的評論:由於數據的結構如何,有時數據庫適用於甚至非常小的數據集。)

如果數據相對簡單並且您不需要數據庫(通常)具有的可靠性,然後在程序運行時將其存儲在某個內置數據類型中可能沒有問題。

如果您希望存儲在磁盤上的數據是人類可讀的(並且是可編輯的,只需付出一點努力),那麼像JSON這樣的格式(內置json模塊)很好,因爲基本的Python對象序列化沒有任何努力。如果數據不那麼簡單,那麼YAML本質上是JSON的擴展版本(PyYAML非常好)。同樣,你可以使用CSV文件(csv模塊),雖然這不如JSON或YAML,或只是自定義文本格式(但這是相當多的努力來獲得錯誤處理等等實施) 。

最後,如果您的數據包含更先進的對象(例如遞歸的字典,或複雜的自定義數據類型),然後使用內建的二進制序列化技術之一(pickleshelve等)可能是適當的,但是,YAML可以處理很多這些東西(包括遞歸數據結構)。

一些一般性的要點:

  • 純文本格式是好的,因爲它們允許值,可以很容易地調整和調試/測試很容易
  • 二進制格式都不錯,因爲他們的意思是值不了(不是說它們不能被調整),並且文件大小較小(可能不相關)
6

假設'數據庫'的意思是'關係數據庫' - 即使像SQLite這樣的嵌入式數據庫,與純文本文件相比,也會帶來一些開銷。但是,有時候這種開銷是值得的,而不是滾動你自己的。

您需要問的最大問題是您是否在存儲關係數據 - 無論標準化和SQL查詢等事情是否有意義。如果您需要使用連接在多個表中查找數據,您當然應該使用關係數據庫 - 這就是對於。另一方面,如果您只需根據其主鍵查找一個表,則可能需要CSV文件。如果你堅持的是你在程序中使用的對象,那麼Pickle和擱置是有用的 - 如果你可以將相關的魔術方法添加到你現有的類中,並期望它們都有意義。

當然「你不應該使用數據庫,除非你有很多數據」不是最好的建議 - 如果你使用的數據量更多的數據可能會使用的數據量。例如,SQLite不適用於Stackoverflow的大小 - 但是,MySQL或Postgres對於五個用戶來說幾乎肯定會過度。

相關問題