1

我知道这个问题之前已经被问过很多次,但我还没有找到解决我具体情况的答案。

使用 PHP 和 MySQL...

我即将将用户个人资料图片添加到应用程序中,正如我所见,我有几个选择。其中两个如下:

1.不参考数据库中的图像并像这样存储图像:-

  • /assets/avatars/32px/userid.jpg

  • /assets/avatars/90px/userid.jpg

  • /assets/avatars/256px/userid.jpg

这意味着没有额外的数据库查找,因为我已经有了相关的用户 ID。

1.将相对路径存储在 users_meta 表中,并在检索用户数据时使用连接检索 url。

每种方法的优缺点是什么?如果在您看来,这两种方法都不是最好的方法,那么您认为存储/引用和检索用户个人资料图片的最有效和可扩展的方法是什么。

非常感谢

编辑:添加更多细节:

我对选项 1 的担忧是,我不确定文件系统将如何处理单个目录中的 100 万多个文件。它会慢到爬行吗?如果是这样,我该如何解决这个问题?有没有可以消除这个潜在问题的结构?也许使用用户加入的时间作为 url 的一部分并按月存储图像。

例如/assets/avatars/10_2012/small/userid.jpg

10_2012 表示所有在 2012 年 10 月注册的用户。

或者在每个目录中只存储 1000 张图像并访问类似的内容:

  • /assets/avatars/0/small/userid.jpg
  • /assets/avatars/1000/small/userid.jpg
  • /assets/avatars/2000/small/userid.jpg

每次应用达到 1000 * n 个注册用户时添加一个新目录。

这会带来优势吗?

4

3 回答 3

2

您可以使用选项 1,但使用部分 id 来创建路径。例如,如果您有六位 id,则可以将前两位数字作为路径的一部分:Id 123456.xyz 将变为 /1/2/123456.xyz。等等......在这个例子中,使用数字 ID,它将限制每个目录包含 1000 个文件。

于 2012-07-18T19:17:37.103 回答
1

我倾向于在我的应用程序中做的是保存原始图像。

查找时,生成缩略图(或任何大小的图像)并将其放入缓存目录中,或者如果图像已存在于缓存目录中,则将其返回给用户。

如果上传图片的人删除或更新了原始图片,您也会将其从缓存中删除。

这样做非常有用,因为您不需要知道最初保存时图像将使用的每个维度。

于 2012-07-18T18:09:53.317 回答
1

正如您正确指出的那样 - 如果根据您的需要使用文件系统,您不必进行额外的数据库查找。这可以节省您的时间和资源。

我可以看到为此使用数据库的唯一好处是“单点”备份。但我怀疑这是一个非常有效的“专业人士”,或者它是否甚至超过了由数据库查找引起的额外间接级别引入的额外复杂性

编辑(以匹配问题中的编辑):文件系统的工作方式很大程度上取决于操作系统。你的目标平台是什么?

于 2012-07-18T18:11:05.350 回答