一般来说,与文件系统相比,将文件存储在数据库(特别是 mssql)中对性能的影响有多大?除了应用程序可移植性之外,我想不出我想将我的文件作为 varbinaries 存储在 SQL Server 中的原因。
10 回答
看看这个答案:
从本质上讲,空间和性能影响可能相当大,具体取决于用户数量。另外,请记住,Web 服务器很便宜,您可以轻松添加更多来平衡负载,而数据库通常是 Web 架构中最昂贵且最难扩展的部分。
有一些相反的例子(例如,Microsoft Sharepoint),但通常,将文件存储在数据库中并不是一个好主意。
除非您可能编写桌面应用程序和/或大致知道您将拥有多少用户,但是在像公共网站这样随机且出乎意料的东西上,您可能会为在数据库中存储文件付出高昂的代价。
如果您可以迁移到 SQL Server 2008,则可以利用 FILESTREAM 支持,它可以为您提供两全其美的优势 - 文件存储在文件系统中,但数据库集成比仅将文件路径存储在 varchar 字段中要好得多。您的查询可以返回一个标准的 .NET 文件流,这使得集成更加简单。
我会说,这取决于你的情况。例如,我在当地政府工作,我们有很多照片,比如面部照片等。我们的用户数量并不多,但我们需要对数据进行良好的安全性和审计。数据库对我们来说是一个更好的解决方案,因为它使这更容易,而且我们不会遇到扩展问题。
这里有什么问题?
现代 DBMS SQL2008 有多种处理 BLOB 的方法,而不仅仅是将它们粘在表中。当然,有利也有弊,您可能需要更深入地考虑它。
这是一篇有趣的论文,作者是已故的(?)吉姆·格雷
根据我自己的经验,将文件存储为文件总是更好。原因是文件系统针对文件存储进行了优化,而数据库则没有。当然,也有一些例外(例如,广受赞誉的下一代 MS 文件系统应该建立在 SQL 服务器之上),但总的来说这是我的规则。
虽然性能是一个问题,但我认为现代数据库设计已使其不再是小文件的问题。
除了性能之外,它还取决于数据的紧密耦合程度。如果文件包含与数据库字段密切相关的数据,那么它在概念上属于靠近它并且可能存储在 blob 中。如果它包含可能与多条记录相关的信息,或者可能在数据库上下文之外有一些用途,那么它就属于外部。例如,网页上的图像是从链接到它的页面的单独请求中获取的,因此它可能属于外部(取决于特定的设计和安全考虑)。
我们的妥协,我不保证它是最好的,是在数据库中存储小的 XML 文件,但在它之外存储图像和其他文件。
我们决定将http://www.freshlogicstudios.com/Products/Folders/存储为 varbinary 以预期性能问题。我可以说我们对它的效果感到惊喜。
我同意@ZombieSheep。还有一件事——我通常认为数据库实际上不需要是可移植的,因为您错过了 DBMS 供应商提供的所有功能。我认为迁移到另一个数据库将是人们会考虑的最后一件事。只是我的 $.02
必须将 blob(图像)解析为字节数组,然后以正确的文件名将其写入磁盘然后读取它的开销足以阻止您过于频繁地执行此操作,特别是如果文件是相当大。
不要含糊其词,但我认为您将存储的“文件”类型是最大的决定因素之一。如果您实质上谈论可以存储为文件的大型文本字段,那么我的首选将是数据库存储。