【发布时间】:2012-10-05 22:21:25
【问题描述】:
我正在创建一个数据库应用程序,它(除其他外)允许用户上传和下载文件。这些文件存储在文件服务器上,我已经使用 PHP 脚本设置了一个 Apache HTTP 服务器来处理(即上传和下载)文件。数据库只存储文件的链接,而不是文件本身。我的问题是:我应该如何组织文件服务器上的文件?
目前,我正在根据当前日期创建一个目录结构,并使用当前日期/时间(包括毫秒)的 MD5 哈希加上一些随机字符(即我添加“salt”)重命名文件:
\\yyyy\mm\dd\debb40da158040e4f3b93f9576840c07
这个(上图)是存储在数据库中的链接(当然,我也把真实的文件名存储在数据库中,这样当用户去下载文件时我可以重命名文件——用户从不见实际链接)。
我使用yyyy\mm\dd 作为目录结构以避免性能问题(我被告知同一目录中的很多文件会减慢速度)并且我用唯一的字符串重命名文件以避免用户上传时发生冲突具有相同名称的文件。
我想就在这种情况下处理文件存储的最佳方式获得其他意见。我已经看到一些开发人员保留文件名,但在文件信息表中附加(作为前缀)相应行的数据库 ID ---我看到了这种方法的一些优点,因为文件名是“人类可读的”并且如果数据库文件信息表被损坏或删除,您可以弄清楚这些文件是什么。
【问题讨论】:
-
你是对的,有一个包含很多文件的目录可能是一个性能问题。您对每天可能收到多少文件有任何预测吗?使用 MD5 作为命名方案的原因是什么?是为了确保一个唯一的名称吗?如果可能的话,我希望使用一个至少提供有关文件的一些信息的名称,而不是如此不透明的名称(更不用说在测试期间难以键入或找到。)
-
@Marvo 感谢您的反馈。我预计不会每天上传很多文件(可能每天大约 50 个文件),但有些文件可能相当大(~150 MB)。我同意你关于使用 MD5 作为文件名的说法......它非常“不透明”......我这样做的原因是为了确保一个唯一的名称并减少链接名称的长度。
-
文件量听起来不是问题。 (文件的实际大小与为什么一个非常完整的目录是一个问题无关。)在一个企业中,我们有一堆与帐户相关联的图像,这些图像存储在类似于您正在做的事情中。我们没有对它们进行足够的分区。如果有人在目录上执行“ls”,它会严重影响机器的性能(原因我不记得了),因为它获得了所有的名称。这与目录中文件条目的数量有关(我们有数千个。)
-
您还可以探索应用程序中为您生成唯一名称的方法(或编写一个。)您也可以使用序列(在 Oracle 中)或 next-number-table 来生成唯一名称.
-
@Marvo 感谢您的所有 cmets...感谢您对我的问题感兴趣。
标签: database database-design fileserver file-organization