我有一个用户表,其中包含列uuid和列标记:
| uuid varchar PRIMARY KEY | tags ????? |
我不确定列tags
应该是什么类型,hstore或varchar []。我希望它包含一个兴趣或类别列表,比如'汉堡'或'蔬菜',这样我就可以查询在指定数组中有任何标签的所有用户(即“哪些用户喜欢'汉堡''蔬菜''hotdogs'?“)为了使这个查询更快,我想我应该索引各个类别然而它们被存储。我希望大多数用户拥有少量标签(0-5),但最多可能有100个左右。标签有很多不同的选项(可能是1000 +)。
我相信我可以在hstore 中的键上编制索引,这样我就知道hstore类型是一个选项。是否可以索引数组的各个varchar元素? (我看过关于这个的帖子,但它们没有结果。)
Postgres版本9.3.5
答案 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标签,之后不再附加任何信息,请将单独的表格保留下来。