【问题标题】:Alternative solutions to an array search in PostgreSQLPostgreSQL 中数组搜索的替代解决方案
【发布时间】:2021-05-18 19:30:32
【问题描述】:

我不确定我的数据库设计是否适合这种棘手的情况,并且我还寻求帮助,对此查询的外观如何。

我计划使用下表进行查询:

       search_array      | value | id 
  -----------------------+-------+----
   {XYa,YZb,WQb}         | b     |  1
   {XYa,YZb,WQb,RSc,QZa} | a     |  2
   {XYc,YZa}             | c     |  3
   {XYb}                 | a     |  4
   {RSa}                 | c     |  5

search_array 中有 5 个主要元素:XY、YZ、WQ、RS、QZ 和 3 个值:a、b、c,它们与每个元素关联。 每行也有一个值:a、b 或 c。

我的目标是在这个意义上找到适合特定行的所有行:首先应该检查它们的 search_arrays 中是否有任何相同的主要元素(示例中标记为黄色) .

例如: 第 4 行和第 5 行不匹配,因为 XY != RS。
第 1、2 和 3 行将匹配两次,因为它们都有 XY 和 YZ。 行 id 1 和 2 甚至会匹配 3 次,因为它们也有共同的 WQ。

second:如果有一个主元素匹配,如果主元素后面的小写字母适合另一行的值,则应该“交叉检查”。

例如:表中第 1 行的唯一匹配项是第 4 行,因为它们都搜索 XY 和元素匹配两行的每个值之后的低字母。 另一个匹配是 ROW id 2 和 5 与 RS 并搜索 c 到值 c 并搜索 a 到值 a(绿色和橙色标记)。

我的想法是使用字符串的 RIGHT 和 LEFT 命令将查询中的 search_array 元素分成两部分。但我不知道如何组合这个搜索的子查询。

或者会是更快的完整其他解决方案吗?就像将搜索数组拆分为另一个表,其中包含主表的“foregin key”列、“main element”和“searched_value”。我不确定这是否是最佳解决方案,因为程序会一直切换到主表以从 300 万行中查找两行以将它们的 searched_values 与值进行比较?

非常感谢您的回答和时间!

【问题讨论】:

  • 请将格式化文本显示为文本,而不是图像。我们无法将您的示例复制并粘贴到实际可运行的内容中。

标签: arrays postgresql performance database-design


【解决方案1】:

您必须以标准化方式表示数据。我将在WITH 子句中执行此操作,但最好以这种方式开始存储数据。

WITH unravel AS (
   SELECT t.id, t.value,
          substr(u.val, 1, 2) AS arr_main,
          substr(u.val, 3, 1) AS arr_val
   FROM mytable AS t
      CROSS JOIN LATERAL unnest(t.search_array) AS u(val)
)
SELECT a.id AS first_id,
       a.value AS first_value,
       b.id AS second_id,
       b.value AS second_value,
       a.arr_main AS main_element
FROM unravel AS a
   JOIN unravel AS b
      ON a.arr_main = b.arr_main
         AND a.arr_val = b.value
         AND b.arr_val = a.value;

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 2021-02-04
    • 2018-11-16
    • 1970-01-01
    • 2011-04-13
    • 2016-10-24
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多