Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我应该将标记存储在文本字段中还是单独的表中?_Php_Mysql_Web - Fatal编程技术网

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

Php 我应该将标记存储在文本字段中还是单独的表中?,php,mysql,web,Php,Mysql,Web,我有一个表,其中的行是这样的: id : path : tags 1 : pictures/pic1.jpg : car bmw 3 : pictures/pic2.jpg : cat animal pussy 4 : pictures/pic3.png : gun 基本上,它是一个图库,我将图片路径存储在一个表格中,这样我就可以在网页上列出它们 用户可以根据提供的关键字搜索某些图片。例如,他在搜索栏中输入“汽车枪”,所有带有其中一个标签的图片都会为他提取。 基本标签搜索: SELECT *

我有一个表,其中的行是这样的:

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
id : path
1 : pictures/pic1.jpg
2 : pictures/pic2.jpg
3 : pictures/pic3.png
表标记:

pic_id : tag
1 : car
1 : bmw
4 : gun
..and so on..
tag_id : tag
1 : car
2 : bmw
3 : gun
标记存储在单独的表中,每个标记都有自己的行,因此在搜索过程中,我将以这种方式执行连接和搜索匹配项


哪种解决方案更好?

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


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

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


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

关于规范化和可重用性,我建议如下:

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

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

pic_id : tag
1 : car
1 : bmw
4 : gun
..and so on..
tag_id : tag
1 : car
2 : bmw
3 : gun
表格标签和图片:

id : path
1 : pictures/pic1.jpg
3 : pictures/pic2.jpg
4 : pictures/pic3.png
id : path
1 : pictures/pic1.jpg
2 : pictures/pic2.jpg
3 : pictures/pic3.png
id : tag_id : pic_id
1 : 1 : 1
2 : 2 : 1
3 : 3 : 3

关于规范化和可重用性,我建议如下:

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

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

pic_id : tag
1 : car
1 : bmw
4 : gun
..and so on..
tag_id : tag
1 : car
2 : bmw
3 : gun
表格标签和图片:

id : path
1 : pictures/pic1.jpg
3 : pictures/pic2.jpg
4 : pictures/pic3.png
id : path
1 : pictures/pic1.jpg
2 : pictures/pic2.jpg
3 : pictures/pic3.png
id : tag_id : pic_id
1 : 1 : 1
2 : 2 : 1
3 : 3 : 3

你可能想读我喜欢的“带pic_id的表标记”,只是因为它呼吸和感觉更像是SQL变体的关系数据库。你可能想读我喜欢的“带pic_id的表标记”,只是因为SQL变体更像是一个关系数据库。是的,我也在考虑这个解决方案,但放弃了它,因为它需要3个表,我担心它会影响性能。@user3240613,除非您有100.000s行,你真的不需要担心performance@user3240613正如kingkero所说,与每次必须用另一种方法解析每一组标记时所获得的性能相比,行和表的数量不是问题。是的,我也在考虑这个解决方案,但是放弃了它,因为它需要3个表,我担心它会影响性能。@user3240613除非您有100.000行,否则您真的不需要担心performance@user3240613正如金科罗所说,与每次必须在另一种方法中解析每一组标记时都缺乏性能相比,行和表的数量不是问题。