0

我正在尝试将有关游戏地图的信息存储在 MySQL 数据库中。为此,我将为每个包含整数数组的地图创建一个 VARCHAR 字段。这个整数数组可能包含 1000 个数字,对应于存储在数据库中的不同图形元素的 id。

例如,它可能包含一个像这样的二维数组(一个 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

当用户在数据库中查询地图时,我需要发送二维数组以及有关元素的信息。例如,如果数组包含数字 2,我需要返回信息,说明任何 id 为 2 的单元格都应绘制为水砖、文件名 water.png 等。

如何最好地有效地实施这一点?我真的不想在 php 中遍历整个数组,获取唯一的 id 值并在之后再次查询数据库以获取信息(对我来说似乎效率低下)。

我正在考虑拥有另一个包含唯一 id 的字段,其格式4,1,2,5,6会在 2d 数组更改时更新。如果这是一个好主意,我该如何使用它进行查询?下面这样的东西似乎对我不起作用

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

1 回答 1

0

基本上,在列数据中使用逗号分隔的列表是非常不灵活的。每当您认为应该创建一个逗号分隔列表时,您可能应该创建一个新表并将该列表中的每个项目放在单独的行中,然后将该新表关联回原始表。

我建议您创建一个名为“单元格”的表格,其中包含以下列:

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

然后,您将使用如下图块信息查询二维数组:

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 回答