gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 00:53:31 24 4
gpt4 key购买 nike

有人在我的网站上上传艺术作品。他们输入标题、标签和文件。

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

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

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

最佳答案

只需根据数据实体及其含义将它们分开即可。对于 titletagsfile,听起来您有两个实体:

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

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

也就是说,titlefile(在您的情况下,我猜您将其存储为文件系统上文件的路径,这很好) 是一个实体,标签 是它自己的独立实体。由于每个 Picture 可以有多个 tag 并且每个 tag 可以与多个 Picture 相关,所以它是一个多对多关系。所以通常会创建一个支持的非实体表来将它们链接到数据库中:

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

还可以对该设计进行其他调整,以及查看和报告数据的许多其他方式。但在所有这一切中有一个关键点:

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

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

关于php - 为相关标签搜索设置 MYSQL 数据库的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7221196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com