这里有一些关于大型项目中的文件管理和存储的非常好的问题。

在数据库中存储图像 - 是还是否?
您会将二进制数据存储在数据库还是文件系统中?

第一个有一些伟大的见解,在我的项目中,我决定采用文件路线而不是数据库路线。

反对使用文件系统的一个主要问题是备份。但在我们的系统中,我们有一个很棒的备份方案,所以我并不担心这一点。

下一个路径是如何存储实际文件。我考虑过让文件的位置始终保持静态,并在数据库方面创建一个虚拟目录系统。所以文件的链接不会改变。

我正在构建的系统将有一个全局文件管理,因此所有用户都可以访问所有文件。但许多采用文件路径的人都会谈论物理目录大小(例如,如果所有文件都在一个目录中)

所以我的问题是,为这些静态文件创建文件夹有哪些技巧或最佳实践方法,或者我是否根本不应该使用虚拟目录路径。

(如果有帮助的话,该项目位于 LAMP 堆栈(PHP)上)

有帮助吗?

解决方案

的一种方式是一个唯一的编号分配给每个文件,并使用它来查找实际的文件位置。然后,你的使用,这个数字将在文件系统中的不同目录分发文件。例如,你可以使用这样的方案:

/images/{0}/{1}/{2}

  

{0}: file_number % 100结果   {1}: (file_number / 100) % 100结果   {2}: file_number

其他提示

不久前,我在一个托管大量文件的网站上遇到了这个问题。我们所做的是获取 GUID(这也是文件的主键字段)(例如BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301) 并存储如下文件:/B/C/C/BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301/文件名.ext

这有一定的优点:

  • 您可以将文件服务器扩展到多台服务器上(并为每台服务器分配特定目录)
  • 您不必重命名该文件
  • 您的目录保证是唯一的

希望这可以帮助!

为了避免在单个目录中创建过多的条目,您可能希望根据文件名的各个部分来创建目录。例如,如果您有一个名为 d7f5ae9​​b7c5a.png 的文件,您可能希望将其存储在 media/d7/f5/d7f5ae9​​b7c5a.png 中。如果您的文件名都是十六进制,那么这会将单个目录中的条目数限制为 256,直到最终级别。

  1. 一个用户图像 ~ 100kb,因此数据库中有 10 000 个用户,每个用户平均有 5 个图像,因此我们将有 5 TB 的数据库,每个图像输出将通过一个数据库执行,这个额外的数据库流量将减少一般数据库服务器性能。...您可以使用数据库集群来避免这种情况,但假设它很昂贵

  2. 用户报告有关实时数据库的错误(在测试中 - 一切正常),您将如何在开发人员计算机上创建转储和解压它?需要多少时间?

  3. 某一瞬间你决定将图片放到某个 CDN 上,你的源代码会发生什么变化?

我通常采取这种方法:

对您的应用程序,使其指向你保存上传文件的文件夹的全局设置变量。在你的数据库文件的相对路径存储(相对于什么样的设置变量指向)。

因此,如果一个文件位于/www/uploads/image.jpg,设置varible点/ WWW /上传你的数据库行已为image.jpg。这是从应用程序的解耦系统的目录结构的灵活方式。

另外,你可以在分段基于目录中的文件存储这些涉及到什么样的数据库表。假设你有一个表user_reports和一张桌子user_photos。您存储涉及到/ WWW /上传/ user_reports user_reports的文件。如果你有大量的用户上传的,你甚至可以进一步落实fragmentaion。假设一个用户会上传二零零九年三月二十日一个文件,文件名为report.pdf,所以你把它储存在/www/uploads/user_reports/2009/03/20/report.pdf。

我不能说太多有关如何Apache和PHP管理文件,但我可以说一些关于ext3文件系统。 EXT3似乎并不有大量的文件在同一目录下的问题。我和上百万的文件进行了测试。确保dir_index选项创建目录之前的文件系统上启用。您可以通过运行dump2fs检查,并通过运行tune2fs更改此选项。散列文件到子目录树仍然是有用的,因为命令行工具仍然可以列出该目录的内容存在问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top