1

所以我有一个以相册组织的图片库网站,所以存储相册图像的数据库表基本上有这个方案:

album_id | images_link
112      | 1.jpg
112      | 2.jpg
112      | 3.jpg
112      | 4.jpg
112      | 5.jpg
112      | 6.jpg
112      | 7.jpg
112      | 8.jpg
112      | 9.jpg

因此,为了避免超长的数据库表,我想可能将专辑的所有图像存储到一个单元格中,如下所示:

album_id | images_link
112      | 1.jpg, 2.jpg, 3.jpg, 4.jpg, 5.jpg, 6.jpg, 7.jpg, 8.jpg, 9.jpg

我的意思是数据库大小当然会保持不变,但要读取的行数会大大减少。我将使用explode 函数来拆分并提供每个图像文件链接。这是一个明智的选择吗?我不确定explode 函数是否像获取大型数据库一样占用内存。我想听听你的意见。

看到问题是图像名称不是那么短,images_link 行设置为 27 个字符,因此我设置的每个相册限制为 30 张图片,因此单个单元格预计稍后会达到 810 个字符。我从来没有使用 varchar 来存储这么多字节,在这种情况下使用 VARCHAR 还是 TEXT 更好?我知道 VARCHAR 更快。

先感谢您。

4

3 回答 3

3

你的第一个方案比第二个更好。

更适合维护:

  • 仅添加一行以放置新图像
  • 仅删除一行以退出图像
  • 如果要编辑图像的路径,只需更新该行...

稍后,如果您想列出带有第一张图片的画廊,您只需要做一个 JOIN ...

使用您的第二个架构,在类别表中有一个名为“list_of_images”的字段没有区别......

于 2012-12-07T22:20:07.237 回答
2

不,不要那样做。拥有“超长数据库表”没有问题。将子项聚合到单个列中存在许多潜在问题。

您说“要读取的行数将大大减少”。您是否想象如果您不使用明细表,并且将所有内容都塞入标题表中,将会有某种速度提升?不会的。

你现在拥有它的方式就是它应该完成的方式。保持这种状态并继续学习。

于 2012-12-07T22:19:53.853 回答
0

您应该保留原始表结构,因为维护 images_link 列将成为一场噩梦。当您想要删除album_id=112 和images_link=3.jpg 的行时会发生什么?

如果您想将读取简化为单行,请尝试使用 group_concat 进行查询

SELECT GROUP_CONCAT(images_link) FROM tbl_album_images WHERE album_id='112'

应该返回

1.jpg,2.jpg,3.jpg,4.jpg,5.jpg,6.jpg,7.jpg,8.jpg,9.jpg

编辑:我确信这很明显,但也要确保你在专辑 ID 上有一个索引

于 2012-12-07T22:20:44.337 回答