我是(My)SQL的新手,很难找到关于表格设计最佳实践的好信息。
我想在国际象棋棋盘上保存动作序列,比如我有一个数组$a = ['e4 e5', 'Nf3 Nc6', ...]
新的,我的第一个想法是一个带有2列的愚蠢的小桌子,一个用于游戏ID,另一个用于移动。移动(数组)将被序列化并存储在字符串中。我想这在技术上是可行的,但是从数据库读取和写入潜在的大型序列化数组 - 可能在每个页面加载 - 对我来说似乎不是最理想的。
由于各种原因,可能无法在用户端缓存数组,这不是我很好奇的事情。
我有兴趣学习如何最好地存储无法以其格式完全预测的数据(例如,移动次数可以在1到1000之间变化)。
答案 0 :(得分:3)
为什么不存储游戏ID,移动和移动的序列号,而不是将整个游戏历史存储在一行中。
通过这样做,您可以通过执行类似
的操作来检索给定游戏的整个历史记录SELECT *
FROM MovesTable
WHERE gameID = id
ORDER BY sequence
答案 1 :(得分:1)
一般情况下,我会使用以下表格之一的表格:
您使用哪一个取决于您需要查询的内容以及数据的呈现方式,但我会倾向于后一个建议。
然后,您可以将其与包含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表中连接到许多行(移动)。