我正在分析一个具有常规会计操作和数据以及客户关系管理(CRM)的系统。在系统的CRM部分,我们记录客户'打电话并将它们保存在某处,我们可以节省客户的费用。图片,徽标,签名,扫描文档等。所以我们应该处理各种文件(声音,图像,pdf,word文档等)
我需要帮助决定保存文件的位置。
在旧系统中,我们将文件保存在硬盘驱动器空间并保存到数据库的路径,并在需要时使用它来打开文件地址。我认为(如果我错了,请纠正我)这不是一个很好的解决方案,因为:
将文件保存在硬盘上我们失去了数据完整性。文件名可能因任何原因而被更改(重命名,移动,删除,覆盖),从而导致数据库中的路径错误。
移动整个数据(移动服务器)将是一个耗时的过程,让我们说我们有1,000,000个文件完全达到20 GB。如果我想将一百万个文件从一台计算机移动到另一台计算机,假设我的PC确实容忍它并且不燃烧,则移动文件需要很长时间(复制大量小文件的I / O时间超过复制一个大文件)但移动一个20 GB数据的文件(数据库文件)要快得多。
与复制文件相比,在数据库中备份数据更容易。使用完全备份和差异备份,我们可以立即备份正确的数据部分,我们也可以为我们定期安排。
也许是其他原因......
我的问题在这里。
是否在db中存储文件并增加db感染常规db操作?像选择,更新,查询表等。我的意思是,如果我将文件(CRM数据)存储在同一个数据库(如会计数据)中,我的会计系统会变慢吗?
我应该在哪里保存文件?在普通的桌子上?或者我应该将数据库分成两个文件?一个用于典型数据,一个用于文件?
Sql Server 2012是否有空间限制?如果我的db文件部分增长,例如达到500 GB(假设磁盘驱动器有足够的空间),Sql Server是否会处理它?
使用数据库存储文件有什么缺点?我刚刚谈到了Pros,可能还有Cons。如果有,他们是什么?
答案 0 :(得分:2)
微软研究院发表了一篇名为To Blob or Not To Blob的非常好的论文。
经过大量的性能测试和分析后得出的结论是:
如果您的图片或文档的大小通常低于256K,则将它们存储在数据库VARBINARY
列中效率更高
如果您的图片或文档的大小通常超过1 MB,则将它们存储在文件系统中效率更高(并且使用SQL Server 2008的FILESTREAM
属性,它们仍然是在交易控制和数据库的一部分)
介于这两者之间,根据您的使用情况,这有点不合理
如果您决定将图片放入SQL Server表格,我强烈建议您使用单独的表格存储这些图片 - 不要将员工foto存储在员工表格中 - 将它们保存在单独的表格中。这样,员工表可以保持精简,平均且非常高效,假设您不总是需要选择员工foto,作为查询的一部分。
对于文件组,请查看Files and Filegroup Architecture以获取简介。基本上,您可以从一开始就为大型数据结构创建具有单独文件组的数据库,或者稍后添加其他文件组。我们称之为" LARGE_DATA"。
现在,只要您创建了一个需要存储VARCHAR(MAX)
或VARBINARY(MAX)
列的新表,就可以为大数据指定此文件组:
CREATE TABLE dbo.YourTable
(....... define the fields here ......)
ON Data -- the basic "Data" filegroup for the regular data
TEXTIMAGE_ON LARGE_DATA -- the filegroup for large chunks of data
查看文件组的MSDN简介,并使用它!
答案 1 :(得分:0)
我建议您检查SQL Server 2012中的FILETABLE功能:
http://technet.microsoft.com/en-us/library/ff929144.aspx
除非您通常处理的是非常小的文件,否则您可能会获得更好的性能。无论如何,我几乎总是交易一点性能。
使用FILETABLE,文件存储在文件系统中,但由SQL Server进行事务管理。因此,您可以充分利用这两个方面 - 完整性,统一安全性和管理性,易于编程访问,甚至性能。