2016-08-14 89 views
0

我想为某个功能添加井号标签,我想简单地将它们存储为每个对象的数组,然后让用户搜索它们自己的项目标签(一组标签),然后执行搜索。有没有一个好的方法来做到这一点?在数组中搜索Postgres数组

例如: 在数据库中的标签:

row 1: ['red', 'blue', green'] 
row 2: ['orange', 'blue'] 
row 3: ['blue', 'green'] 

,然后将用户的搜索将是这样的:

['red', 'green'] 

,其结果将是行1和3

这是一个非常缓慢和低效的方式来存储这些?如果我给用户多种选择以这种方式进行搜索,我将如何获得最佳性能?

+0

这是我的不好!哈哈,我会解决这个问题! – fjaxyu

+0

为了性能优化,您需要提供更多信息,从Postgres版本,表格定义,基数,最小值,最大值,平均值开始:数组长度,属性长度,搜索中的属性数量,查询数量。读/写模式?这一切都取决于...遵循[标签信息中的\ [postgresql-performance \]](http://stackoverflow.com/tags/postgresql-performance/info) –

回答

1

这里有两种方法:

  1. 使用的Postgres如你所说的阵列。这使您的行易于阅读,并且相当简单。它还允许您根据需要对您的代码进行排序,而无需单独存储索引。如果走这条路线,应该使用&& operator来确定搜索标记是否与其他标记重叠(例如,与在循环中运行查询相反)。
  2. 使用单独的表格来存储对象标签关联。在这样的表格中,一列是tag(或者如果您想稍后修改标签元数据,则为tag_id),另一列为与标签相关的object_id。您可以拥有多个与同一个对象关联的标签以及与同一个标签关联的多个对象。然后,您可以使用此表上的标准joinin filter来获取与您请求的标签匹配的所有对象ID。这是不支持数组的数据库管理系统通常使用的方法。
+0

所以对不起,我花了这么长的时间接受这个!但是我刚刚完成了这部分程序,最终写出来了,这部分工作非常有效!非常感谢! – fjaxyu