2009-04-09 172 views
8

使用Rails,是否有一个原因,我应该在文件系统而不是数据库中存储附件(可能是任何时间的文件)?数据库对我来说似乎更简单,不需要担心文件系统路径,结构等问题,只需查看blob字段即可。但大多数人似乎使用文件系统,它让我猜测,这样做一定有一些好处,以致于我没有得到,或者使用数据库进行这种存储的一些缺点。 (在这种情况下,我使用的是postgres)。Rails:在数据库中存储二进制文件

回答

26

这是一个非常标准的设计问题,并没有真正的“一个真正的答案”。

我通常遵循的经验法则是“数据进入数据库,文件进入文件”。

的一些注意事项要牢记:

  1. 如果一个文件被存储在数据库中,你打算怎么通过http服务于它呢?请记住,您需要设置内容类型,文件名等。如果它是文件系统上的文件,则Web服务器会为您处理所有这些内容。非常快速和高效(甚至可能在内核空间中),不需要解释代码。

  2. 文件通常很大。大型数据库当然是可行的,但是它们很慢并且不便于备份等。为什么在不需要时使数据库变得庞大?

  3. 与2.非常相似,将文件复制到多台机器上非常简单。假设你正在运行一个集群,你可以定期从你的主机到你的从机rsync文件系统,并使用标准的静态http服务。显然,数据库也可以聚集在一起,但它不一定是直观的。

  4. 另一方面,如果您已经对数据库进行了集群化,那么除了处理集群文件之外,还需要管理复杂性。这将是考虑将文件存储在数据库中的原因,我会说。

  5. 数据库中的Blob数据通常是不透明的。你不能过滤它,按它排序或按它分组。这降低了将其存储在数据库中的价值。

  6. 另一方面,数据库理解并发性。您可以使用标准的事务隔离模型来确保两个客户端不会同时尝试编辑同一个文件。这可能很好。不是说你不能使用锁定文件,但现在你有两件事要理解,而不是一件。

  7. 辅助功能。文件系统中的文件可以使用常规工具打开。 Vi,Photoshop,Word,无论你需要什么。这可能很方便。你怎么打开blob字段中的word文档?

  8. 权限。文件系统有权限,它们可能是后面的痛苦。相反,它们可能对您的应用程序有用。如果你利用7权限,权限将会真的让你感到困扰,因为它几乎可以确保你的web服务器以不同于你的应用程序的权限运行。

  9. 缓存(来自下面的sarah mei)。这会在客户端扮演上面的http问题(你会记得正确设置生命期吗?)。在服务器端文件系统上的文件是一个非常好理解和优化的访问模式。大数据块字段可能会或可能不会被您的数据库优化,并且您几乎可以保证从数据库到Web服务器也有额外的网络访问。

总之,人们往往使用的文件系统的文件,因为它们支持类文件成语的最好。没有理由你必须这样做,而且文件系统变得越来越像数据库,所以最终看到完全收敛并不会让我感到意外。

+0

谢谢,Erik。这是一个非常有用和全面的答复。 – 2009-04-10 17:00:48

+0

7.你的意思是直接在服务器上工作吗?作为一个文件,我也下载它之前打开它在Photoshop中。或者我的版本控制系统会为我做到这一点。 – Luc 2013-01-24 01:30:05

+0

将事物存储在未复制的本地文件系统中经常会破坏12个因子风格的应用程序,这使得缩放中等或更好的应用程序成为问题。将附件存储在S3/CloudFront或类似的克隆后端是大多数(但不是全部)用例的选择。 CarrierWave,Paperclip等可以帮助抽象出这些差异。 – Barry 2014-12-18 07:10:45

2

Erik的回答非常好。我还补充说,如果你想做任何缓存,缓存静态文件要比缓存数据库内容容易和简单。

0

如果您使用插件如Paperclip,则不必担心任何事情。有一个叫做文件系统的东西,这是文件应该放在哪里。仅仅因为它有点困难并不意味着你应该把你的文件放在错误的地方。用回形针(或其他类似的插件)并不难。所以,gogo文件系统!

+1

如何确保只有合适的用户才能看到/访问这些文件 - 回形针是否处理此问题? – Greg 2009-09-24 06:51:53

6

关于使用文件系统的文件有一些很好的建议,但这里还有其他值得思考的东西。如果您要存储敏感或安全的文件/附件,使用数据库确实是唯一的出路。我已经构建了无法将数据放在文件上的应用程序。出于安全原因,它必须放入数据库。您无法将其保留在服务器/机器上的用户的文件系统中,以便在没有适当的安全措施的情况下查看或携带它们。使用像Oracle这样的高级数据库,您可以非常紧密地锁定该数据,并确保只有合适的用户才能访问该数据。

但是提出的其他观点非常有效。如果您只是在做像头像或非敏感信息的事情,那么对于大多数插件系统来说,文件系统通常更快,更方便。

数据库很容易设置发回文件;这是多一点工作,但只要几分钟,如果你知道你在做什么。所以是的,文件系统是最好的方法,海事组织,但数据库是唯一可行的选择,当安全或敏感数据是一个主要关切。

1

我没有看到blobstores的问题是什么。您可以随时从中重建文件系统存储,例如通过在系统正在使用时将东西缓存到本地Web服务器。 但权威商店应该始终是数据库。这意味着您可以通过在数据库中扔掉并从源代码控制中导出代码来部署应用程序。完成。 添加Web服务器完全没有问题。

相关问题