MySql/php - 标签系统

3
我正在实现一个标签系统...
目前我有一个名为tags的表,其中包含namedescriptioncreatedby字段。
另外还有一个名为images的表,其中有一个tags字段。在此字段中,我将放置来自tags表的标签名称,用逗号分隔。
但是,如果我想要获取所有带有Foo标签的图像,我该如何查询?由于该字段将包含用逗号分隔的多个标签,因此该怎么做呢?

我现在还没有尝试过任何东西,因为我不知道如何从查询中开始。 - Fr0z3n
2
我会对数据进行规范化。为每个图像创建一个包含每个标签的单独记录的表格。在我看来,这将使您的查询(以及生活)更加简单。 - Tom
@Tom,就数据库使用和速度而言,你的方法比我的更好? - Fr0z3n
如果您有一个每个记录只有一个标签的表格,您可以对标签字段进行索引,这样过滤速度会更快。而一个包含多个值的字段将会查询得慢得多,因为您无法使用索引。 - Tom
好的,那我会使用你的方法,谢谢! - Fr0z3n
3个回答

3

不确定您是否考虑过对图像表进行归一化,但这将是最佳解决方案。

不要采用以下方式:

enter image description here

请按照以下方式构建您的表:

enter image description here

然后,您可以运行此SQL语句来返回所有带有特定标签的图像。

SELECT * FROM images
WHERE tags = 'forest';

或者,如果您有保留表格当前格式的原因,您可以使用

SELECT * FROM images
WHERE tags LIKE '%forest%';

以上两个示例中的单词“forest”就是您正在搜索的标签。

我会进一步创建一个具有idurl列的urls表格,以及一个具有 url_idtag 列的 tags 表格。 - inhan
为此,我需要重写所有从数据库获取/插入图像的函数。所以我按照Tom的建议,只创建一个表来记录图像ID和标签ID,并在查询中将它们连接起来。 - Fr0z3n

2
尝试这样做:

试试这样的方法:

SELECT * FROM images WHERE tags = 'Foo' OR tags LIKE 'Foo,%' OR tags LIKE '%,Foo' OR tags LIKE '%,Foo,%'

0

将标签ID存储在tags字段中,格式如下:',3,17,55,'

当您执行数据库查询时,您可以使用快速的构造方式,例如:

SELECT * FROM images WHERE INSTR(tags,',$tag_id,')>'0'

不要使用“LIKE'%$tag_id'”这种的方法


2
将标签用逗号分隔存储并不是一个好主意,真的。 - Zar
我同意,但是主题发起人打算这样做。 - dimaninc
正确。除了您的答案外,解释为什么这是不好的,并指导他走向更好的道路可能是一个好主意。 - Zar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接