实现多表标签系统
Implementing tag system with multiple tables
我正在尝试实现类似于 Whosebug 拥有的标签系统。显然我已经阅读了多篇文章,包括这篇 answer.
但是我的情况有点不同
- 标签数量有限,只能由具有更高权限的用户创建(任何人都可以在那里分配标签)。这不包括选项 #1(从我上面链接的 SO 问题中,每个标签都直接插入 tables
tags
列,然后用 LIKE
查询)我猜
- 数据库中还有多个table可以标记(目前是五个)
特别是第二个标准使它变得更难所以这些是我的想法
- 我可以按照选项 #3,有 table
tags
并且与每个 table 有 M:N 关系。然而,这会使搜索变得更加困难(想象一下,如果 table 数字增长,则加入)而且我还需要告诉哪个 table (应用程序模块)与搜索结果中的标签相匹配
- 我可以使用某种多态性,但我对这个关于数据库的概念还很陌生,所以这能很好地解决这个问题吗?
我使用最新版本的 PostgreSQL。
由于您使用的是 PostgreSQL,因此您可以选择其他数据库无法使用的某些字段类型。特别是数组和 JSON 字段。我对 a blog post 中的各种方法做了一些性能比较。对于需要组合多个标签的任何搜索,数组和 JSONB 绝对是比标签 table 更好的选择。
鉴于此,我建议为每个要在其上添加标签的 table 创建一个标签列,可以是数组或 JSONB 列,具体取决于。如果您需要搜索多个 table,我建议使用 UNION 查询,而不是使用单一的整体标签 table 来连接所有内容。
我正在尝试实现类似于 Whosebug 拥有的标签系统。显然我已经阅读了多篇文章,包括这篇 answer.
但是我的情况有点不同
- 标签数量有限,只能由具有更高权限的用户创建(任何人都可以在那里分配标签)。这不包括选项 #1(从我上面链接的 SO 问题中,每个标签都直接插入 tables
tags
列,然后用LIKE
查询)我猜 - 数据库中还有多个table可以标记(目前是五个)
特别是第二个标准使它变得更难所以这些是我的想法
- 我可以按照选项 #3,有 table
tags
并且与每个 table 有 M:N 关系。然而,这会使搜索变得更加困难(想象一下,如果 table 数字增长,则加入)而且我还需要告诉哪个 table (应用程序模块)与搜索结果中的标签相匹配 - 我可以使用某种多态性,但我对这个关于数据库的概念还很陌生,所以这能很好地解决这个问题吗?
我使用最新版本的 PostgreSQL。
由于您使用的是 PostgreSQL,因此您可以选择其他数据库无法使用的某些字段类型。特别是数组和 JSON 字段。我对 a blog post 中的各种方法做了一些性能比较。对于需要组合多个标签的任何搜索,数组和 JSONB 绝对是比标签 table 更好的选择。
鉴于此,我建议为每个要在其上添加标签的 table 创建一个标签列,可以是数组或 JSONB 列,具体取决于。如果您需要搜索多个 table,我建议使用 UNION 查询,而不是使用单一的整体标签 table 来连接所有内容。