0

ゲームマップに関する情報をMySQLデータベースに保存しようとしています。これを行うために、整数の配列を含む各マップのVARCHARフィールドを作成します。この整数の配列には、データベースに格納されているさまざまなグラフィック要素のIDに対応する1000個の数値が含まれる可能性があります。

たとえば、このような2D配列(3x3セルマップ)が含まれている場合があります。

1,1,4
2,5,6
1,1,1

その場合、このようなテーブルが私のデータベースにあります

tiles
id   |   file      |  desc          | other data //...
 1      grass.png     a grass tile
 2      water.png     a water tile

ユーザーがデータベースにマップを照会するとき、2D配列と要素に関する情報を送信する必要があります。たとえば、配列に数値2が含まれている場合、ID 2のセルはウォータータイル、ファイル名water.pngなどとして描画する必要があるという情報を返す必要があります。

これを効率的に実装するにはどうすればよいですか?phpで配列全体を調べて、一意のID値を取得し、後でデータベースに情報を再度クエリする必要はありません(私には非効率的です)。

4,1,2,5,62D配列が変更されるたびに更新される形式で、一意のIDを含む別のフィールドを作成することを考えていました。これが良い考えである場合、どうすればそれを使用してクエリを実行できますか?以下のようなものは私にはうまくいかないようです

SELECT * FROM tiles WHERE id IN ( SELECT unique_ids FROM mapInfo WHERE id = ..)
4

1 に答える 1

0

基本的に、列データでコンマ区切りリストを使用することは非常に柔軟性がありません。カンマ区切りのリストを作成する必要があると思うときはいつでも、新しいテーブルを作成し、そのリストの各項目を別々の行に配置してから、その新しいテーブルを元のテーブルに関連付ける必要があります。

次の列を持つ「cell」というテーブルを作成することをお勧めします。

CREATE TABLE cell (
  row INT NOT NULL, 
  col INT NOT NULL, 
  tile_id INT NOT NULL,
  PRIMARY KEY (row, col)
);

次に、次のようなタイル情報を使用して2D配列をクエリします。

SELECT c.row, c.col, t.*
FROM cell c
INNER JOIN tile t
  ON c.tile_id = t.id
ORDER BY c.row, c.col;

複数の「レベル」または「マップ」が必要な場合は、セルテーブルにmap_id列を追加して、それらを個別に保持できるようにします。また、その列を主キーの先頭に追加する必要があり、次のようにクエリを実行します。

SELECT c.row, c.col, t.*
FROM cell c
INNER JOIN tile t
  ON c.tile_id = t.id
WHERE c.map_id = 2  -- or whatever map you are looking for
ORDER BY c.row, c.col;

各マップの名前、場合によっては寸法(100x100、200x300など)などを保存できるように、マップテーブルを保持することもできます。

いくつかの考え。

于 2013-01-15T03:00:22.927 に答える