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 去掉。
我有 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 去掉。