2010-05-26 200 views
1

我是Postgresql的新手,并且正在尝试使用它。PostgreSQL多维数组搜索

我创建了一个简单的表:

CREATE table items_tags ( 
ut_id SERIAL Primary KEY,  
item_id integer, 
item_tags_weights text[] 
);         

其中: ITEM_ID - 商品编号,这些标签是相关联 item_tags_weights - 与新版的ITM相关标签包括体重

Example entry: 
-------------------- 
    ut_id | item_id |                     item_tags_weights 
---------+---------+------------------------------------------------------------------------------------------------------------------------------- 
     3 |  2 | {{D,1},{B,9},{W,3},{R,18},{F,9},{L,15},{G,12},{T,17},{0,3},{I,7},{E,14},{S,2},{O,5},{M,4},{V,3},{H,2},{X,14},{Q,9},{U,6},{P,16},{N,11},{J,1},{A,12},{Y,15},{C,15},{K,4},{Z,17}} 
1000003 |  3 | {{Q,4},{T,19},{P,15},{M,14},{O,20},{S,3},{0,6},{Z,6},{F,4},{U,13},{E,18},{B,14},{V,14},{X,10},{K,18},{N,17},{R,14},{J,12},{L,15},{Y,3},{D,20},{I,18},{H,20},{W,15},{G,7},{A,11},{C,14}} 
     4 |  4 | {{Q,2},{W,7},{A,6},{T,19},{P,8},{E,10},{Y,19},{N,11},{Z,13},{U,19},{J,3},{O,1},{C,2},{L,7},{V,2},{H,12},{G,19},{K,15},{D,7},{B,4},{M,9},{X,6},{R,14},{0,9},{I,10},{F,12},{S,11}} 
     5 |  5 | {{M,9},{B,3},{I,6},{L,12},{J,2},{Y,7},{K,17},{W,6},{R,7},{V,1},{0,12},{N,13},{Q,2},{G,14},{C,2},{S,6},{O,19},{P,19},{F,4},{U,11},{Z,17},{T,3},{E,10},{D,2},{X,18},{H,2},{A,2}} 
(4 rows) 

其中: { D,1} - D =标签,1 =标签重量

嗯,我只是想列出items_id其中标签='U'根据标签的重量。

在途中是选择全部来自数据库的标签,并进行高级语言的处理和排序并使用结果集。

对于这一点,我可以执行以下操作:

1)SELECT * FROM user_tags WHERE 'X' = ANY (interest_tags_weights)

2)萃取,排序信息和显示。

但考虑到多个项目,可以用一个“标签”相关联,并假设 千万条目,这种方法将是必然缓慢。

任何想法按需要与CREATE函数左右列出?

任何指针都会有帮助。

非常感谢。

回答

1

您是否考虑过规范化,即将数组字段移动到另一个表中?除了易于查询和扩展之外,在大型数据库上可能会有更好的性能。

+0

这里更好地被标准化。如果你真的需要存储非规范化的信息,hstore(检查postgres的contrib库)会好很多。 – rfusca 2010-05-26 13:17:39

+0

_to存储信息非规范化,hstore会好得多_ 条件是该项目不具有相同的标签具有不同的权重,因为hstore不支持重复的键。 – 2012-08-23 10:22:27

+0

有没有其他记录分享这个数据?否则,非规范化会更好 - 你不会获得性能并节省空间。事实上,外观将会更加昂贵。 – dman 2017-04-19 20:42:23