使用数组搜索 Postgres 数组
Posted
技术标签:
【中文标题】使用数组搜索 Postgres 数组【英文标题】:Search through a Postgres array with an array 【发布时间】:2016-08-14 20:39:02 【问题描述】:我想将主题标签添加到功能中,并且我想简单地将它们存储为每个对象的数组,然后我会让用户使用他们自己的标签(标签数组)搜索项目并然后执行搜索。有什么好办法吗?
例如: 数据库中的标签:
row 1: ['red', 'blue', green']
row 2: ['orange', 'blue']
row 3: ['blue', 'green']
然后用户搜索会是这样的:
['red', 'green']
结果将是第 1 行和第 3 行。
这是一种非常缓慢且低效的存储方式吗?如果我以这种方式为用户提供多个搜索选项,我将如何获得最佳性能?
【问题讨论】:
那是我的错!哈哈,我会解决的! 为了性能优化,你需要提供更多信息,从你的Postgres版本开始,表定义,基数,最小值,最大值,平均值:数组长度,属性长度,搜索中的属性数量,数量的查询。读/写模式?这一切都取决于...按照tag info for [postgresql-performance] 中的说明进行操作 【参考方案1】:这里有两种方法:
-
按照您的建议使用 Postgres 数组。 这使您的行易于阅读并且相当简单。如果需要,它还允许您对标签进行排序,而无需单独存储索引。如果你走这条路,你应该使用&& operator 来确定搜索标签是否与其他标签重叠(例如,而不是在循环中运行查询)。
使用单独的表来存储对象标签关联。在这样的表中,一列是
tag
(或 tag_id,如果您想稍后修改标签元数据),另一列是与标签关联的 object_id
。您可以将多个标签与同一个对象关联,也可以将多个对象与同一个标签关联。然后,您可以在此表上使用标准 join
和 in filter 来获取与您请求的标签匹配的所有对象 ID。这是不支持数组的数据库管理系统通常使用的方法。
【讨论】:
很抱歉我花了这么长时间才接受这个!但是我刚刚把程序的这一部分写出来了,第一部分效果很好!非常感谢!以上是关于使用数组搜索 Postgres 数组的主要内容,如果未能解决你的问题,请参考以下文章