4

私は MySQL の使用にかなり慣れていないので、プレイヤーのインベントリ アイテムをデータベースに保存する最も効率的な方法を理解しようとしています。

セットアップは次のとおりです。

'player'というテーブルがあり、各プレイヤーには、テーブルのプライマリ インデックスとして設定される一意の 'playerid'が割り当てられます。

各プレーヤーはインベントリに最大 24 個のアイテムを持つことができ、それらのアイテムに関する情報は'player_inventory'というテーブルに保存されます。このテーブルには次のフィールドがあります。

playerid、slotid、uid、スタック、用途、耐久性

'uid'はアイテムの ID であり、'stack''uses'および'durability'は各アイテムに必要な値です (たとえば、別のスロットにある同じタイプのアイテムは'durability'が低くなる可能性があります)。

問題は、プレイヤーごとに最大 24 のスロット エントリがあり、他のフィールドが一意であることが保証されていないため、インベントリ テーブルの「playerid」にインデックスを設定できないことです。

したがって、このテーブルに 10000 人のプレイヤーのインベントリがある場合、このテーブルにクエリを実行すると、インデックスのない 240,000 エントリが潜在的に存在する可能性があるのではないかと心配しています。

データベースを最適化する方法についての知識はかなり限られていますが、アドバイスは大歓迎です。

4

3 に答える 3

3

主キーの一意のインデックスを含むインデックスは、複数の列に対して定義できます。

ALTER TABLE player_inventory ADD PRIMARY KEY (playerid, slotid);

つまり、これら 2 つの列の値の組み合わせは一意でなければなりません。ただし、特定の playerid が複数の行で発生する場合があり、特定の slotid が複数の行で発生する場合があります。

于 2011-09-12T05:04:40.487 に答える
1

テーブルが3つあると便利かもしれません。

  1. tblPlayer(idPlayer INT PK NOT NULL AUTO_INCREMENT、ユーザー名、パスワードなど...)
  2. tblItemInventory(idItemInventory INT PK NOT NULL AUTO_INCREMENT、idPlayer FK、idItem FK、..)
  3. tblItem (idItem INT PK NOT NULL AUTO_INCREMENT、耐久性、用途、)

tblItem は最大 24 個 (idItem=24)

于 2012-07-05T09:23:12.740 に答える
0

インベントリのようなテーブルにインデックスを設定することについては、2 つの考え方があります。1 つは、基本的にアプリケーション データとは関係のないテーブルの自動インクリメント インデックスである代理キーを考え出すことです。インデックスとして機能するだけです。

インデックスを強制するもう 1 つの方法は、playerid と uid の組み合わせを使用することです。ただし、プレイヤーが同じアイテムの複数のスタックを持つことができる場合 (Diabo や MMO のように)、おそらく playerid と slotid の組み合わせをインデックスとして使用できます。MySQL では、複数のキーで構成される複合キーを使用できます。

于 2011-09-12T05:03:47.853 に答える