14

ゲーム用の小さなアドオンを作成しています。プレーヤーに関する情報を保存する必要があります。

  • ユーザー名
  • IPアドレス
  • ゲーム内の場所
  • その IP に由来する代替ユーザー名またはそのユーザー名に由来する代替 IP アドレスのリスト

少し前に、RAM に保持できない大量の情報を保存する場合を除き、データベースを使用すべきではないという記事を読みました。だから私はpythonでshelveモジュールを使ってみましたが、それが良い考えかどうかはわかりません.

データベースを使用するのが良い考えだと思うのはいつですか? また、別の方法で情報を保存する方が良いのはいつですか? また、データベースとフラットファイルデータベース以外に情報を保存する他の方法は何ですか.

4

2 に答える 2

9

最も重要なことは、特にパフォーマンスや高い信頼性が必要な場合を除いて、コードを最も簡単に記述できるようにすることです。


データが非常に構造化されている場合(そしてSQLを知っているか、学習する意思がある場合)、のようなデータベースを使用するのsqlite3が適切な場合があります。(データベースのサイズとRAMに関するコメントは無視してください。データの構造上、非常に小さなデータセットでもデータベースが適切な場合があります。)

データが比較的単純で、データベースが(通常)データベースの信頼性を必要としない場合は、プログラムの実行中に組み込みのデータ型の1つにデータを格納することはおそらく問題ありません。

ディスクに保存されたデータを人間が読める形式(そして少しの努力で編集可能)にしたい場合はjson、基本的なPythonオブジェクトが何の努力もせずにシリアル化されるため、JSON(組み込みモジュールがあります)のような形式が適しています。データがそれほど単純でない場合、YAMLは本質的にJSONの拡張バージョンです(PyYAMLは非常に優れています)。同様に、CSVファイル(モジュール)を使用することもできますがcsv、これはJSONやYAML、または単なるカスタムテキスト形式ほど良くはありません(ただし、エラー処理などを適切に実装するには、かなりの労力が必要です)。

最後に、データにさらに高度なオブジェクト(再帰辞書、複雑なカスタムデータ型など)が含まれている場合は、組み込みのバイナリシリアル化手法(など)のいずれpickleshelveを使用するのが適切かもしれませんが、YAMLはこれらの多く(再帰データを含む)を処理できます構造)。

いくつかの一般的なポイント:

  • プレーンテキスト形式は、値を簡単に調整でき、デバッグ/テストが簡単であるため、便利です。
  • バイナリ形式は、少し余分な労力をかけずに値を調整できないことを意味し(ただし、調整できないとは言えません)、ファイルサイズが小さい(おそらく関連性がない)ため、優れています。
于 2012-06-09T02:49:43.443 に答える
7

「データベース」が「リレーショナル データベース」を意味すると仮定すると、SQLite のような組み込みデータベースでさえ、プレーン テキスト ファイルと比較していくらかのオーバーヘッドが発生します。ただし、独自のロールに比べて、そのオーバーヘッドに見合う価値がある場合があります。

尋ねなければならない最大の質問は、リレーショナル データを格納しているかどうか、つまり、正規化や SQL クエリなどの処理がまったく意味があるかどうかです。結合を使用して複数のテーブル間でデータを検索する必要がある場合は、必ずリレーショナル データベースを使用する必要があります。一方、主キーに基づいて1 つのテーブルを参照するだけでよい場合は、おそらく CSV ファイルが必要です。Pickle と shelve は、永続化しているのがプログラムで使用するオブジェクトである場合に役立ちます。関連するマジック メソッドを既存のクラスに追加するだけで、すべてが意味をなすと期待できる場合です。

確かに、「大量のデータがない限り、データベースを使用するべきではありません」というのは最善のアドバイスではありません。データの量は、データベースを使用している場合にどのデータベースを使用するかによって異なります。たとえば、SQLite は、Stackoverflow のサイズには適していませんが、MySQL や Postgres は、ユーザーが 5 人いる場合には、ほぼ間違いなくやり過ぎです。

于 2012-06-09T02:39:37.530 に答える