将文件存储在数据库中而不是文件系统中?

时间:2008-08-12 15:20:26

标签: sql-server database filesystems storage

通常,性能损失有多糟糕的是将文件存储在数据库(特别是mssql)而不是文件系统中?我无法想出在应用程序可移植性之外的一个原因,我希望将我的文件存储为SQL Server中的varbinaries。

10 个答案:

答案 0 :(得分:75)

看看这个答案:

Storing Images in DB - Yea or Nay?

从本质上讲,空间和性能可能会非常大,具体取决于用户数量。此外,请记住,Web服务器很便宜,您可以轻松添加更多以平衡负载,而数据库通常是最昂贵且最难扩展的部分Web架构。

有一些相反的例子(例如,Microsoft Sharepoint),但通常,在数据库中存储文件不是一个好主意。

除非您可能编写桌面应用程序和/或大致知道您将拥有多少用户,但对于像公共网站那样随机且无法预料的内容,您可能需要付出高昂的代价才能在数据库中存储文件。

答案 1 :(得分:36)

如果您可以迁移到SQL Server 2008,您可以利用FILESTREAM支持,它可以为您提供最好的支持 - 文件存储在文件系统中,但数据库集成比仅存储文件路径要好得多。 varchar字段。您的查询可以返回标准的.NET文件流,这使得集成更加简单。

Getting Started with FILESTREAM Storage

答案 2 :(得分:22)

我会说,这取决于你的情况。例如,我在当地政府工作,我们有很多图像像面部照片等。我们没有大量的用户,但我们需要有良好的安全性和审计数据。数据库对我们来说是一个更好的解决方案,因为它使这更容易,我们不会遇到扩展问题。

答案 3 :(得分:6)

这里有什么问题?

现代DBMS SQL2008有多种处理BLOB的方法,这些方法不仅仅是在表格中。当然,有利有弊,您可能需要更深入地考虑它。

这是一篇有趣的论文,由已故的(?)Jim Gray

撰写

To BLOB or Not To BLOB: Large Object Storage in a Database or a Filesystem

答案 4 :(得分:3)

虽然性能是一个问题,但我认为现代数据库设计使小文件的问题更少。

除了性能之外,它还取决于数据的紧密耦合程度。如果文件包含与数据库字段密切相关的数据,则它在概念上属于它并且可以存储在blob中。如果它包含可能与多个记录相关的信息,或者可能在数据库的上下文之外有一些用途,则它属于外部。例如,网页上的图像是从链接到它的页面的单独请求中获取的,因此它可能属于外部(取决于具体的设计和安全考虑因素)。

我们的妥协,我不承诺它是最好的,一直是将小的XML文件存储在数据库中,但是图像和其他文件存储在它之外。

答案 5 :(得分:3)

根据我自己的经验,将文件存储为文件总是更好。原因是文件系统针对文件存储进行了优化,而数据库则没有。当然,也有一些例外(例如,备受推崇的下一代MS文件系统应该建立在SQL服务器之上),但总的来说这是我的规则。

答案 6 :(得分:2)

我们决定将http://www.freshlogicstudios.com/Products/Folders/存储为varbinary,期待性能问题。我可以说,我们对它的效果感到惊喜。

答案 7 :(得分:1)

我同意@ZombieSheep。 还有一件事 - 我通常不认为数据库实际上需要可移植,因为您错过了DBMS供应商提供的所有功能。我认为迁移到另一个数据库是人们会考虑的最后一件事。只是我的$ .02

答案 8 :(得分:1)

必须将blob(图像)解析为字节数组,然后以正确的文件名将其写入磁盘然后读取它的开销足以阻止您经常这样做,特别是如果文件相当大。

答案 9 :(得分:0)

不要含糊不清,但我认为你要存储的'档案'类型是最重要的决定因素之一。如果你基本上谈论一个可以存储为文件的大文本字段,我的偏好将是数据库存储。