1

我是 (My)SQL 的新手,很难找到有关表设计最佳实践的好信息。

我想在棋盘上保存移动序列,比如我有一个数组$a = ['e4 e5', 'Nf3 Nc6', ...]

作为新手,我的第一个想法是一个有 2 列的愚蠢的小桌子,一个用于游戏 ID,一个用于移动。移动(数组)将被序列化并存储在一个字符串中。我想这在技术上是可行的,但是从数据库中读取和写入潜在的巨大序列化数组 - 可能在每次页面加载时 - 对我来说似乎不是最理想的。

由于各种原因,在用户端缓存数组可能是不可能的,这不是我很好奇的事情。

我有兴趣学习如何最好地存储无法以它的格式完全预测的数据(例如,移动的数量可以从 1 到 1000 不等)。

4

5 回答 5

3

与其将整个游戏历史存储在一行中,不如存储游戏 ID、移动和移动的序列号。

这样,您将通过执行类似的操作来检索给定游戏的整个历史记录

SELECT *
  FROM MovesTable
 WHERE gameID = id
 ORDER BY sequence
于 2013-01-14T02:50:39.617 回答
1

一般来说,我会使用以下形式之一的表格:

  • 游戏 ID、移动编号、移动
  • GameId、MoveNumber、FromSquare、ToSquare

您使用哪一个取决于您需要查询的内容以及数据的呈现方式,但我倾向于后一种建议。

然后,您可以将其与包含 GameId 和有关游戏本身的一些数据(例如日期或玩家)的父表结合起来。

如果您只想将移动作为一个完整的块来使用 - 也就是说您总是想要整个移动链并且永远不会查询单个移动 - 您可以按照您的建议存储字符串。这有一个额外的好处,即只有一行数据要返回,这将非常快。当然,缺点是您必须在收到数据后反序列化/解析数据。

于 2013-01-14T02:48:18.503 回答
0

我会做类似的事情

Game, MoveNumber, Move
----------------------
Game1, 1, e4 e5
Game1, 2, Nf3 Nc6
... 
Game2, 1, ....
于 2013-01-14T02:45:40.487 回答
0

您将需要多张桌子,一张用于玩家,一张用于游戏,一张用于棋子,一张用于移动。

游戏会有玩家和颜色以及日期和时间之类的东西

一块会告诉你它是如何移动的,是骑士还是女王等。

玩家将拥有玩家的姓名等。

一个移动将有棋子、游戏、玩家、开始位置和结束位置

您将通过基于每个表中的 id 字段的关系将这些表链接在一起。

于 2013-01-14T03:01:49.467 回答
0

试试两张桌子。

第一个表包含与每个游戏有关的信息。谁是玩家,他们在何时何地玩,谁赢了,以及与每场比赛相关的任何其他信息,并使每场比赛都独一无二。

游戏

Game_id PK

Move_id FK

黑名

白名

游戏_位置

比赛日期

游戏时间

优胜者

第二个表包含每场比赛的所有动作。这包含了每个动作的所有相关信息:被拿走的棋子,是否被其他玩家检查,这是常规动作还是他们城堡等。

移动

move_id PK

移动号码

Who_moved

Piece_moved

Square_from

Square_to

片断

移动类型

Check_YorN

现在 Games 表 (game) 中的每一行都连接到 Moves 表中的许多行 (moves)。

于 2013-01-16T17:08:27.493 回答