用于结构较少或不可预测的数据的SQL表结构

时间:2013-01-14 02:41:58

标签: mysql sql database-design

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

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

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

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

我有兴趣学习如何最好地存储无法以其格式完全预测的数据(例如,移动次数可以在1到1000之间变化)。

5 个答案:

答案 0 :(得分:3)

为什么不存储游戏ID,移动和移动的序列号,而不是将整个游戏历史存储在一行中。

通过这样做,您可以通过执行类似

的操作来检索给定游戏的整个历史记录
SELECT *
  FROM MovesTable
 WHERE gameID = id
 ORDER BY sequence

答案 1 :(得分:1)

一般情况下,我会使用以下表格之一的表格:

  • GameId,MoveNumber,Move
  • GameId,MoveNumber,FromSquare,ToSquare

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

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

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

答案 2 :(得分:0)

我会做类似

的事情
Game, MoveNumber, Move
----------------------
Game1, 1, e4 e5
Game1, 2, Nf3 Nc6
... 
Game2, 1, ....

答案 3 :(得分:0)

你需要一些桌子,一个用于玩家,一个用于游戏,一个用于棋子,一个用于移动。

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

一件作品会告诉你它是如何移动的,无论是骑士还是女王等等。

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

移动将拥有棋子,游戏,玩家,开始位置和结束位置

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

答案 4 :(得分:0)

尝试两张桌子。

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

<强>游戏

Game_id PK

Move_id FK

Black_name

White_name

Game_Location

GAME_DATE

GAME_TIME

得奖

第二张表格包含每场比赛的所有动作。这包含了每个动作的所有相关信息:是一个被拍摄的片段,是另一个被检查的玩家,这是一个常规动作还是他们城堡等等。

<强>移至

Move_id PK

Move_number

Who_moved

Piece_moved

Square_from

Square_to

Piece_taken

Move_type

Check_YorN

现在,Games表中的每一行(游戏)都会在Moves表中连接到许多行(移动)。