【问题标题】:Searching a MySQL database for tags在 MySQL 数据库中搜索标签
【发布时间】:2013-01-09 19:51:39
【问题描述】:

我正在努力创建一个系统,以允许用户上传项目并向它们添加“标签”,以帮助它们在搜索中可见。目前,我有一个这样工作的数据库:

id|title|tags

其中tags 是用户自己输入的以逗号分隔的标签列表。我读过这是一种糟糕的方法,但是拥有一个标签表并将每个 ID 与项目记录一起存储基本上是一样的。

如何运行搜索以首先返回最相关的结果?我目前正在使用它,它有效,但不按相关性排序:SELECT * FROM items WHERE tags LIKE '%$tag%' LIMIT 0,20"; 其中$tag 只是一个标签,没有逗号(它在循环内)。

【问题讨论】:

  • ... is basically the same thing...,直到您必须按相关性排序、按特定标签排序、一次搜索多个标签或性能不佳并向字段添加索引。
  • 你如何定义相关性?您的查询中没有 order by,因此它只是按照您的主索引(通常是主键)的顺序返回记录。即使您将其拆分为表格,您仍然需要定义相关性。
  • @Sam 我将相关性定义为与项目匹配的标签数量。如果用户在搜索中键入 3 个标签,并且结果中的一个项目包含所有 3 个标签,我希望那个是第一个,而不是按照它们在数据库中的顺序。

标签: php mysql search tags


【解决方案1】:

having a tags table and storing each ID along with the item record is basically the same thing

没有。不。不。这绝对不是一回事。

您使用“逗号分隔列表”版本,并尝试提出查询来解决这些问题:

  1. 从所有标题中删除标签 ID #7
  2. 有多少标题使用标签#87

使用正确规范化的表格:

  1. 从 users_tags WHERE tag_id=7 中删除
  2. SELECT count(*) FROM users_tags WHERE tag_id = 87

使用您的版本:

  1. UPDATE users_tags SET tags=.... 在此处插入大量丑陋的字符串操作...
  2. SELECT count(*) FROM users_tags WHERE tag_id=87 OR tag_id='87,%' OR tag_id LIKE '%,87,%' or tag_id LIKE '%,87'

看到区别了吗?

【讨论】:

  • 我明白了。但是,您的规范化表示例不是每个项目只允许一个标签吗?我希望有很多标签,类似于 StackOverflow 本身或 YouTube。对不起!
  • @PGR 所以你需要 3 个表: items(id, title) tags(id, tag) itemTags(id, itemid, tagid)
  • @pgr:正是约翰博克所说的。 3 个表,第 3 个表是链接/数据透视表,将用户与标签联系起来。阅读“多对多”关系。
  • @MarcB 谢谢你们,我以前基本上从来没有接触过 MySQL,这会很有趣!感谢您的帮助!
  • 不仅仅是 mysql。这适用于所有关系数据库。它们的存在是为了关联数据。当您将多个不同的值一起填充到一个字段中时,您将带走关系的“相关”部分 - 现在数据库无法完成其设计的工作,因为它一次只能关联单个数据位,而不是数据“球”。
猜你喜欢
  • 2012-04-23
  • 2016-05-16
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
相关资源
最近更新 更多