将文件存储在文件系统上或在SQL Server中存储为varbinary(MAX) [英] Store file on file system or as varbinary(MAX) in SQL Server

查看:241
本文介绍了将文件存储在文件系统上或在SQL Server中存储为varbinary(MAX)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我了解将文件作为blob存储在数据库中是否是错误的做法,这引起了很多争议,但是我只是想了解在我的情况下这是否有意义.

I understand that there is a lot of controversy over whether it is bad practice to store files as blob's in a database, but I just want to understand whether this would make sense in my case.

我正在创建一个ASP.NET应用程序,该应用程序在一家大公司内部使用,用户需要在其中将文件附加到系统中的作业".这些文件通常是PDF或Word文档,可能永远不会超过几mb.

I am creating an ASP.NET application, used internally at a large company, where the users needs to be able to attach files to a 'job' in the system. These files are generally PDF's or Word documents, probably never exceeding a couple of mb.

我正在创建一个新表,如下所示:

I am creating a new table like so:

ID (int)
JobID (int)
FileDescription (nvarchar(250))
FileData (varbinary(MAX)

在这里使用varbinary(MAX)是理想的选择还是应该存储文件的路径并将其简单地存储在文件系统中的某个位置?

Is the use of varbinary(MAX) here ideal, or should I be storing the path to the file and simply storing the file on the file system somewhere?

推荐答案

Microsoft Research有一篇非常好的论文,名为

There's a really good paper by Microsoft Research called To Blob or Not To Blob.

经过大量性能测试和分析后,他们的结论是:

Their conclusion after a large number of performance tests and analysis is this:

  • 如果您的图片或文档通常小于256K,将它们存储在数据库VARBINARY列中会更有效

如果图片或文档的大小通常超过1 MB,则将它们存储在文件系统中的效率更高(并且使用SQL Server 2008的FILESTREAM属性,它们仍处于事务控制之下,并且属于数据库的一部分)

if your pictures or document are typically over 1 MB in size, storing them in the filesystem is more efficient (and with SQL Server 2008's FILESTREAM attribute, they're still under transactional control and part of the database)

在这两者之间,根据您的使用情况有些不同

in between those two, it's a bit of a toss-up depending on your use

如果您决定将图片放入SQL Server表中,我强烈建议使用一个单独的表来存储这些图片-不要将employee foto存储在employee表中-请将它们保存在单独的表中.这样,假设您并不需要总是选择员工图片作为查询的一部分,那么Employee表就可以保持精简,平均和高效.

If you decide to put your pictures into a SQL Server table, I would strongly recommend using a separate table for storing those pictures - do not store the employee foto in the employee table - keep them in a separate table. That way, the Employee table can stay lean and mean and very efficient, assuming you don't always need to select the employee foto, too, as part of your queries.

对于文件组,请查看文件和文件组体系结构以获取介绍.基本上,您可以从一开始就为大型数据结构使用单独的文件组创建数据库,或者稍后再添加其他文件组.我们称之为LARGE_DATA.

For filegroups, check out Files and Filegroup Architecture for an intro. Basically, you would either create your database with a separate filegroup for large data structures right from the beginning, or add an additional filegroup later. Let's call it LARGE_DATA.

现在,每当要创建一个需要存储VARCHAR(MAX)VARBINARY(MAX)列的新表时,都可以为大数据指定此文件组:

Now, whenever you have a new table to create which needs to store VARCHAR(MAX) or VARBINARY(MAX) columns, you can specify this file group for the large data:

 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简介,并试用它!

Check out the MSDN intro on filegroups, and play around with it!

这篇关于将文件存储在文件系统上或在SQL Server中存储为varbinary(MAX)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆