用户照片库的MySQL设计

时间:2012-01-03 16:58:02

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

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

现在这就是我所拥有的:

photo_gallery

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。

我应该散列这些文件名吗?我错过了什么吗?关于如何改进这个的任何建议?

谢谢!

2 个答案:

答案 0 :(得分:4)

  

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

是的,以某种方式分离上传是个好主意,这样你就不会得到一个包含数万个文件的目录。您可以通过userid,首字母(例如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)

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

答案 1 :(得分:0)

  

现在,我应该为每个user_id

创建一个文件夹

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

  

另外,为了重新调整大小,我正在考虑使用智能图像缩放器

对于我的观点,除非您需要保留完整尺寸的图像,否则我建议存储已调整大小的照片。好处如下:你可以存储更多的照片,你可以更快地发送照片,照片导航将更具反应性。

  

我错过了什么吗?

也许这种用户权限可以推动您存储图片的方式。

  

有关如何改善此事的任何建议吗?

我研究了这些想法并创建了一个PhotoBlog,你可以找到here它是开源的,所以请随时查看PHP和JavaScript源代码。