【问题标题】:MySQL Design for User Photo Gallery用户照片库的 MySQL 设计
【发布时间】:2012-01-03 16:58:02
【问题描述】:

我正在为每个用户可以上传多张图片的基本照片库进行数据库设计。

现在这是我所拥有的:

照片库

photo_id -    image             - sort_order - user_id
1        -    test.jpg          - 1          - 1
2        -    another_photo.jpg - 2          - 1

然后在我的文件夹结构中创建一个新文件夹,如下所示: images/photo-gallery/ 并将图像存储在其中。现在,我是否应该为每个 user_id 创建一个文件夹并将他们的特定图像存储在该文件夹中/

所以在这种情况下: images/photo-gallery/1/test.jpg 和用户 1 的所有照片都会在那里吗?

另外,为了调整大小,我正在考虑使用smart image resizer,这样我就可以存储原始照片,如果我想将其调整为特定大小,我可以使用如下脚本调用它:/image .php?width=200&height=200&image=test.jpg。

我应该散列这些文件名吗?我还缺少什么吗?有什么改进的建议吗?

谢谢!

【问题讨论】:

    标签: php mysql database-design gallery photo-gallery


    【解决方案1】:

    现在,我应该为每个 user_id 创建一个文件夹并将他们的特定图像存储在该文件夹中吗?

    是的,以某种方式分隔上传文件是个好主意,这样您就不会最终在一个目录中保存数以万计的文件。您可以通过用户 ID、首字母(例如 images/t/te/test.jpg)或哈希(例如 images/0e/0e4fab12.jpg)来分隔它们。


    我应该对这些文件名进行哈希处理吗?

    这取决于您要完成的工作。由于您打算在 URL 中引用文件名,因此使用一组已知的“安全”字符存储文件名可能是一个优势:

    image.php?image=c/ca/cat%20farting%20On%20a%20lemon.jpg
     -- vs --
    image.php?image=0a/0a1b2c3d.jpg
    

    但是,如果您这样做,我建议您扩展您的数据库架构以包含原始文件名:

    photo_id | image           | orig_fn           | sort_order | user_id
    1        | 0a/0a1b2c3d.jpg | charginLazors.jpg | 1          | 2
    

    您还可以考虑存储有关图像的其他元数据,例如上传日期、标题等。


    关于文件夹结构,您可以使用文件名中的任意数量的字符,但需要考虑一些事项:

    使用创建十六进制文件名的哈希方法意味着您的最大子文件夹数将是 16 的倍数:

    • 一个字符 - 16 个子文件夹
    • 两个字符 - 256 个子文件夹
    • 三个字符 - 4096 个子文件夹

    如果您使用两个以上的字符,我建议进一步嵌套文件夹:0a/0a12/0a12bd31.jpg -或- 0a/12/0a12bd31.jpg。这使得导航/管理文件更易于管理(IMO)

    请记住,您使用的前缀字符越多,每个文件夹中的文件就越少。如果您期望高容量,您可以选择拥有更多文件夹,每个文件夹中的文件更少。

    【讨论】:

    • 这是一个很好的答案。我只是想强调文件名/文件路径重复的可能性。如果用户有可能上传同名的图像或用户将上传相同的图像(如果您将文件名基于图像本身的哈希值),您需要确保您首先检查重复(file_exists())并以某种方式处理它。您还可以将 mysql photo_id 附加到文件的末尾 ('_'.photo_id) 以保持其唯一性,并可能在将来将其用作识别快捷方式。
    • 感谢您的精彩回答。只是几个问题。为了存储路径,最好将其存储为:0a/0a1b2c3d.jpg 而不是包含图像文件夹,以防我更改它?在这种情况下存储原始文件名有什么好处?
    • @Drew:很好。是的,最好将相对于图像根路径(您可以在配置文件中设置)的图像路径存储在数据库中。我会修改答案。关于原始文件名,这实际上取决于画廊的目的。如果用户查看图像的原始文件名(或者,使用原始名称而不是看似随机的名称下载图像)对用户有用,则包含它。如果文件名无关紧要,请跳过它。这就是构建自己的系统的美妙之处:您可以让它完美地适合您的预期用途。
    • 好的,太棒了,谢谢!最后一个问题。我将创建一个 PHP 脚本,将文件重命名为哈希,并自动获取前 2 个字母并为它创建一个文件夹(如果它不存在)?不会有很多文件夹,因为如果它是随机生成的,那么每个文件与前一个文件具有相同 2 个字母的几率很小?还是我误会了什么?
    • 是的,您将在上传处理程序中生成散列,在图像路径上创建任何必要的文件夹,然后使用move_uploaded_file() 将其放入带有散列文件名的最终位置。我还更新了答案,更好地解释了文件夹结构的可能性。
    【解决方案2】:

    现在,我应该为每个 user_id 创建一个文件夹

    这是一个很好的解决方案,另一种可能性是每年创建一个文件夹,最终每月创建一个文件夹,具体取决于目标照片数量。 对于照片文件名,我建议使用数据库 id,这将使您远离字符编码问题,并最终将原始名称保留在数据库中。

    也为了调整大小,我正在考虑使用智能图像调整器

    在我看来,除非您需要保留完整尺寸的图像,否则我建议存储调整大小的照片。好处如下:可以存储更多照片,可以更快速地发送照片,照片导航会更灵活。

    我还有什么遗漏吗?

    也许是那种可以推动您存储图像的用户权限。

    有什么改进的建议吗?

    我致力于这些想法并创建了一个 PhotoBlog,您可以找到 here 它是开源的,因此请随意查看 PHP 和 JavaScript 源代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-11
      • 2011-02-21
      • 2015-06-22
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多