2008-08-12 127 views
76

一般来说,性能命中有多糟糕是将文件存储在数据库(特别是mssql)中而不是文件系统?我无法想出除了应用程序可移植性之外的原因,我想将我的文件作为varbinaries存储在SQL Server中。将文件存储在数据库中而不是文件系统?

回答

70

看一看这个答案:

Storing Images in DB - Yea or Nay?

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

有一些相反的例子(如微软的Sharepoint),但通常情况下,在数据库中存储的文件是不是一个好主意。除非可能你编写桌面应用程序和/或大概知道你将拥有多少用户,但是对于像公共网站那样的随机和不可预知的东西,你可能会为在数据库中存储文件付出高昂的代价。

3

在我自己的经验,它始终是更好地存储文件的文件。原因是文件系统针对文件存储进行了优化,而数据库则没有。当然,也有一些例外(例如,预计下一代MS文件系统应该建立在SQL服务器之上),但通常这是我的规则。

1

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

1

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

+1

我没有看到任何地方提到这个“文件”需要写入磁盘并再次读取。 – 2009-09-28 07:35:08

+0

这是一个隐含的任务,当图像必须随后显示时,特别是以不同格式存储时,或者由于尺寸太大而无法在内存中保存很长时间的情况下。 – 2009-09-28 07:50:51

36

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

Getting Started with FILESTREAM Storage

+1

我在这里有一些保留。特别是事物的可伸缩性和可用性方面:如何控制这些“斑点”的存储位置? – 2009-09-28 07:37:45

22

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

0

不要模糊或任何东西,但我认为你将要存储的'文件'的类型是最重要的决定因素之一。如果你基本上谈论一个可以存储为文件的大型文本字段,那么我的首选项将用于数据库存储。

3

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

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

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

相关问题