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

Postgresql - index on individual array elements or index on keys in an hstore

我有 table 个用户,有一个列 uuid 和一个列标签:

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

我不确定列 tags 应该是什么类型,hstore 还是 varchar[]。我希望它包含一个兴趣或类别列表,例如 'burgers' 或 'vegetables',这样我就可以查询在指定数组(即 "Which users like any of 'burgers' 'vegetables' 'hotdogs'?")中具有任何标签的所有用户这个查询要快,我想我应该 索引各个类别 但是它们是存储的。我希望大多数用户拥有少量标签 (0-5),但他们最多可能拥有 100 个左右。并且有很多不同的标签选项(可能是 1000+)。

我相信我可以在 hstore 中的 键上建立索引,这样我就知道 hstore 类型是一个选项。是否可以索引 数组 的单个 varchar 元素? (我看过关于这个的帖子,但没有定论。)


Postgres 版本 9.3.5

我会为标签推荐单独的 tables

您已经有 Table 个使用 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 与 BurgerS)。

一个更简单的解决方案是留下标签 table 并只创建:

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

是为标签创建单独的 table 还是只使用 users_tags -table 主要取决于标签的使用方式。如果您有一组(大部分)已定义的标签,并且您可能希望稍后将信息添加到特定标签名称,则需要单独的 table。查询 "which users like 'hotdogs'" 会建议一个单独的标签,其中标签 'hotdog' 具有特定 ID。如果用户可以随意添加各种mumbojumbo 标签并且以后不会附加任何信息,那么请将单独的table 去掉。