PHP和MySQL标记系统逻辑

4

我是一名初学者开发者,想请教一些建议。

我目前正在构建一个平台,让人们可以上传图片并为它们打标签。

我正在阅读一些文章,其中介绍了以下结构用于存储标签:

存储逻辑 1

| photo_id |     name     |            tags            |
|     1    |  some photo  | flower, sun. island, beach |
|     2    |  some photo2 | hawaii, travle. surf       |

很多人认为这不是一个好主意。

那么我的逻辑是这样的。

我在阅读关于多对多关系的相关内容时,想出了以下逻辑:

标签表

| tag_id   |   name   |
-----------------------
|     1    |  flower  |
|     2    |  hawaii  |
|     3    |  surfing |
|     4    |  island  |
|     5    |  travel  |

照片表

| photo_id |     name     |
---------------------------
|     1    |  some photo  |
|     2    |  some photo2 |

关系表

| tag_id   |   photo_id   |
---------------------------
|     1    |       1      |
|     2    |       1      |
|     3    |       1      |
|     4    |       2      |
|     5    |       2      |

我选择使用Laravel框架来简化开发过程。

但我的问题在于逻辑2,我担心这将生成巨大的负载时间。

由于没有默认的标签,只有基于用户的标签,所以我考虑了以下逻辑:

用户上传带有标签的图片,在保存图像之前,检查实际标记是否存在,如果不存在,则保存它,然后返回tags_id并将其保存到关系表中与photo_id一起。

所以我的两个问题是:

  • 哪种逻辑更好,为什么?

  • 如果选用逻辑2,我想到的方式是否好,当有很多标签时,我应该担心未来的负载时间吗?

谢谢


2
你不必担心加载时间,因为你应该知道数据库索引的所有内容,以及它们如何帮助防止时间升高... :-) - vogomatix
例如,当人们搜索实际标签时,这不会成为问题吗? - Levi
1
您也可以索引标签名称...这样做会使添加操作变慢,但搜索速度会更快。 - vogomatix
2个回答

2
我会选择第二种方法。不必担心加载时间,你可以通过联接轻松获得分类信息。
但是,你应该在关系表中添加一个id列,以便多个图片可以共享一个分类。

1
在您的第二个示例中,您的关系表应该有索引,这样当您基于特定photo_id查找所有标记时,答案将迅速返回。
另请参见外键
在您的relation表中,tag_id是指向标记表的外键,photo_id是指向照片表的外键。标记可能与多张照片有关联,而一张照片也可能与多个标记有关联。
同样,您的标记(和照片)名称也应进行索引以进行快速搜索。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接