我将有一个包含许多公司的网站,每个公司都可以上传他们的徽标。为每个注册的公司创建一个文件夹是个好主意,所以它会是companies/user1/logo.jpg和companies/user2/logo.jpg并且只将每个人存储在一个文件夹中,这样我不需要路径来引用图像?
或者我应该将它们存储在像company_logos/gaegha724252.jpg这样的文件夹中,它们都是随机文件名,路径是否会存储在与该公司关联的数据库中?
有哪些优点和缺点?
谢谢!
优点:对于在后端摆弄系统的人来说,它们在逻辑上是清晰的 - 这就是真的。
缺点:当您删除公司等时,“更难”清理并且您必须确保没有任何目录名称重叠,通常更多的工作从开始。
优点从技术上讲,清理起来要容易一些,而不是那么多工作。
缺点您必须至少编写一个非常基本的碰撞检测算法和一个非常基本的“随机名称生成器”。
警告:在这个论点中已经失去了许多生命!
优点:参照完整性,支持 up/restoring 更简单,分类
缺点:充满陷阱,可能更慢,更先进的技术,潜在的性能问题和网络请求的增加。此外,大多数廉价的托管服务提供商的数据库太可怕了,这是一个好主意。
我强烈建议只使用散列文件名并将其(文件名)存储在数据库中,然后将图像存储在磁盘上的文件夹(或许多文件夹)中。从长远来看,这应该会更容易,并且总体上表现更好而不会变得太复杂。
我会更进一步:在将每个文件存储到文件系统之前计算每个文件的 MD5 总和。您可以使用前两个字符作为第一级的目录名,接下来的两个字符作为第二级的目录:
vv 1st level 61f57fe906dffc16597b7e461e5fce6d.jpg ^^ 2nd level
由于散列算法具有相同的分布,这将在文件夹之间平均分配您的文件(这个想法来自 Squid 如何组织它的文件缓存)。服务器应该返回这样的 URL(e.g. 没有关于目录的概念):
http://server.com/images/61f57fe906dffc16597b7e461e5fce6d.jpg
你可以应用mod_rewrite来实际重写这个 url:
mod_rewrite
/storage/images/61/f5/7fe906dffc16597b7e461e5fce6d.jpg
这也将增加一定程度的匿名性并隐藏真实的图像名称。此外,如果您的客户打算上传相同的内容,它将最终在同一个文件中,这将节省您的磁盘空间。从一个客户端删除文件时要小心:它也可能被其他人使用!
将它们存储为“company_logos/125.jpg”,其中 125 是唯一的 ID(数据库中的主键)。
根据您期望的公司数量,为每家公司创建一个文件夹很快就会变得荒谬。此外,从磁盘读取文件夹结构比从数据库读取要慢得多。
您可以将图像位置存储在数据库中,也可以使用 ID 解决方案。如果需要,您还可以使用“blob”类型将图像本身存储在数据库中。虽然其他问题已经解决了这个问题:在 DB 中存储图像 - 是还是不?
我认为最好将图像名称存储在数据库中,或使用 ID 方法。
如果它只是几百条左右的记录,我就不会在数据库外存储图片了。
5 回答
使用文件夹进行组织
优点:对于在后端摆弄系统的人来说,它们在逻辑上是清晰的 - 这就是真的。
缺点:当您删除公司等时,“更难”清理并且您必须确保没有任何目录名称重叠,通常更多的工作从开始。
在一个文件夹中使用图像
优点从技术上讲,清理起来要容易一些,而不是那么多工作。
缺点您必须至少编写一个非常基本的碰撞检测算法和一个非常基本的“随机名称生成器”。
使用数据库存储图像
警告:在这个论点中已经失去了许多生命!
优点:参照完整性,支持 up/restoring 更简单,分类
缺点:充满陷阱,可能更慢,更先进的技术,潜在的性能问题和网络请求的增加。此外,大多数廉价的托管服务提供商的数据库太可怕了,这是一个好主意。
我强烈建议只使用散列文件名并将其(文件名)存储在数据库中,然后将图像存储在磁盘上的文件夹(或许多文件夹)中。从长远来看,这应该会更容易,并且总体上表现更好而不会变得太复杂。
我会更进一步:在将每个文件存储到文件系统之前计算每个文件的 MD5 总和。您可以使用前两个字符作为第一级的目录名,接下来的两个字符作为第二级的目录:
由于散列算法具有相同的分布,这将在文件夹之间平均分配您的文件(这个想法来自 Squid 如何组织它的文件缓存)。服务器应该返回这样的 URL(e.g. 没有关于目录的概念):
http://server.com/images/61f57fe906dffc16597b7e461e5fce6d.jpg
你可以应用
mod_rewrite
来实际重写这个 url:/storage/images/61/f5/7fe906dffc16597b7e461e5fce6d.jpg
这也将增加一定程度的匿名性并隐藏真实的图像名称。此外,如果您的客户打算上传相同的内容,它将最终在同一个文件中,这将节省您的磁盘空间。从一个客户端删除文件时要小心:它也可能被其他人使用!
将它们存储为“company_logos/125.jpg”,其中 125 是唯一的 ID(数据库中的主键)。
根据您期望的公司数量,为每家公司创建一个文件夹很快就会变得荒谬。此外,从磁盘读取文件夹结构比从数据库读取要慢得多。
您可以将图像位置存储在数据库中,也可以使用 ID 解决方案。如果需要,您还可以使用“blob”类型将图像本身存储在数据库中。虽然其他问题已经解决了这个问题:在 DB 中存储图像 - 是还是不?
我认为最好将图像名称存储在数据库中,或使用 ID 方法。
如果它只是几百条左右的记录,我就不会在数据库外存储图片了。