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


83

通常,将文件存储在数据库中(特别是mssql)而不是文件系统会对性能造成多大的影响?除了应用程序可移植性之外,我无法提出将我的文件作为varbinaries存储在SQL Server中的原因。

Answers:


77

看看这个答案:

在DB中存储图像-是或否?

本质上,空间和性能方面的影响可能很大,具体取决于用户数量。另外,请记住,Web服务器很便宜,您可以轻松添加更多服务器来平衡负载,而数据库通常是Web体系结构中最昂贵,最难扩展的部分。

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

除非您可能编写桌面应用程序和/或大致了解您将拥有多少用户,但是在像公共网站这样的随机且不可预期的情况下,您可能要为在数据库中存储文件付出高昂的代价。


36

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

FILESTREAM存储入门


1
我在这里有保留。特别是事物的可伸缩性和可用性方面:如何控制这些“斑点”的存储位置?
Dave Van den Eynde 09年

3
可伸缩性和可用性似乎经过了深思熟虑-请参阅此白皮书:msdn.microsoft.com/en-us/library/cc949109.aspx
Jon Galloway 2009年

2
一个需要注意的情况是,你必须使用集成的安全性(即Windows身份验证)连接到数据库时:blogs.msdn.com/b/psssql/archive/2008/04/10/...
斯文Grosen

22

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



3

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


3

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

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

我们的妥协(我不保证这是最好的)是将较小的XML文件存储在数据库中,但将图像和其他文件存储在数据库中。


您认为小文件还是大文件?
ubiquibacon


1

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


1

必须将Blob(图像)解析为字节数组,然后以适当的文件名将其写入磁盘,然后读取该文件的开销,足以使您不愿意再执行此操作,尤其是在文件相当大。


1
我看不到任何地方提到该“文件”需要写入磁盘并再次读取。
Dave Van den Eynde 09年

当必须随后显示图像时,这是一项隐含的任务,尤其是在存储格式不同或由于巨大的尺寸而无法在内存中长时间保存图像的情况下。
2009年

0

不要含糊其词,但我认为您要存储的“文件”类型是最大的决定因素之一。如果您实质上是在讨论可以存储为文件的大文本字段,那么我的首选是数据库存储。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.