WinFS(全名為Windows Future Storage)是以關聯式資料庫為基礎之資料儲存與管理系統的代號名稱,它由微软開發,在2003年首次用於Windows中的進階儲存子系統,它針對結構化、與的保存與管理用途而設計。WinFS包含可用於儲存資訊的關聯式資料庫,而且可儲存任何類型的資料,前提是資料類型已有完整定義的結構描述。接著,便可透過關係來建立個別資料項目之間的關聯,這樣系統便可根據特定屬性作參照,使用者也可明確地描述屬性作參照。此外,因資料具完整定義的結構描述,任何應用程式均可重複使用資料;而且透過使用關係,可有效率地組織與擷取相關資料。因系統知道資訊的結構與用途,故可作複雜的查詢,以達成資料的進階搜尋,並透過探索資料項目之間的關係來彙整各種不同的資料項目。
WinFS與其共用類型結構描述可讓應用程式識別不同的資料類型,但仍需撰寫應用程式以轉譯不同的資料類型。因此,WinFS並不適合用來開發可檢視或編輯所有資料類型的單一應用程式;其目的是讓應用程式能瞭解所有資料的結構並擷取資訊以作進一步處理。在2003專業開發人員大會,微软首度介紹WinFS,並發佈了視訊簡報,名為IWish,此視訊簡報提供的原型介面顯示應用程式如何公開介面以得益於統一類型系統。視訊中展示的概念包含應用程式如何使用資料項目之間的關係來動態篩選選項,及應用程式如何將多個相關資料組成群組並以統一方式呈現資料。
WinFS是眾多“Longhorn”技術的基礎,而且將包含在下一版本的Windows中。原本WinFS應在Windows Vista發行後提供,但相關計畫在2006年6月擱置,然而其某些元件技術已整合到即將發行的ADO.NET與Microsoft SQL Server。某些评论家指WinFS專案已完成,但史蒂夫·鲍尔默在2006年11月曾公開称WinFS仍在開發,至於此技術將以何種方式提供仍未知。
動機
許多常見作業系統中的檔案系統(包括近年眾多Windows 版本中使用的NTFS)都將檔案與其他物件儲存為位元流,且這些檔案系統對檔案中所存資料內容通常並不知道。此類檔案系統也只有一種組織檔案的方式(具體而言是透過目錄與檔案名稱)。
因檔案系統完全不知其所存資料。使用常見檔案格式是解決此問題的暫時方案,但非治本;因無法確保所有應用程式都會使用預期的格式。具有標準化結構描述的資料(例如,XML文件與關聯式資料)無此問題,因為它們具有標準化的結構與執行階段需求。
此外,傳統檔案系統只能根據檔案名稱來擷取與搜尋資料,因為它對資料所知的範圍僅限於用儲存資料之檔案名稱。不同的資料類型會公開不同的屬性。此外,WinFS也允許不同的資料執行個體與彼此關聯,例如您可以利用作者關係來建立文件與連絡人之間的關聯。因此WinFS可協助避免資料重複儲存的情形
| bar4-colour=#f4a460
| note4 = 功能縮減
| note4-at = 1999
| bar5-from=2000.5
| bar5-to=2002
| bar5-text=Outlook LIS。但Cairo專案當時遭擱置,因此OFS也被延宕。但是,稍後在開發COM時,規劃了一個稱為Storage+(以後來發行的SQL Server 8.0為基礎)的儲存系統,Storage+預期應提供類似的彙整功能,以及後來代號名稱為“Longhorn”的Windows Vista 組建4051(此版本在2003年的微软专业开发者大会公开发布),但當時WinFS有嚴重的效能問題。該Beta版本在2005年12月1日更新,以與.NET Framework 2.0相容。WinFS Beta 2預計在2006年末推出,而且預期會與Windows桌面搜尋整合,因此搜尋結果會包含來自一般檔案與WinFS存放區的結果;此外,您可以使用ADO.NET來存取WinFS資料 。
但是,在2006年6月23日,微软的WinFS團隊宣布將不再以獨立產品方式提供WinFS,以及與Win32API及Windows Shell整合,以及在未來的Microsoft SQL Server版本中透過周遊關係以支援階層的周遊。
2013年,比爾蓋茲称WinFS项目的擱置是他对微软最大的失望,并且认为WinFS已经超越了时代。
資料存放區
架構
WinFS不是實體檔案系統;相反,它在NTFS檔案系統之上提供系統化的資料模型建構能力。它仍使用NTFS在實體檔案中儲存其資料衍生的關聯式引擎來提供資料關係機制。WinFS存放區僅是已設定FILESTREAM屬性的SQL Server資料庫(.MDF)檔案。這些檔案是儲存在磁碟區根目錄下名為“System Volume Information”的資料夾(此資料夾具有限制的存取權)下的"WinFS"子資料夾中,其名稱為這些存放區的GUID。 - 裝載關聯式資料存放區的WinFS.exe、裝載索引編製與查詢引擎的WinFSSearch.exe以及與底層檔案系統互動的WinFPM.exe (WinFS File Promotion Manager)。您可以利用一組.NET Framework API來撰寫程式以存取其功能,這些.NET Framework API可讓應用程式定義自訂資料型別、定義資料之間的關係、儲存與擷取資訊,以及實作進階搜尋。資料之間的關係也可以由其他應用程式或使用者指定 。
WinFS提供一致性的存放區,但無法定義將儲存於存放區之資料的格式。但是,它支援以應用程式支援的特定格式寫入資料。前提是應用程式必須提供,以定義解譯檔案格式的方式。系統會使用以此方式定義的連絡人Item來儲存有關連絡人的資訊,方式是填入屬性欄位並予以儲存。首次儲存時只需要填入標示為必要的欄位。其他欄位可在稍後由使用者填入,或完全不填入。若需要新增多個欄位(例如:“上次交談日期”),只要視需要簡單地擴充此型別即可。您可以使用相同的方式定義其他資料的Item型別。
WinFS會為所有已定義的Item建立資料表。為Item定義的所有欄位會構成資料表的資料欄,而每個對應Item的Item實體則會儲存為資料表的資料列。當資料表中的某些欄位參照某些其他資料表中的資料時,即表示這些資料表之間有特定的關係存在。關係的結構描述會指定相關的資料表有哪些,以及關係的種類與名稱。WinFS執行階段負責管理關係結構描述。所有Item都會公開為.NET CLR 物件,此物件具有統一的介面,可讓應用程式輕鬆存取欄位中儲存的資料。因此,任何應用程式都可以擷取具有任何Item型別的物件,而且可以使用該物件中的資料,而不需要瞭解欄位中儲存之資料的實際結構。
WinFS型別是公開為.NET類別,它可以具現化為.NET物件。透過設定屬性即可在這些型別中儲存資料。完成之後,它們變會永久儲存至WinFS存放區。使用ItemContext類別即可存取WinFS存放區。ItemContext允許以交易式方式存取WinFS存放區,例如,從將ItemContext物件繫結到存放區到因為全部成功而關閉或所有變更都已復原。當資料發生變更時,它們不會寫入到磁碟;而是會寫入到記憶體內的記錄。只有當連線關閉時,變更才會以批次方式寫入磁碟。這樣可協助最佳化磁碟I/O。下列程式碼片段會建立連絡人並儲存在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();
}
參考文獻
參見
*微软磁盘文件系统
**FAT
**NTFS
**ReFS
- 關聯式資料庫管理系統
- ,GNOME桌面的儲存管理系統
- NEPOMUK
外部連結
- [https://web.archive.org/web/20100124145541/http://blogs.msdn.com/winfs/ WinFS Blog]
- [https://web.archive.org/web/20060602151743/http://msdn.microsoft.com/data/ref/winfs/ WinFS at the Microsoft Developer Network]
- [https://web.archive.org/web/20080118162558/http://channel9.msdn.com/Showforum.aspx?forumid=14&tagid=4 Channel 9 Videos]
- [https://web.archive.org/web/20070314165346/http://msdn.microsoft.com/newsgroups/default.aspx?dg=microsoft.public.windows.developer.winfx.winfs WinFS Newsgroup]
- [https://web.archive.org/web/20070702131752/http://www.winsupersite.com/showcase/winfs_preview.asp WinFS Beta 1 Review]
- [https://web.archive.org/web/20071225122555/http://www.netfxguide.com/guide/winfs.aspx WinFS area on NetFXGuide.com]
评论 (0)