0

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

id|title|tags

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

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

4

1 回答 1

7

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 中删除 tag_id=7
  2. 从 users_tags 中选择计数(*),其中 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'

看到不同?

于 2013-01-25T19:16:42.980 回答