postgresql 为复杂的SQL问题寻求帮助:二维阵列重复数据消除和部分搜索

z5btuh9x  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(95)

在我目前的项目中遇到了一个挑战。这个项目处理2D数组,在结构上类似于井字游戏(我将使用它作为一个简化的例子)。我正在努力解决的主要问题是如何将2d数组保存到PostgreSQL数据库中,同时消除重复,以及如何实现部分谜题搜索。为了简化我的解释,我将使用一个简化的井字游戏来概述我的两个主要挑战:

**1.二维阵列重复数据消除:**类似于井字游戏板的旋转或翻转。你可以得到8个不同但等价的2d数组状态(4个旋转和2个镜像),我认为这些是重复的。处理这个问题最有效的方法是什么?

现在,我的主要想法是创建一个标准的“规范”形式,在将其存储到PostgreSQL数据库之前,将板状态的所有变体转换为该形式。但我仍在试图找到一个有效的方法来选择标准型。我考虑过几个选择

  • 生成2d数组的所有8种变体,将其转换为字符串或散列,并基于字典值选择规范形式。
  • 评估电路板状态中第一次和最后一次出现的“X”和“O”,并使用此数据以某种方式识别电路板的当前方向。然后旋转/镜像它以获得规范形式。
    **2.部分二维数组搜索:**在这种情况下,我希望开发一种方法,让用户在我们的数据库中搜索与他们创建的特定排列紧密对应的数组,类似于井字游戏板设置。用户的输入成为搜索标准。

用户将在网站上的虚拟棋盘上设置棋子,类似于井字游戏中的“X”和“O”。目标是随后搜索数据库并查找具有类似配置的阵列,然后将这些阵列作为搜索结果返回。
这里要解决的关键问题是如何在不对整个数据库进行线性扫描的情况下执行此搜索,这既耗时又计算密集。
我目前唯一的想法是创建一个单独的表,其中每行都是数组的非空元素(带有数组表的外键)。其中每个非空元素。它的x和y值被索引。然后,该索引将与关联于该数组的唯一ID建立链接。有了这些想法,我们有两个表:1)ArrayTable,它存储关于数组的信息,让我们说2)ArrayElementTable,其中我们单独存储实际的数组元素。
当开始搜索时,将用户放置在基于web的板上的块与存储在该数据库表中的索引元素进行比较。
结果是ArrayTable中每个搜索到的ArrayElement的匹配行列表。然后基于这些列表,我们可以计算出与初始用户输入的相似度百分比。因此,它是关于产生如下输出:“与阵列A匹配30%,与阵列B匹配50%,与阵列C匹配100%”,以此类推。
但是,我有一种感觉,可能有一种更有效的方法来实现这一点。即使实现我解释的想法也是相当复杂的。所以我想在设计上得到一些帮助。
我会很感激任何先进的见解或对这些问题的替代观点!

wvmv3b1j

wvmv3b1j1#

也许PostgreSQL的trigram风格的文本索引会有所帮助。
你能把你的数组表示成文本字符串吗?比如说,

XOX
OXO
OXO

字符串
将存储在一个VARCHAR或TEXT列中,我们称之为grid,如下所示。

XOX OXO OXO


然后,当您的用户呈现输入时,您将在软件中将该输入转换为所有八个对称群版本,然后对其进行重复数据消除,然后对每个已消除重复数据的对称群版本使用SQL LIKE运算符进行查询。

WHERE grid LIKE '%OXO%' -- OXO is a chunk of transformed input.


三元组索引支持通配符%查询,并使其性能可行。
只是个想法。

相关问题