转自 51CTO.com
【51CTO快译】
SQL Server的FILESTREAM(文件流)特性简化了基于文件的数据(如图像)和关系数据同步的过程。
几乎所有的应用程序都需要某种类型的数据集,至少在检索某些数据和在用户界面中显示时要用到,通常,应用程序会使用到结构化数据和非结构化数据,这样就引入了极大的挑战,你不得不在一个事务中创建、更新、删除和读取这些完全不同的数据类型,当结构化数据驻留在关系数据库中而非结构化数据却存储在文件系统中时,这个问题尤为严重。SQL Server 2008新的FILESTREAM(文件流)特性可以帮助解决这个问题,它让你可以将非结构化数据存储在文件系统中,但仍然保持了事务的完整性,本文探讨FILESTREAM(文件流)的特性和优点,以及如何运用它帮助你对非结构化数据进行更好地控制。
非结构化数据选项
在SQL Server 2005中,构建一个既依赖于结构化(关系)数据有依赖于非结构化(无关系)数据时,你有两个选择:
在数据库中存储结构化数据,在一个专用的存储中存储非结构化数据,如文件系统和文件服务器,虽然这种方法成本合算,但它引入了额外的复杂度,因为你需要跨关系和非关系系统管理事务的完整性。
将结构化数据和非结构化数据都存储在数据库中,多年以来,数据库一直都支持存储非关系数据,如二进制大对象,或BLOB,SQL Server称之为varbinary数据类型,虽然在数据库中存储这种数据是很方便的,但成本费用会更高,所需的磁盘空间更多,存储和检索时间更长,对应用程序的整体性能也会有负面影响。
在SQL Server 2008中,新的FILESTREAM(文件流)特性和varbinary列配合,你可以在服务器的文件系统上存储真实的数据,但可以在数据库上下文内管理和访问,这个特性让SQL Server不仅可以维护好数据库内记录的完整性,也能够维护好数据库记录和外部文件之间的完整性。因为这个特性是在现有的varbinary(max)数据类型之上实现的,开发人员可以轻易地用上这个特性,不用对应用程序的架构进行改动。
什么时候使用FILESTREAM(文件流)
在下列任一情景下你都可以考虑使用FILESTREAM(文件流):
当你存储平均大小不低于1MB的BLOB数据类型时。
当你需要更快、只读访问来自应用程序的数据时。
当你想直接从应用程序的中间层代码访问BLOB时。
当你需要为单个数据库事务在数据库中存储非关系数据和关系数据时。
启用FILESTREAM(文件流)
默认情况下,FILESTREAM(文件流)特性是被禁用了的,因此在使用之前,你必须按照下面的步骤配置服务器和数据库实例:
1、要启用服务器实例上的FILESTREAM(文件流),打开SQL Server配置管理器,在SQL Server服务上点击右键,然后点击打开,你会看到一串服务器,在你想要启用FILESTREAM(文件流)的SQL Server实例上点击右键,从右键菜单中选择“属性”,切换到FILESTREAM(文件流)标签,检查“为Transact-SQL访问启用FILESTREAM(文件流)”选项,参考图1 ,你也可以在这个标签页为文件I/O流访问启用FILESTREAM(文件流)。
图1 启用FILESTREAM(文件流)-在为数据库实例配置使用FILESTREAM(文件流)访问之前必须为想要的SQL Server实例启用FILESTREAM(文件流)
2、要为数据库实例启用FILESTREAM(文件流),执行系统存储过程sp_configure,并设置filestream_access_level参数的值为2,如下:
EXEC sp_configure filestream_access_level, 2 GO RECONFIGURE GO |
filestream_access_level参数有效的值包括:
◆ 0 在该实例上禁用FILESTREAM(文件流),这是默认值。
◆ 1 为Transact-SQL访问启用FILESTREAM(文件流)
◆ 2 为Transact-SQL和Win32流访问启用FILESTREAM(文件流)
完成服务器和数据库实例配置后,接下来是创建存储数据的真实数据库,因为FILESTREAM(文件流)是专门为存储在文件系统上的二进制数据创建的,使用CREATE DATABASE语句时,专门创建一个FILEGROUP标记为流:
CREATE DATABASE FILESTREAMExample |
接下来,创建一个表,将它的一个列指派为VARBINARY(MAX) FILESTREAM数据类型:
CREATE TABLE Product |
前面的表定义指定Picture列为varbinary(max)类型,并启用了FILESTREAM(文件流)属性,注意:凡是有FILESTREAM(文件流)列的表必须要包括一个非空唯一性ROWGUID列。
所有存储在Picture列中的二进制数据都不能通过文件系统访问,访问这个二进制数据的唯一方法是通过标准的CRUD (INSERT,UPDATE和 DELETE)SQL语句,下面的例子是向Product表中插入一行数据:
INSERT INTO Product VALUES(1, 'Bicycle', 0x00, default) |
插入的新行ProductID等于1,Name包括Bicycle,Picture列为NULL,RowGuid列包括一些默认的GUID值,现在你可以在.NET程序中检索这一行,当然也可以覆盖和扩展它的内容。