Postgresql - 单个数组元素的索引或hstore中键的索引

时间:2015-02-19 17:06:28

标签: arrays postgresql indexing hstore

我有一个用户表,其中包含列uuid和列标记:

| uuid varchar PRIMARY KEY | tags ????? |

我不确定列tags应该是什么类型,hstore或varchar []。我希望它包含一个兴趣或类别列表,比如'汉堡'或'蔬菜',这样我就可以查询在指定数组中有任何标签的所有用户(即“哪些用户喜欢'汉堡''蔬菜''hotdogs'?“)为了使这个查询更快,我想我应该索引各个类别然而它们被存储。我希望大多数用户拥有少量标签(0-5),但最多可能有100个左右。标签有很多不同的选项(可能是1000 +)。

我相信我可以在hstore 中的键上编制索引,这样我就知道hstore类型是一个选项。是否可以索引数组的各个varchar元素? (我看过关于这个的帖子,但它们没有结果。)


Postgres版本9.3.5

1 个答案:

答案 0 :(得分:2)

我建议为标签单独使用表

你已经拥有了uuid的表用户,让我们说:

CREATE TABLE users (
    uuid serial primary key,
    user_name text
);

现在标签:

CREATE TABLE tags (
    tag_id serial primary key,
    tag_name text
);

CREATE TABLE users_tags (
    uuid integer references users,
    tag_id integer references tags,
    primary key (uuid, tag_id)
);

现在您可以轻松查询,例如:

SELECT * FROM users
    JOIN users_tags USING (uuid)
    JOIN tags USING (tag_id)
    WHERE tag_name = 'Burgers';

现在您可以轻松地在tag_name上添加索引。您还可以轻松强制标记名称的唯一性或在lower(tag_name)上创建唯一索引,以消除标记名称中的大写字母问题(Burgers vs. BurgerS)。

更简单的解决方案是将标签表保留在外,只需创建:

CREATE TABLE users_tags (
    uuid integer references users,
    tag_name text,
    primary key (uuid, tag_name)
);

是否为标记创建单独的表或仅使用users_tags -table主要取决于标记的使用方式。如果您有一个(大部分)已定义的标记集,并且您可能希望稍后将信息添加到特定标记名称,则需要使用单独的表。查询"哪些用户喜欢'热狗'"会建议一个单独的标签,其中标签' hotdog'有一个特定的ID。如果用户可以自由添加各种mumbojumbo标签,之后不再附加任何信息,请将单独的表格保留下来。