【问题标题】:Which indexes should I use for inline strings?我应该为内联字符串使用哪些索引?
【发布时间】:2020-01-17 07:39:35
【问题描述】:

我存储了一些字符串,例如:Barcelona、Real Madrid、Athletico。我的程序需要搜索这个的完全匹配,

例如:

Barcelona    -> true
Real Madrid  -> true
Real M       -> false
Athletic     -> false

我认为将其内联存储在 text/varchar 字段中,例如(只是粗鲁的例子):

|Barcelona|Real Madrid|Athletico|,然后只做LIKE %|Real Madrid|%

我不想使用 trigram 之类的繁重东西,只使用内联字符串,但我应该使用哪个索引系统?

谢谢

【问题讨论】:

  • 你能说得更具体点吗?您想一次搜索其中一个字符串的出现还是一次搜索多个?如果是后者:AND 或 OR?
  • 每次选择只有一个:SELECT * FROM db WHERE column LIKE '%|Real Madrid|%' LIMIT 1
  • 不要将多个分隔值存储在单个列中。阅读数据库规范化。如果你真的认为你必须对数据模型进行反规范化并违反第一范式,那么至少使用一个数组。
  • 谢谢建议 :)

标签: database postgresql indexing


【解决方案1】:

在您的情况下,您可以使用Arrays type 来存储您的数据并在WHERE 语句中使用ANY 关键字:

CREATE TABLE games (
    teams   text[]
);

INSERT INTO games (teams) 
VALUES ({'Real Madrid','Maccabi Haifa', 'Manchester United'})

SELECT * FROM table WHERE 'Real Madrid'= ANY (teams);

为了提高性能GIN Index 可以与数组字段一起使用:

    CREATE INDEX ON games USING gin(teams);

【讨论】:

  • 感谢您的回答。我从一开始就考虑到了。但它如何与教义一起工作?学说有它自己的数组...
  • 规范化比数组更好吗?如何选择?
  • @MegaBomber,不幸的是我对教义很熟悉,无法帮助你。在通常情况下,标准化会更好,但在您的私人情况下可能会产生开销。选择应基于全球项目愿景,因此如果对您的项目没有深入了解,我无法为您提供建议。
  • 不,我只是想知道在哪些情况下我需要规范化以及何时数组更好。
  • 如果不知道您希望对该数据的每次使用的确切细节,那么规范化就是要走的路。免责声明:我倾向于认为数组是糟糕的设计几乎是每一种情况。太严格了,除非我一直想要所有元素。
猜你喜欢
  • 2012-07-10
  • 2013-07-28
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 2010-09-23
  • 2017-08-11
  • 1970-01-01
相关资源
最近更新 更多