Sql数据库分析,文件应该去哪里?

时间:2014-04-04 15:11:00

标签: sql-server database file database-design file-io

我正在分析一个具有常规会计操作和数据以及客户关系管理(CRM)的系统。在系统的CRM部分,我们记录客户'打电话并将它们保存在某处,我们可以节省客户的费用。图片,徽标,签名,扫描文档等。所以我们应该处理各种文件(声音,图像,pdf,word文档等)

我需要帮助决定保存文件的位置。

在旧系统中,我们将文件保存在硬盘驱动器空间并保存到数据库的路径,并在需要时使用它来打开文件地址。我认为(如果我错了,请纠正我)这不是一个很好的解决方案,因为:

将文件保存在硬盘上
  1. 我们失去了数据完整性。文件名可能因任何原因而被更改(重命名,移动,删除,覆盖),从而导致数据库中的路径错误。

  2. 移动整个数据(移动服务器)将是一个耗时的过程,让我们说我们有1,000,000个文件完全达到20 GB。如果我想将一百万个文件从一台计算机移动到另一台计算机,假设我的PC确实容忍它并且不燃烧,则移动文件需要很长时间(复制大量小文件的I / O时间超过复制一个大文件)但移动一个20 GB数据的文件(数据库文件)要快得多。

  3. 与复制文件相比,在数据库中备份数据更容易。使用完全备份和差异备份,我们可以立即备份正确的数据部分,我们也可以为我们定期安排。

  4. 也许是其他原因......


    我的问题在这里。

    • 是否在db中存储文件并增加db感染常规db操作?像选择,更新,查询表等。我的意思是,如果我将文件(CRM数据)存储在同一个数据库(如会计数据)中,我的会计系统会变慢吗?

    • 我应该在哪里保存文件?在普通的桌子上?或者我应该将数据库分成两个文件?一个用于典型数据,一个用于文件?

    • Sql Server 2012是否有空间限制?如果我的db文件部分增长,例如达到500 GB(假设磁盘驱动器有足够的空间),Sql Server是否会处理它?

    • 使用数据库存储文件有什么缺点?我刚刚谈到了Pros,可能还有Cons。如果有,他们是什么?

2 个答案:

答案 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进行事务管理。因此,您可以充分利用这两个方面 - 完整性,统一安全性和管理性,易于编程访问,甚至性能。