2

キャラクターがアイテムを持ち運んだり使用したり、スキルを訓練したりするロールプレイングゲームを計画しています。キャラクターが持っている(おそらく多数の)アイテム/スキルを保存することになると、インスタンス化された各キャラクターにすべての可能なアイテムとスキルを並べるよりも良い方法は考えられません。しかし、これは私にはやり過ぎのようです。

明確にするために、これがアイテム/スキルの総数が最大30である演習または小さなゲームである場合、アイテムとスキルハッシュをキャラクタークラスに追加し、それらを追加および削除するメソッドは次のようになります。

def initialize
  @inventory = {}
  @skills = {}
end

def add_item item, number
  @inventory[item] += number
end

アイテムの数とスキルのレベルを保存したいのですが、インベントリで最大1000アイテムと最大150、場合によっては100スキルを処理するために他に何を試みることができますか?

4

2 に答える 2

3

データ取得の計画

一般に、データベースの保存方法ではなく、データの検索方法と取得方法に基づいてデータベースを設計することをお勧めします。設計が悪いと、データベースからデータを収集するのに非常に費用がかかります。

あなたの例では、インベントリアイテムまたはスキルごとに個別のモデルを用意すると、キャラクターをロードするときはいつでもルックアップの点で非常にコストがかかります。誰かのインベントリをロードするたびに1,000回のルックアップを本当に実行したいですか?おそらくそうではありません。

速度を非正規化する

通常、一貫性が必要なデータを正規化し、迅速に取得/更新する必要があるデータを非正規化する必要があります。1つのオプションは、文字属性をシリアル化することです

たとえば、シリアル化されたCharacter#inventory_itemsフィールドを保存する方が、has_many :thoughorのhas_and_belongs_to_many関係で100個の個別のレコードを更新するよりも高速である必要があります。一般的な非正規化、特にシリアル化には確かにトレードオフがありますが、特定のユースケースに適している場合があります。

ドキュメントデータベースを考えてみましょう

キャラクターシートはドキュメントです。SQLデータベースのリレーショナル機能が必要でない限り、ドキュメント指向のデータベースの方が、管理するデータに適している場合があります。CouchDBはこの例に特に適しているように見えますが、必要な機能を提供するものがあるかどうかを確認するために、すべてのNoSQLオプションを確実に評価する必要があります。あなたのマイレージは間違いなく異なります。

常にベンチマーク

何が最適かについて私の言葉を信じないでください。デザインを試してください。それをベンチマークします。デザインがデータをどのように処理するかを確認します。結局、重要なのはそれだけです。

于 2012-07-18T21:45:00.120 に答える
1

インスタンス化された各キャラクターに可能なすべてのアイテムとスキルを並べるよりも良い方法は考えられません。

キャラクターは独立して進化しますか?

  • はいと仮定すると、他に選択肢はありませんが、データベースに物理的に表されているすべての関連する組み合わせを両端に配置する必要があります。
  • そうでない場合は、同じセットまたはアイテム/スキルを複数のキャラクターに「再利用」できますが、これはおそらくここで行われていることではありません。

いずれにせよ、リレーショナルデータベースは大量のデータを管理するのに非常に優れており、あなたが言及した数は「巨大」とは言えません。クラスタリングなどの手法を正しく利用することで、特定のキャラクターのすべてのアイテム/スキルのルックアップが最小限のI / O操作で、つまり非常に高速に実行されるようにすることができます。

于 2012-07-18T22:30:33.860 に答える