Loading AI tools
来自维基百科,自由的百科全书
WinFS(全名为Windows Future Storage)[1]是以关系数据库为基础之资料存储与管理系统的代号名称,它由微软开发,在2003年首次用于Windows中的高级存储子系统,它针对结构化、半结构化与未结构化资料的保存与管理用途而设计。WinFS包含可用于存储信息的关系数据库,而且可存储任何类型的资料,前提是数据类型已有完整定义的结构描述。接着,便可透过关系来创建个别资料项目之间的关系,这样系统便可根据特定属性作引用,用户也可明确地描述属性作引用。此外,因资料具完整定义的结构描述,任何应用程序均可重复使用资料;而且透过使用关系,可有效率地组织与截取相关资料。因系统知道信息的结构与用途,故可作复杂的查询,以达成资料的高级搜索,并透过探索资料项目之间的关系来汇整各种不同的资料项目。
WinFS与其共享类型结构描述可让应用程序识别不同的数据类型,但仍需撰写应用程序以转译不同的数据类型。因此,WinFS并不适合用来开发可查看或编辑所有数据类型的单一应用程序;其目的是让应用程序能了解所有资料的结构并截取信息以作进一步处理。在2003专业开发人员大会,微软首度介绍WinFS,并发布了视频演示稿,名为IWish[2],此视频演示稿提供的原型接口显示应用程序如何公开接口以得益于统一类型系统。视频中展示的概念包含应用程序如何使用资料项目之间的关系来动态筛选选项,及应用程序如何将多个相关资料组成组群并以统一方式呈现资料。
WinFS是众多“Longhorn”技术的基础,而且将包含在下一版本的Windows中。原本WinFS应在Windows Vista发行后提供,但相关项目在2006年6月搁置,然而其某些组件技术已集成到即将发行的ADO.NET与Microsoft SQL Server[3]。某些评论家指WinFS项目已完成,但史蒂夫·鲍尔默在2006年11月曾公开称WinFS仍在开发,至于此技术将以何种方式提供仍未知[4]。
许多常见操作系统中的文件系统(包括近年众多Windows 版本中使用的NTFS)都将文件与其他对象存储为比特流,且这些文件系统对文件中所存资料内容通常并不知道。此类文件系统也只有一种组织文件的方式(具体而言是透过目录与文件名称)[5][6]。
因文件系统完全不知其所存资料[5],应用程序常使用本身的文件格式(通常为专属格式)。这阻碍在多个应用程序之间共享的资料。创建可处理来自多种文件类型之信息的应用程序变得很困难,因程序员须了解所有文件的结构与语义[7]。使用常见文件格式是解决此问题的暂时方案,但非治本;因无法确保所有应用程序都会使用预期的格式。具有标准化结构描述的资料(例如,XML文件与关系式资料)无此问题,因为它们具有标准化的结构与执行阶段需求[8]。
此外,传统文件系统只能根据文件名称来截取与搜索资料,因为它对资料所知的范围仅限于用存储资料之文件名称[7]。较好的解决方案是使用属性为文件加上标记(tag),此处所谓的属性可描述文件内容。属性是有关文件的中继资料,如文件类型(例如:文件、图片、音乐、创建者等)[5]。这样可让系统依属性(而非使用文件夹层次结构)来搜索文件(例如:查找“包含人员X的图片”)。文件系统本身即可识别属性,或透过某些延伸模块来识别属性[5]。桌面搜索应用程序进一步采用此概念。它们会从文件截取资料(包含属性)并为文件编制索引。为了截取资料,它们为每种文件格式使用一个筛选器。这样就可依文件属性与文件中所包含的资料来搜索文件[5]。
但是,这仍不足以协助管理相关资料,因为不同的项目之间并未定义任何关系(例如:无法搜索“住在墨西哥阿卡波可市、在我的照片集中出现超过一百次、且我最近一个月曾经与其有过电子邮件往来的所有人员的电话号码”)。若要完成这种搜索,必须要一种同时定义语义与资料关系的资料模型[5][6]。WinFS的目的是提供这样的资料模型与执行阶段基础结构,以便存储资料与资料项目之间的关系(根据资料模型),同时以尽量不影响性能的方式完成此动作。
WinFS可识别各种类型的资料,例如:图片、电子邮件、文件、音频、视频、日历、联系人等;不像文件系统只能识别比特流。由系统存储与管理的资料是WinFS执行阶段所识别之数据类型的执行个体。数据结构的基础是属性。例如,履历类型的执行个体将透过公开特定属性(例如姓名、教育程度、工作经验等)来描述资料。属性的类型可能是字符串、整数或日期等简单类型,或联系人之类的复杂类型[7][9]。不同的数据类型会公开不同的属性。此外,WinFS也允许不同的资料执行个体与彼此关系,例如您可以利用作者关系来创建文件与联系人之间的关系[6][9]。关系也会公开为属性,例如若文件是透过创建者关系与联系人关系,则文件将具有创建者属性。当文件被访问时,系统会侦测到该关系并传回相关资料[9]。借由依循该关系即可截取所有相关资料[6]。
WinFS透过让所有应用程序访问数据类型与其结构描述的方式来达成应用程序之间的资料共享[7]。因此当任何应用程序想要使用WinFS类型时,可以使用结构描述来了解资料的结构,并有效利用信息。因此,即使开发人员并未撰写分析器来识别不同的资料格式,应用程序也可以访问系统上的所有资料。它也可以使用关系与相关资料来创建动态筛选器,以不同的方式呈现应用程序所处理的信息。WinFS API进一步将资料的访问工作抽象化。所有WinFS类型都公开为.NET 对象,而对象的属性则直接对应到数据类型的属性[5]。此外,透过让处理相同资料的不同应用程序共享相同的WinFS资料执行个体,而非将相同的资料存储为不同的文件格式,系统管理员便不需要在资料发生变更时同步不同的存放区[10]。因此WinFS可协助避免资料重复存储的情形[5][8]。
透过访问系统中所有资料的能力,您可以创建复杂的搜索来查找由WinFS所管理之所有资料项目中的资料。在上述示例(“住在墨西哥阿卡波可市、在我的照片集中出现超过一百次、且我最近一个月曾经与其有过电子邮件往来的所有人员的电话号码”)中,WinFS可以周游所有照片的主体关系以查找联系人项目。同样地,它也可以筛选最近一个月的电子邮件并访问通信对象关系以与联系人联系。接着,系统便可以从上述两个搜索结果中找出适当的联系人,并透过访问联系人项目的适当属性来截取其电话号码。
除了完全语义化的资料(如同XML与关系式资料)之外,WinFS也支持半结构化资料(例如影像,影像具有未结构化的比特资料流与结构化的中继资料)以及未结构化资料(例如文件)。它可将未结构化的组件直接存储为文件,同时将结构化的中继资料存储在结构化的存放区中[9]。WinFS在内部使用关系数据库来管理资料。但是,它不会将资料限制为属于任何特定资料模型,例如关系式或层次结构式,而且它可以是任何已完整定义的结构描述。WinFS执行阶段会将结构描述对应到关系式特征(modality)[5],方式是定义将存储类型的资料表,以及重新呈现关系时所需的主索引键与外部索引键。WinFS默认包含对象与XML结构描述的对应;至于其他结构描述的对应,则必须另行指定。对象结构描述是使用XML来指定;WinFS会产生脚本以将结构描述公开为.NET 类别。您可以使用ADO.NET直接指定关系式结构描述,虽然您必须提供对象结构描述的对应以将它以类别方式公开[9]。所有关系周游动作都是在这些资料表上以Joins方式执行。WinFS也会自动在这些资料表上创建索引,以便应用程序可以更快速地访问信息[9]。索引可大幅加快Joins的速度,因此周游关系以截取相关资料的动作非常快。搜索信息时也会使用索引;搜索与查询会使用索引,因此操作可以快速完成,这跟桌面搜索软件很类似。
![]() | 此条目需要更新。 (2020年9月23日) |
WinFS的开发是1990年代早期项目之功能的延续,此功能称为对象文件系统(Object File System,简称OFS),它原本应该包含在Cairo项目中。OFS被认为应该具有强大的资料汇整功能[11]。但Cairo项目当时遭搁置,因此OFS也被延宕。但是,稍后在开发COM时,规划了一个称为Storage+(以后来发行的SQL Server 8.0为基础)的存储系统,Storage+预期应提供类似的汇整功能[11]。但是,这项项目也没有实现,而类似的技术关系式文件系统(Relational File System,RFS)据信将在SQL Server 2000中提供[11]。但是,SQL Server 2000最后只是对于SQL Server 7.0进行些许更新,但并未实现RFS。
但此概念从未被忘却[11]。因此才有WinFS的出现。WinFS原本预计包含在Windows Vista中[13],以及后来代号名称为“Longhorn”的Windows Vista 组建4051(此版本在2003年的微软专业开发者大会公开发布),但当时WinFS有严重的性能问题[11]。在2004年8月,微软宣布WinFS将不会内置于Windows Vista;而是会在Vista正式发行后以可下载的更新方式提供[11]。
在2005年8月29日,微软悄悄地将WinFS Beta 1提供给MSDN订户。该版本可以在Windows XP运行,而且需要.NET Framework才能执行。WinFS API包含在“System.Storage”命名空间中[11][14]。该Beta版本在2005年12月1日更新,以与.NET Framework 2.0兼容[15]。WinFS Beta 2预计在2006年末推出[16],而且预期会与Windows桌面搜索集成,因此搜索结果会包含来自一般文件与WinFS存放区的结果;此外,您可以使用ADO.NET来访问WinFS资料[17] 。
但是,在2006年6月23日,微软的WinFS团队宣布将不再以独立产品方式提供WinFS[3],而且某些组件将以其他技术提供 - 例如对象关系映射组件至ADO.NET Entity Framework;支持未结构化资料、操作的无管理模式、透过FILESTREAM数据类型支持文件系统对象,以及SQL Server 2008(代号名称为“Katmai”)中的层次结构式资料[18][19],以及与Win32API及Windows Shell集成,以及在未来的Microsoft SQL Server版本中透过周游关系以支持层次结构的周游[18];以及将组件同步到Microsoft Sync Framework[18]。但是尚未排除在Windows的未来版本中内置WinFS的情况[18]。
微软宣布此消息之后,大部分评论分析家均认为WinFS项目已遭放弃。但在2006年11月,鲍尔默在一场会议中帮助WinFS仍在开发中,但要等到技术成熟时才会集成到Windows代码基础。2006年12月,比尔盖茨的会议证实此消息,而且微软项目移植Windows Media Player、Windows Photo Gallery、Microsoft Outlook等应用程序以使用WinFS做为资料存储后端[20]。
2013年,比尔盖茨称WinFS项目的搁置是他对微软最大的失望,并且认为WinFS已经超越了时代[21]。
WinFS不是实例文件系统;相反,它在NTFS文件系统之上提供系统化的资料模型建构能力。它仍使用NTFS在实例文件中存储其资料[11]。WinFS使用从SQL Server 2005[22]派生的关系式引擎来提供资料关系机制。WinFS存放区仅是已设置FILESTREAM属性的SQL Server数据库(.MDF)文件[23]。这些文件是存储在卷根目录下名为“System Volume Information”的文件夹(此文件夹具有限制的访问权)下的"WinFS"子文件夹中,其名称为这些存放区的GUID。[23]
WinFS 堆栈的底层是WinFS Core,它会与文件系统交互并提供文件访问与寻址能力[7]。关系式引擎使用WinFS核心服务来提供结构化的存放区与其他服务(例如:锁定将使用哪个WinFS执行阶段来实现该功能。WinFS执行阶段会公开服务(例如:同步处理与规则),其可用于同步处理WinFS存放区或在发生特定事件时执行特定动作[7]。
WinFS是以服务的方式执行,此服务会执行三个进程[24] - 装载关系式资料存放区的WinFS.exe、装载索引编制与查询引擎的WinFSSearch.exe以及与底层文件系统交互的WinFPM.exe (WinFS File Promotion Manager)。您可以利用一组.NET Framework API来撰写程序以访问其功能,这些.NET Framework API可让应用程序定义自定义资料类型、定义资料之间的关系、存储与截取信息,以及实现高级搜索[5][7]。接着应用程序可以汇整资料,并将资料呈现给用户。
WinFS将资料存储在关系式存放区中,这些存放区会公开为虚拟位置,称为“存放区”[11]。WinFS存放区是通用存放库,任何应用程序都可以在其中存储资料,以及中继资料、资料关系与结构描述。WinFS执行阶段本身可以应用特定的资料关系;例如,若图片的“subject”属性与联系人的“name”属性相同,则WinFS可以在该联系人与该图片之间创建关系[25]。资料之间的关系也可以由其他应用程序或用户指定[26] 。
WinFS提供一致性的存放区,但无法定义将存储于存放区之资料的格式。但是,它支持以应用程序支持的特定格式写入资料。前提是应用程序必须提供结构描述,以定义解译文件格式的方式[5]。例如,您可以新增结构描述以让WinFS知道如何读取(甚至是进一步搜索或分析)特定文件格式,例如PDF文件。透过使用结构描述,任何应用程序都可以读取由其他应用程序所创建的资料,而且不同的应用程序也可以透过共享结构描述以其他应用程序支持的格式来写入资料[26]。
您可以在一部电脑上创建多个WinFS存放区[26]。这样可以独立存储不同类别的资料,例如,您可以将公司文件与私人文件存储在不同的存放区中。根据默认,WinFS只提供一个存放区,其名称为“DefaultStore”[11]。WinFS存放区是公开为壳层(shell)对象(类似虚拟文件夹),此对象会动态产生存放区中的项目菜单,并以文件夹查看方式呈现这些项目。利用壳层对象也可以搜索资料存放区中的信息[11]。
资料单位是以WinFS项目的方式存储在WinFS存放区中[5][26]。WinFS项目与核心资料项目亦包含资料项目与其他资料之关系的信息。此“关系”是以逻辑链接的方式存储。链接指的是目前的项目与哪些资料项目关系。换句话说,链接是用以指定资料与其他资料项目的关系。链接实例上是以链接标识符来存储,此标识符指定资料关系的名称与用途,例如,“所属类型”或“组成要素”[5]。链接标识符是存储为资料项目的属性(attribute)。具有相同链接标识符的所有对象将被视为相关对象[5]。您必须事先将XML结构描述(定义将存储在WinFS中之资料项目的结构)提供给WinFS执行阶段[5]。在WinFS的Beta 1版本中,您必须先将结构描述组件新增到GAC,才能开始使用结构描述。
WinFS模型资料会使用资料项目、其关系、延伸(extension)与规则来规范其使用方式[7]。WinFS必须知道资料项目的类型与结构,才能将资料项目中存储的信息提供给要求该信息的应用程序。这是透过使用结构描述来完成。对于即将存储在WinFS中的每种资料项目类型,您必须提供对应的结构描述,以定义资料的类型、结构与关系。这些结构描述是使用XML来定义[5]。
预先定义的WinFS结构描述不仅包含文件、电子邮件、约会、工作、媒体、音频、视频等的结构描述;也包含系统结构描述,其中包括配置、程序与其他系统相关资料[7]。如果要让应用程序在WinFS中存储资料,但不想与其他应用程序共享该资料的结构,或这些资料可跨系统提供,则可以针对个别应用程序定义自定义结构描述[7]。
文件系统与WinFS之间最大的差异在于WinFS知道其所存储之每个资料项目的类型。类型会指定资料项目的属性(property)。WinFS类型系统与.NET Framework的类别与继承概念紧密关系。透过延伸与嵌套化任何预先定义的类型,即可创建新类型[5]。
WinFS提供四种预先定义的基础类型– Items、Relationships、ScalarTypes与NestedTypes[5]。Item是可存储的基础资料对象,而Relationship则是两个资料项目之间的关系或链接。因为所有WinFS项目都必须具有类型,存储之项目的类型会定义其属性(property)。Item的属性可以是ScalarType(定义属性可包含之信息的最小单位)或NestedType(多个ScalarTypes和/或NestedTypes的集合)。所有WinFS类型都以.NET CLR 类别的方式提供[26]。
任何以资料单位(例如:联系人、影像、视频或文件等)所代表的对象都可以存储在WinFS存放区中做为Item类型的特殊项[26]。根据默认,WinFS为文件、联系人、文件、图片、音频、视频、联系人与邮件提供Item类型。文件Item可以存储任何一般资料,这在文件系统中是存储为文件。但除非为文件提供高级结构描述(透过将它定义为特殊化的Item),WinFS将无法访问其资料。此类文件Item仅能支持与其他Item相关系[5]。
开发人员可以扩展这些类型或基础类型Item,以为其自定义资料提供类型。Item中包含的资料是以属性或实际存储资料的字段来定义。例如,联系人Item可能包含类型为ScalarType的Name字段,以及类型为NestedType(进一步由两个ScalarType组成)的Address字段。为定义此类型,会扩展基类Item,而且会新增必要字段至该类别[5]。NestedType字段可定义为包含两个ScalarType字段的另一个类别。一旦定义类型,就必须定义结构描述以表示每个字段的原始类型,例如Name字段的类型是String、Address字段是自定义的Address类别,每个字段的类型都是String。WinFS支持的其他原始类型包括Integer、Byte、Decimal、Float、Double、Boolean与DateTime等[5]。结构描述也会定义哪些字段为必要字段,哪些字段为选用字段[27]。系统会使用以此方式定义的联系人Item来存储有关联系人的信息,方式是填入属性字段并予以存储。首次存储时只需要填入标示为必要的字段。[26]其他字段可在稍后由用户填入,或完全不填入。若需要新增多个字段(例如:“上次交谈日期”),只要视需要简单地扩展此类型即可。您可以使用相同的方式定义其他资料的Item类型。
WinFS会为所有已定义的Item创建资料表[27]。为Item定义的所有字段会构成资料表的资料栏,而每个对应Item的Item实例则会存储为资料表的资料列。当资料表中的某些字段引用某些其他资料表中的资料时,即表示这些资料表之间有特定的关系存在。关系的结构描述会指定相关的资料表有哪些,以及关系的种类与名称。WinFS执行阶段负责管理关系结构描述[26]。所有Item都会公开为.NET CLR 对象,此对象具有统一的接口,可让应用程序易用性字段中存储的资料。因此,任何应用程序都可以截取具有任何Item类型的对象,而且可以使用该对象中的资料,而不需要了解字段中存储之资料的实际结构[5]。
WinFS类型是公开为.NET类别,它可以具现化为.NET对象。透过设置属性即可在这些类型中存储资料。完成之后,它们变会永久存储至WinFS存放区。使用ItemContext类别即可访问WinFS存放区。ItemContext允许以交易式方式访问WinFS存放区,例如,从将ItemContext对象绑定到存放区到因为全部成功而关闭或所有变更都已撤销。当资料发生变更时,它们不会写入到磁盘;而是会写入到存储器内的记录。只有当连线关闭时,变更才会以批量方式写入磁盘。这样可协助优化磁盘I/O[9]。下列代码片段会创建联系人并存储在WinFS存放区中。
//Connect to the default WinFS store
using(ItemContext ic = ItemContext.Open())
{
//Create the contact and set the data in appropriate properties
ContactEAddress contact = new ContactEAddress();
//Name is a ComplexType
contact.Name = new PersonName();
contact.Name.Displayname = "Doe, John";
contact.Name.FirstName = "John";
contact.Name.LastName = "Doe";
//Telephone number is a ComplexType
contact.TelephoneNumber = new TelephoneNumber(); //ComplexType
contact.TelephoneNumber.Country = CountryCode.Antarctica;
contact.TelephoneNumber.Areacode = 4567;
contact.TelephoneNumber.Number = 9876543210;
//Age is a SimpleType
contact.Age = 111;
//Add the object to the user's personal folder.
//This relates the item with the Folder pseudo-type, for backward
//compatibility, as this lets the item to be accessed in a folder
//hierarchy for apps which are not WinFS native.
Folder containingFolder = UserDataFolder.FindMyPersonalFolder();
containingFolder.OutFolderMemberRelationship.AddItem(ic, contact);
//Find a document and relate with the document. Searching begins by creating an
//ItemSearcher object. Each WinFS type object contains a GetSearcher() method
//that generates an ItemSearcher object which searches documents of that type.
using(ItemSearcher searcher = Document.GetSearcher(ic))
{
Document d = searcher.Find(@"Title = 'Some Particular Document'");
d.OutAuthoringRelationship.AddItem(ic, contact);
}
//Since only one document is to be found, the ItemContext.FindOne() method
//could be used as well.
//Find a picture and relate with it
using(ItemSearcher searcher = Picture.GetSearcher(ic))
{
Picture p = searcher.Find(@"Occasion = 'Graduation' and Sequence = '3'");
p.OutSubjectRelationship.AddItem(ic, contact);
}
//Persist to the store and close the reference to the store
ic.Update();
ic.Close();
}
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.