您将如何设计一个数据库来支持以下标记功能:

  • 项目可以有大量标记
  • 搜索带有给定标记集的所有项目必须快速(项目必须具有所有标记,因此它是AND搜索,而不是OR搜索)
  • 创建/写入项目可能会更慢,以实现快速查找/读取

理想情况下,使用(至少)一组n个给定标记标记的所有项的查找应该使用单个SQL语句完成.由于要搜索的标签数量以及任何项目上的标签数量都是未知的,并且可能很高,因此使用联接是不切实际的.

有什么 idea 吗?


谢谢你迄今为止的所有答案.

不过,如果我没弄错的话,给出的答案说明了如何在标签上进行OR搜索.( Select 具有n个标记中的一个或多个标记的所有项目).我正在寻找一个高效的搜索引擎.( Select 所有有n个标签的项目,可能还有更多.)

推荐答案

关于安定:听起来你在寻找"关系部门"的运作.This article以简明易懂的方式介绍了关系划分.

关于性能:基于位图的方法听起来很适合这种情况.然而,我不认为"手动"实现位图索引是个好主意,就像digiguru建议的那样:无论何时添加新标签,听起来都是一个复杂的情况(?)但是一些数据库管理系统(包括Oracle)提供位图索引,这可能在某种程度上是有用的,因为内置的索引系统消除了索引维护的潜在复杂性;此外,提供位图索引的DBMS应该能够在执行查询计划时适当地考虑它们.

Sql相关问答推荐

AWS Athena将SON对象数组解析到行

如何汇总组中的第一个值

识别顺序记录组

基于前面行的值:当x&>2时重复1,当连续3行x=0时则重复0

从原始表列中经过JSON字符串化的对象数组构建视图

使用SQL创建列出两个时间戳之间小时数的列

从类似JSON的字符串列创建新列

将 json 列键映射到第二个表中的匹配列值

SQL根据另一列的顺序和值获取组中的最后一列

统计重复记录的总数

匹配 H[0-9][0-9] 但不匹配除字母 H 之外的任何字母

根据要过滤的列的值进行联接和分组

如何从三个连接表中获取数据,并始终显示第一个表中的数据,以及第三个表中的空值或现有记录?

在SQL中实现表格数据透视类型报表

正则表达式忽略特定数据部分的分隔符

自动生成计算频率的列

Oracle函数中无法动态迭代创建的SYS_REFCURSOR

PostgreSQL - 递归地聚合来自不同列的属性

字符串从更改到表列和查询中的一行的转换错误

如何通过子 Select 在一次更新(并行数组)中多次更新相同的行