我应该将标签存储在文本字段中还是单独的表中?


Should I store tags in a text field or in separate table?

我有一个表,行如下:

id : path : tags
1 : pictures/pic1.jpg : car bmw
3 : pictures/pic2.jpg : cat animal pussy
4 : pictures/pic3.png : gun

基本上它是一个图库,我在表格中存储图片的路径,以便我可以在网页上列出它们。

用户可以根据他提供的关键字搜索某些图片。例如,他在搜索框中输入"汽车枪",所有带有这些标签的照片都会为他拉出来。基本标签搜索:

SELECT * FROM pictures WHERE tags LIKE '%car%' OR tags LIKE '%gun%'

现在我想知道的是,存储标签的更好解决方案是什么?是上面描述的那个还是这个?

表图片:

id : path
1 : pictures/pic1.jpg
3 : pictures/pic2.jpg
4 : pictures/pic3.png
表标签:

pic_id : tag
1 : car
1 : bmw
4 : gun
..and so on..

标记存储在单独的表中,每个标记都有自己的行,因此在搜索期间,我将执行JOIN并以这种方式搜索匹配项。

哪个解决方案更好?

关于规范化和可重用性,我建议这样做:

表图片:

id : path
1 : pictures/pic1.jpg
2 : pictures/pic2.jpg
3 : pictures/pic3.png
表标签:

tag_id : tag
1 : car
2 : bmw
3 : gun
表tags_pictures:

id : tag_id : pic_id
1 : 1 : 1
2 : 2 : 1
3 : 3 : 3

在这种情况下,最好的方法是为每个图像的标记创建一个中间表,建立多对多关系。

然后您将有三个表:一个用于存储图像及其id和属性,另一个用于保存标签及其id,最后一个表用于保存所有标签的图像id和标签id。