php-为相关标签搜索设置MYSQL数据库的正确方法?

我的网站上有人上传艺术作品.他们输入标题,标签文件.

上载后,我将标记标题,用逗号分隔的标记以及转换后的图像文件文件路径.

我现在想通过标签找到与此标签最接近的相关技术.因此,要找到最接近的匹配项,我必须分解标签搜索每个标签?服务器上似乎有很多工作.我想知道有人能告诉我什么是存储标签和数据的正确方法,我该怎么做?

我是否必须有一个包含标题文件路径的表,以及另一个包含艺术标识和其中一个标签的列的表.意思是如果我有“铅笔,动物,野生动植物”,那么标签表中是否会有三行具有相同的艺术品ID?

解决方法:

只需按数据实体的含义和含义将它们分开即可.对于标题,标签文件,听起来您有两个实体:

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

Tag
----------
ID
Name

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

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

此设计还可以进行其他调整,还可以使用许多其他方式查看和报告数据.但是,所有这些都是关键点:

不要使用逗号分隔的列表来存储数据.将每个数据实体标准化为自己的结构,并进行相应的存储.关系数据库非常适合这种事情.但是,每当将单独的数据元素存储为带分隔符的字符串时,就会丢失这些元素的分隔.这使得报告该数据变得更加困难,与该数据进行交互变得更加困难,对其进行更新变得更加困难,并且对于需要支持该数据的其他人来说也更加不直观.

只需记住,数据库中的任何一个字段都应该存储一条信息,而只能存储一条信息.如果必须将多个信息填充到单个字段中,则说明您没有正确使用关系数据库.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...