我正在探索建立一个涉及国际象棋位置分析的网站的想法。国际象棋位置本身使用称为 FEN 的格式进行描述,例如,棋盘的起始位置可以描述为:
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1
Run Code Online (Sandbox Code Playgroud)
我对如何建模的想法特别感兴趣的部分是直到第一个空间的所有内容。这描述了棋盘从第一级到第八级的每一级的布局。棋子使用字母和大写/小写的组合来描述,以表示棋子类型以及它是否属于黑人玩家(小写)或白人玩家(大写)。整数8表示空格的数量。像 1.e4 这样的移动之后
rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1
Run Code Online (Sandbox Code Playgroud)
现在您可以看到第 5 阶部分如何描述 4 个空格,一个白色棋子,然后是 3 个空格。
那么我们如何在像 Postgres 这样的关系数据库中对此进行建模呢?我幼稚的方法是首先将整个 FEN 字符串存储为 a varchar
,但是,将来,我想将其迁移到一个结构,使我能够轻松搜索国际象棋位置中的结构。一个例子是,找到数据库中白棋占据 e4 和 e5 位置的所有位置(第 5 个位置的等级段:)3PP3
。
FEN 字符串的正则表达式搜索可以找到我感兴趣的位置,但是简单地索引 FEN 列就足够了吗?我是否应该考虑将董事会的每个等级存储为单独的列?或者整个棋盘可以以某种方式表示为矩阵。