Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.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 为相关标记搜索设置MYSQL数据库的正确方法?_Php_Mysql - Fatal编程技术网

Php 为相关标记搜索设置MYSQL数据库的正确方法?

Php 为相关标记搜索设置MYSQL数据库的正确方法?,php,mysql,Php,Mysql,我有人在我的网站上传艺术。它们输入标题、标记和文件 一旦上传,我就有了标题标签、用逗号分隔的标签以及转换图像文件的文件路径 我现在想通过标签找到与此最接近的相关艺术。所以为了找到最接近的匹配,我必须分解标记并搜索每个单独的标记?服务器上似乎有很多工作要做。我想知道谁能告诉我什么是存储标签和数据的正确方法,我需要做什么搜索 我必须有一个表来保存标题,文件路径和另一个表来保存艺术的id和一列标签。也就是说,如果我有“铅笔、动物、野生动物”,我会在标签表中有三行具有相同的艺术ID?只需通过它们是什么以

我有人在我的网站上传艺术。它们输入标题、标记和文件

一旦上传,我就有了标题标签、用逗号分隔的标签以及转换图像文件的文件路径

我现在想通过标签找到与此最接近的相关艺术。所以为了找到最接近的匹配,我必须分解标记并搜索每个单独的标记?服务器上似乎有很多工作要做。我想知道谁能告诉我什么是存储标签和数据的正确方法,我需要做什么搜索


我必须有一个表来保存标题,文件路径和另一个表来保存艺术的id和一列标签。也就是说,如果我有“铅笔、动物、野生动物”,我会在标签表中有三行具有相同的艺术ID?

只需通过它们是什么以及它们的含义来区分数据实体。对于
标题
标签
文件
听起来好像有两个实体:

Picture
----------
ID
Title
File

Tag
----------
ID
Name
也就是说,
标题
文件
(在您的情况下,我想您将其存储为文件系统上的文件路径,这很好)是一个实体,
标记
是它自己的独立实体。由于每个
图片
可以有多个
标记
s,并且每个
标记
可以与多个
图片
s相关,因此这是一种多对多关系。因此,通常会创建一个支持非实体的表来链接数据库中的实体:

PictureTagRelationship
----------
PictureID
TagID
有了它,您可以得到一张
图片

SELECT Picture.Title, Picture.File FROM Picture WHERE Picture.ID = ?id
及其标签:

SELECT Tag.ID, Tag.Name FROM Tag
INNER JOIN PictureTagRelationship ON Tag.ID = PictureTagRelationship.TagID
WHERE PictureTagRelationship.PictureID = ?id
(您也可以通过多种方式在单个查询中实现这一点,为了简单起见,我将其分为两个查询。两个查询应该不是什么大问题,但是如果您需要高度优化数据库访问开销,或者如果您确实希望它是一个查询,那么我相信一定可以做到。)

或者,您可以获取特定标签的所有图片:

SELECT Picture.ID, Picture.Title, Picture.File FROM Picture
INNER JOIN PictureTagRelationship ON Picture.ID = PictureTagRelationship.PictureID
WHERE PictureTagRelationship.TagID = ?id
这种设计还可以做其他调整,还有许多其他方式可以查看和报告数据。但所有这些都有一个关键点:

不要使用逗号分隔的列表来存储数据。将每个数据实体规范化为其自己的结构并相应地存储。关系数据库对于这类事情非常有用。但是,每当您将单独的数据元素存储为分隔字符串时,就会丢失这些元素之间的分隔。这使得报告数据更加困难,与数据交互更加困难,更新数据更加困难,需要支持数据的任何人都不那么直观


请记住,数据库中的任何一个字段都应该存储一条信息,并且只存储一条信息。如果必须将多条信息塞进一个字段中,则说明您没有正确使用关系数据库。

只需根据数据实体的性质和含义将它们分开即可。对于
标题
标签
文件
听起来好像有两个实体:

Picture
----------
ID
Title
File

Tag
----------
ID
Name
也就是说,
标题
文件
(在您的情况下,我想您将其存储为文件系统上的文件路径,这很好)是一个实体,
标记
是它自己的独立实体。由于每个
图片
可以有多个
标记
s,并且每个
标记
可以与多个
图片
s相关,因此这是一种多对多关系。因此,通常会创建一个支持非实体的表来链接数据库中的实体:

PictureTagRelationship
----------
PictureID
TagID
有了它,您可以得到一张
图片

SELECT Picture.Title, Picture.File FROM Picture WHERE Picture.ID = ?id
及其标签:

SELECT Tag.ID, Tag.Name FROM Tag
INNER JOIN PictureTagRelationship ON Tag.ID = PictureTagRelationship.TagID
WHERE PictureTagRelationship.PictureID = ?id
(您也可以通过多种方式在单个查询中实现这一点,为了简单起见,我将其分为两个查询。两个查询应该不是什么大问题,但是如果您需要高度优化数据库访问开销,或者如果您确实希望它是一个查询,那么我相信一定可以做到。)

或者,您可以获取特定标签的所有图片:

SELECT Picture.ID, Picture.Title, Picture.File FROM Picture
INNER JOIN PictureTagRelationship ON Picture.ID = PictureTagRelationship.PictureID
WHERE PictureTagRelationship.TagID = ?id
这种设计还可以做其他调整,还有许多其他方式可以查看和报告数据。但所有这些都有一个关键点:

不要使用逗号分隔的列表来存储数据。将每个数据实体规范化为其自己的结构并相应地存储。关系数据库对于这类事情非常有用。但是,每当您将单独的数据元素存储为分隔字符串时,就会丢失这些元素之间的分隔。这使得报告数据更加困难,与数据交互更加困难,更新数据更加困难,需要支持数据的任何人都不那么直观


请记住,数据库中的任何一个字段都应该存储一条信息,并且只存储一条信息。如果您必须将多条信息塞进一个字段,那么您没有正确使用关系数据库。

是的,您的最后一段是正确的,请阅读规范化部分。您不应在需要拆分以执行查询的同一列中存储带分隔符的多个值。是的可能重复您的最后一段是正确的,请在标准化时阅读。您不应在需要拆分以执行查询的同一列中存储分隔的多个值。如果成员动态上载图像,则可能会重复?我是检查标签是否存在,还是在标签表中创建重复的标签条目?@Darius:如果标签存在,只需将图像链接到该标签即可。如果它不存在(人们可以创建标签),创建新标签并链接它。我在过去对此采取的一种方法(总是假设一个对象存在,因为如果它不存在,就应该创建它)是使用一个DAL方法,该方法总是返回所请求对象的实例(在本例中是一个标记)。在该方法中是
选择
找到它并返回它,或者
插入一个新的并返回它