在SQL Server 2008中存储非结构化数据
依赖于关系型数据和非关系型数据的应用程序通常使用下面三种架构之一:
数据库中的关系型数据以及文件系统和文件服务器上的非关系型二进制大对象(BLOB)。
数据库中的关系型数据和只用于BLOB的存储中的非关系型数据。
数据库中的关系型数据和非关系型数据。
每一种方法都有其优劣之处。例如,在文件服务器或只用于BLOB的存储中存储非结构化数据会降低每GB所花费的费用,但是通常会增加管理和建立应用程序的复杂性,因为应用程序不得不维护包含BLOB数据的数据库和单独系统中的记录以及这些记录所关联的对象间的完整性。另一方面,在数据库中存储BLOB数据方便地集中了数据存储,但是通常带来了更高的成本并会导致性能下降。
SQL Server 2008推出了两个用于存储BLOB数据的新功能:
FILESTREAM:可以在varbinary字段上设置的属性,以便将数据存储在文件系统中 (因此受益于它的快速流式功能和存储能力) 但数据是直接在数据库的上下文中管理和访问的。
远程BLOB存储:一个客户端应用程序编程接口(API),它降低了建立依赖于一个用于BLOB的外部存储和一个用于关系型数据的数据库的应用程序的复杂性。
此外,SQL Server 2008继续通过varbinary 数据库类型支持标准的BLOB字段。
SQL Server BLOB
SQL Server 2005推出了varbinary (max)数据类型,它使得你可以在一个SQL Server字段或变量中存储最大为2,147,483,647字节的大型二进制数据值。当使用修订过的max时,你可以通过设置large value types out of row表选项来控制数据怎样存储在物理的表的数据页面中。当这个选项设置为ON时,所有的值存储在单独的链接页面上,而在这个记录的数据页面上会保存一个指向这些页面的16位的根指针。当这个选项设置为OFF时,最大为8000字节的值存储在这行的数据页面上,而更大的值存储在单独的链接页面上。
尽管新的FILESTREAM 和远程BLOB能力是设计用来提供比标准的varbinaryBLOB字段更好的性能和可管理性,但有一些场景是使用varbinary 字段更适合的(具有代表性的是当BLOB平均规模小于250 KB的时候。)
FILESTREAM 属性
在SQL Server 2008中,你可以将FILESTREAM 属性应用到一个varbinary 字段,然后SQL Server 为这个字段在本地NTFS文件系统上存储数据。在文件系统上存储数据带来两个重大的优势:
性能可匹配文件系统的流性能。
BLOB 大小只受文件系统卷大小的限制。
然而,字段可以像SQL Server中的其它任何BLOB字段一样来管理,所以管理员可以使用SQL Server的可管理性和安全功能来集成BLOB数据管理和关系型数据库中的其它数据——而不需要单独管理文件系统数据。在SQL Server中将数据定义为一个FILESTREAM字段还确保了在数据库中的关系型数据和存储在文件系统中的非结构化数据在数据级的一致性。FILESTREAM字段的使用和BLOB字段一样,这意味着维护操作的完全集成 (例如备份和恢复)、SQL Server安全模型的完全集成、以及纯事务的支持。
应用程序开发人员可以通过两个编程模型中的一个来使用FILESTREAM数据;他们可以使用Transact-SQL就像对待标准的BLOB字段一样的来访问和操纵数据,或者他们可以使用Win32流式API和Transact-SQL事务型语义来确保一致性,这意味着他们可以对FILESTREAM BLOB使用标准的Win32读/写调用,这与他们在文件系统上对文件进行交互时所做的一样。
在SQL Server 2008中,FILESTREAM 字段只可以将数据存储在本地磁盘中,并且FILESTREAM 字段不支持像简单加密和以表为值的参数等功能。此外,尽管提供了支持日志传送功能,但你不能在数据库快照或数据库镜像会话中使用包含了FILESTREAM字段的表。
远程BLOB存储API
尽管FILESTREAM 属性将文件系统的性能和可扩展性与在数据库中存储BLOB的可管理性和数据一致性结合起来,但是通常会出现在EMC Centera、Fujitsu Nearline、Microsoft Windows®这样的文件服务器或其它任何只用于BLOB的存储的系统中存储BLOB更有效或成本利用率更高的情况。在SQL Server 2008中的远程BLOB存储API,通过提供一个基于提供商的架构,从而可以更容易的将只用于远程BLOB存储解决方案同数据库中的关系型数据集成起来,这个架构使你的应用程序可以使用任何BLOB存储而不需要特定的BLOB存储功能或代码。
在架构方面有两个关键部分:
客户端库:它是一个能够利用任何提供商来同你的BLOB以及关系型数据协同使用的组件。客户端应用程序使用客户端库和任何适用的提供商库来插入、更新和查询存储在BLOB中的数据和数据库中存储的数据。
供应商库:它是一个由BLOB存储供应商提供的具有代表性的组件(尽管它可以定制开发)。供应商库实现了一个常规接口,提供了一组标准的服务,这些服务抽象了对这个特定的存储执行Create、Fetch、Enumerate、Delete和Garbage Collect操作的细节。
当你的数据库BLOB需要存储在与数据库不同的服务器上并需要和其它系统协作时,远程BLOB存储API (Remote BLOB Store API)是一个理想的选择。它对BLOB存储没有任何限制。任何提供远程BLOB存储提供商的系统或任何可以建立于远程BLOB存储提供商的系统都支持它。因为与BLOB存储的交互细节被提供商库抽象出来了,所以你可以改变存储而不必改动应用程序,这带来了很大的好处并且降低了开发人员和管理员的复杂度。Microsoft与业内的所有存储供应商合作,以确保提供一个适当的供应商库用于远程BLOB存储API。
使用远程BLOB存储API使你能够灵活地使用不同的系统来管理关系型数据和非关系型数据。远程BLOB存储API通过链接级别的一致性维护了数据库中的记录与在外部存储的BLOB之间的一致性。例如,如果你通过一个删除语句从数据库中删除BLOB参照,系统将从存储中删除BLOB。然而,使用远程BLOB存储API不能提供随着BLOB直接存储到数据库中而来的数据级别的一致性,要做到这一点你需要使用FILESTREAM或者varbinary。
比较BLOB的存储选择
下表比较了SQL Server 2008中的BLOB数据的存储选项。
只使用文件服务器或者BLOB存储 SQL Server BLOB 远程BLOB存储API FILESTREAM 字段
快速流式性能 取决于文件存储 否 取决于BLOB存储 Yes
链接级一致性 是 是 是 是
数据级一致性 否 是 否 是
集成管理 否 是 否 是
使用远程Windows 文件服务器 n/a 否 是 这个版本中没有
与外部的BLOB存储协同工作 n/a 否 是 否
这些选项意味着SQL Server 2008为存储非结构化数据提供了一个最适合你的业务需求的灵活的解决方案。
通过SQL Server 2008管理非结构化数据
0
相关文章