是否有可扩展的方法来实现多个标签的数据库搜索?

时间:2016-12-17 06:02:40

标签: database database-design tags scalability in-memory-database

我有一个Postgres数据库和一个用户标签表,列有UserId和TagId。每个用户可以有多个标签,反之亦然。

有没有办法以可扩展的方式实现多个标签的搜索?示例查询:

  • 获取同时拥有tag1和tag2
  • 的所有用户
  • 获取拥有(tag1或tag2)和tag3
  • 的所有用户
  • 获取所有拥有tag1和tag2并且没有tag3
  • 的用户

由于这不容易索引和扩展,我考虑使用某种内存缓存,以便更快地进行查找。你知道这个问题的任何现成解决方案吗?

由于

1 个答案:

答案 0 :(得分:1)

首先,在不了解太多细节的情况下,我假设有许多标签但不是很多,这使得TagIds列的基数很低。我的回答是基于这个假设。

通常,低基数列上的索引无助于扩展此列上的查询。有关详细信息,请参阅Why low cardinality indexes negatively impact performance

其次,您给出的一组示例查询清楚地给出了一个印象,即其他查询(此集合)可以是分离形式(换句话说,WHERE条件包含OR布尔谓词),这暗示没有索引会挽救如果分离的数量很大,则表现如何。 DBMS将考虑(a)扫描整个表并使用WHERE条件测试每一行,以及(b)扫描列TagIds上的索引。

最后但同样重要的是,根据数据现在驻留在内存中的事实,进入内存将帮助您。但是,原则上,内存中的DBMS也考虑(a)和(b),并可能选择(a)而不是(b)。

我建议使用PostgreSQL中记录的function index。如果您不处理临时查询,请将其考虑在内: