(function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();

SQL Denali-FileTable

Categories: Denali, SQL
Comments: No Comments
Published on: 2011 年 05 月 02 日

Filetable是一个很有意思的一个功能。很久很久以前微软曾经想把Windows的文件系统放到SQL里面来管,这样就能将结构化和非结构化的数据整合在一个平台来管理,而且可以嵌入在Windows的内部来实现。在Windows Vista年代曾经有一个叫WinFS的原型,当然最后这个东西还是没有最终Release。在SQL Server 2008里面微软还是希望将数据的应用(包括非结构化数据)整合到数据库里面,毕竟之前已经做了Text和Image数据类型,而且在SQL 2005里面也有了Max的数据类型,基本上可以说快要准备好了,所以在SQL 2008里面提供了一个新的数据类型叫Filestream,这个数据类型就不多说了,没听过的就去Bing一下吧。我在这个SQL 2008里面也针对Filestream做了一个项目,利用了RBS的框架写了一套具有负载均衡的RBS Provider,可以通过RBS为客户提供统一的数据访问接口,后面接上我的Provider就可以在SQL中管理Blob数据,当然数据是海量的,设计容量就要20TB。但是当时也觉得会有一些问题,其中最主要的还是在接口上。Filestream提供了Win32和TSQL这2中接口,但是对于应用程序来说必须针对Win32接口做特殊的处理,因为Win32接口处理文件的时候必须要先提供一个句柄,而这个句柄必须通过Filestream的特殊函数才可以获取,总之对于应用程序来说不是很友好。虽然可以通过RBS来进行扩展和包装,但是对于遗留应用来说除了重新写接口代码别无选择。

在Denali中(CTP2)里面,我终于看到了这个FileTable。FileTable是一种特殊的表,这个表有固定的列和索引,这个表的结构是不能修改的。其中存储了文件的基本信息和内容,当然内容列肯定是Filestream。和之前最大的变化是Denali在驱动层做了一些修改,将FileTable转换成一个通用的UNC路径,也就是说我们可以通过Windows Explorer来直接访问数据库里的这个表。这样一来对于现有的遗留应用程序来说就好多了,可以在不改变应用的前提下直接使用Filestream的特性,就像访问远程的共享目录一样,而文件的管理和备份直接在SQL里面完成,与应用程序数据也能完美的结合。

在FileTable上最适合的应用就是扩展的一些文件搜索应用了,例如Lucene。如果你觉得SQL的FTS不够强大(确实差一些,尤其是中文),就可以通过Lucene直接去读取FileTable,而且不需要在写特殊的代码,只需要配上分词就可以了。在SharePoint  2010里面已经提供了一个Filestream的RBS Provider,通过这个Provider可以将SharePoint的Blob数据写到数据库里面去(存储在文件系统上),只不过原始的Filestream对于应用来说是一个噩梦,用FileTable吧,改改配置文件就够了。

另外还要说一下,FileTable毕竟还是数据库,不是NTFS文件系统(你可以把它看成一个FAT32),一些NTFS支持的加密及压缩属性还是不支持的,至少是在文件系统的驱动上不支持。还有就是负载均衡,目前还有相应的解决方案,当然这个是可以进行二次开发的,如果我把之前的那个Provider改改就行了,且也非常简单。

No Comments - Leave a comment

Leave a comment


Welcome , today is 星期四, 2017 年 03 月 30 日