3

私はPythonでMUD(Multi User Dungeon)に取り組んでおり、部屋、敵、アイテムなどを追加する必要があるところまで来ています。これをすべてハードコードすることもできますが、これはデータベースの仕事の多く。

しかし、これまでデータベースを実際に扱ったことがないので、これを設定する方法について何かアドバイスがあれば教えてください。

  • データはどの形式で保存すればよいですか?
    • 各エンティティのデータベースに Dictionary オブジェクトを格納することを考えていました。このようにして、データベースの列を変更することなく、その場でデータベースに新しい属性を簡単に追加することができました。それは合理的に聞こえますか?
  • すべての情報を同じデータベースに保存する必要がありますが、異なるデータベースの異なるテーブルまたは異なるエンティティ (敵と部屋) に格納する必要があります。

  • これがワームの缶詰になることはわかっていますが、優れたデータベースの提案は何ですか? MySQL は良い選択ですか?

4

5 に答える 5

3

1) 同じアプリケーションのデータを異なるデータベースに持つ理由はほとんどありません。あなたが Fortune500 規模の企業でない限り、そうではありません (OK、私は誇張しています)。

2) 情報を別のテーブルに保存します。

例として:

  • T1: 部屋

  • T2: 部屋の共通プロパティ (すべての部屋に適用可能)、**部屋*ごとに 1 行

  • T3: 部屋固有のプロパティ (少数の部屋に適用可能で、部屋ごとにプロパティごとに行があります。これにより、新しい列を追加せずにカスタム プロパティを簡単に追加できます

  • T4: ルーム間の接続

    T2 と T3 を持つことは重要です。これにより、適用可能な部屋ごとの行のアイデアの効率と速度を、行ごとのエンティティごとの属性 (またはオブジェクト/属性/値としてIIRC は派手な用語で呼ばれます) スキーマ

良い議論はここにあります

3)実装に関しては、再利用可能なものを作成するようにしてください。たとえば、DB にアクセスする汎用の「Get_room」メソッドを作成してください。これは理想的にはトランザクション SQL または ANSI SQL を介して行われるため、DB バックエンドの変更にかなり苦労せずに耐えることができます。

最初の作業には、SQLite を使用できます。安価で、簡単で、SQL と互換性があります (すべての中で最高の特性)。インストールはほとんど何もなく、DB 管理はフリーウェア ツールまたは FireFox プラグイン IIRC (すべての FireFox 3 データ ストア - 履歴、ブックマーク、場所など... - すべて SQLite データベースです) で実行できます。

後で、MySQL または Postgres のいずれかを使用します (私はどちらも専門的に行っていないため、推奨できません)。IIRC はある時点で、Sybase にも無料の個人用 db サーバーがありましたが、それがまだ当てはまるかどうかはわかりません。

于 2009-10-09T19:11:44.923 に答える
3
  • この手法はエンティティ属性値モデルと呼ばれます。通常は、オブジェクトの構造を反映する DB スキーマを用意し、オブジェクトの構造が変更されたときにスキーマを更新することをお勧めします。このような厳密なスキーマはクエリが簡単で、データがデータベース レベルで正しいことを確認するのも簡単です。
  • 複数のテーブルを持つ 1 つのデータベースがその方法です。
  • データベース サーバーが必要な場合は、PostgreSQL をお勧めします。MySQL には簡単なレプリケーションなどの利点がありますが、一般的に PostgreSQL の方が使いやすいです。アプリケーションで直接動作する小さなものが必要な場合は、SQLite が優れた組み込みデータベースです。
于 2009-10-09T19:14:49.490 に答える
2

データベース内の値としてオブジェクト全体 (シリアル化/エンコード) を保存することは、クエリには適していません。泥の中の一部のクエリでは、属性の 100% を知る必要がないか、値によってオブジェクトのリストを取得する可能性があると確信しています。属性。

于 2009-10-09T19:32:06.817 に答える
1

これはデータベースの仕事のようです

確かに、「データベース」は「リレーショナル データベース」を意味する必要はありません。ほとんどの既存の MUD はすべてのデータをメモリに保存し、プレーンテキスト データ形式で保存されたフラット ファイルから読み込みます。私は必ずしもこのルートを推奨しているわけではなく、従来のデータベースは決して必要ないことを指摘しているだけです。リレーショナル ルートに進みたい場合は、最近のバージョンの Python にsqliteが付属しています。これは、優れた SQL サポートを備えた軽量の組み込みリレーショナル データベースです。

コードでリレーショナル データベースを使用すると、厄介な場合があります。ゲーム ロジック クラスへの変更には、データベースへの並行変更と、データベースの読み取りと書き込みを行うコードへの変更が必要になる場合があります。このため、適切な計画は大いに役立ちますが、経験がなければ適切なデータベース スキーマを計画することは困難です。少なくとも、最初にエンティティ クラスを計画してから、それを中心にデータベース スキーマを構築します。データベースの正規化について読んで、そこでの原則を理解すると役立ちます。

この多くを簡素化できる「オブジェクトリレーショナルマッパー」を使用することをお勧めします。Python の例には、SQLObjectSQLAlchemy、およびAutumnが含まれます。これらは多くの複雑さを隠しますが、結果として重要な詳細の一部も隠すことができます. データベースに慣れるまでデータベースを直接使用することをお勧めします。将来的には ORM の使用を検討してください。

各エンティティのデータベースに Dictionary オブジェクトを格納することを考えていました。このようにして、データベースの列を変更することなく、その場でデータベースに新しい属性を簡単に追加することができました。それは合理的に聞こえますか?

残念ながらそうではありません。そうすると、データベースの機能の 99% が浪費され、美化されたデータ ストアとして効果的に使用されます。ただし、前述のデータベース機能が必要ない場合、ジョブに適切なツールを使用する場合、これは有効なルートです。標準のシェルブモジュールは、この目的のために検討する価値があります。

すべての情報を同じデータベースに保存する必要がありますが、異なるデータベースの異なるテーブルまたは異なるエンティティ (敵と部屋) に格納する必要があります。

1 つのデータベース。エンティティ タイプごとにデータベース内の 1 つのテーブル。これは、リレーショナル データベース (MySQL、SQL Server、SQLite など) を使用する場合の典型的なアプローチです。

これがワームの缶詰になることはわかっていますが、優れたデータベースの提案は何ですか? MySQL は良い選択ですか?

SQL に慣れるまでは、sqlite を使い続けることをお勧めします。それ以外の場合、MySQL は PostGreSQL と同様に、無料のゲーム データベースとして妥当な選択です。

于 2009-10-12T12:46:48.377 に答える
0

1 つのデータベース。各データベース テーブルは、実際のデータ オブジェクトを参照する必要があります。

たとえば、すべてのアイテム、すべてのクリーチャー、すべてのキャラクター クラス、すべての宝物などのテーブルを作成します。

これはデータベース構造に影響を与えるため、ここで少し時間をかけて、オブジェクトが互いにどのように関連するかを理解してください。たとえば、文字は複数の文字クラスを持つことができますか? モンスターはキャラクタークラスを持つことができますか?モンスターはアイテムを運ぶことができますか?部屋に複数のモンスターを入れることはできますか?

陳腐に思えますが、どのデータベース オブジェクトが他のどのデータベース オブジェクトに "属しているか" を把握することで、早い段階で多くの問題を回避できます。

于 2009-10-09T19:23:51.683 に答える