电脑技术学习

抢先体验微软最新文件系统WINFS(二)

dn001

四.Relationships

在WinFS中,TYPE之间可以有关联(Relationship),Relationship创建在源类型的实例及目的类型的实例之间(源实例与目的实例可否是同一类型?)。源类型的实例是不可缺少的,一旦发现源类型的实例不存在,Relationship会立即被删除。但是目的类型的实例却可以缺少,这种缺少目的类型的实例的Relationship被称为“Dangling Relationship“。

对于一个Relationship来说,它也可以与Type那样拥有自己的Properties/Fields。举个例子,比如一个Contact与一个Message之间存在一个Participant的关系,而这个关系可以有一个nickname的属性。

在WinFS中,有两种Relationship,一种叫Holding Relationship,一种叫Reference Relationship。

1.Holding Relationship

在这种关系中,几个源实例可以拥有同一个目的实例,只要还有源实例存在,关系就存在。其还具有以下几个特点:

(1)每一个实例都必须要有一个以上的Holding Relationship指向它;

(2)具有Holding Relationship的实例间必须是处于同一个store中。(对于一个WinFS的Item来说,它完整的UNC名空间的形式是"machinestoresharefolder1folder2...folderNitem");

(3)源实例和目的实例必须同时存在,不能允许Dangling Relationship的存在。

(4)实例间的关系不能形成回路,构成一个有向非循环图(Directed acyclic graph,DAG)。

(5)Holding Relationship采用层次式的命名空间(如上所示),每一个这样的Relationship都会指明目标实例的名称,而每一个拥有这种Relationship的源实例的名字则必须唯一。

2.Reference Relationship

在这种关系中,可以允许存在Dangling Relationship,可以允许实例分布在同一个store或者不同的store中,实例间的关系可以形成回路。比如一个Document类型的实例用一个author的关系指向一个contact类型的实例,而这个contact类型的实例也可以用一个reviewer的关系指向Document类型的实例。

以上说的都是一些很理论性的东西,这时会想,以上说的内容是通过怎样的形式表现出来呢?在操作上,在编程上。

在defaultstore目录下有一个Schemas的目录,发现里面是一些Item,比如Audio、Contact、Mail等等,与上面所说的Type的名称相对应。再翻阅资料,发现WinFS有专门的基于XML语法的Schemas Definition Language。比如Contact类型有Contact.xml作为其类型定义。而Person的定义为

<Type Name="Person" MajorVersion="1" MinorVersion="0"
     ExtendsType="Core.Contact" ExtendsVersion="1">
<Field Name="BirthDate" Type="WinFSTypes.datetime"
     Nullable="true" TypeMajorVersion="1"></Field>
   <Field Name="PersonalNames" Type="Contact.FullName"
       Nullable="true" MultiValued="true"
       TypeMajorVersion="1"></Field>
   <Field Name="PersonalAddresses" Type="Core.Address"
     Nullable="true" MultiValued="true"
     TypeMajorVersion="1"></Field>
   <Field Name="PersonalPicture" Type="Base.Link" Nullable="true"
     TypeMajorVersion="1"></Field>
     ...
</Type>

编程的时候,只要将System.Storage加载进来,便可进行对WinFS的编程。比如Contact.ListContacts()方法是将storage中所有的Contact都列出来,创建一个contact的代码如下:

//This actually create the person object.
   Person person = Person.CreatePersonalContact(context);
   person.DisplayName = name;

//This populates the person object with some valuable data
   //such as an e-mail address and a phone number
   SmtpEmailAddress email = new SmtpEmailAddress("shanede@microsoft.com");
   CategoryRef primaryEmailCategory = new CategoryRef(GeneralCategories.Primary);
   email.Categories.Add(primaryEmailCategory);
   person.PersonalEmailAddresses.Add(email);

TelephoneNumber phone = new TelephoneNumber();
   phone.AreaCode="425";
   phone.Number="555-1234";
   person.PersonalTelephoneNumbers.Add(phone);

//This actually updates "WinFS" with the new data.
   context.Update();

可惜,在这个目录下的Item都是0字节的无扩展名的,不知道到底是什么的东西,不象Schema文件。用搜索查找contact.xml文件也查找不到。找了一些与WinFS相关的程序,有纯 C# 的,也有使用了Avalon的,然后用MSBuilding编译。程序编译成功,但是运行出错。即使是创建新Item、更改Item属性这类简单的程序也不能运行成功。看来这个版本的Longhorn中的WinFS还有许多的限制。

玩了两天的WinFS,本来是计划再琢磨多一些关于Longhorg的东西,比如Indigo,Avalon编程和语音识别等等。即使是WinFS,也有一大堆的内容可以深究,比如它的Storage Engine、Security、Synchronization等等。但是发现现在发布的这个版本的Longhorn实在太多限制,所发布的资料中的许多特点尚不支持,而且未来肯定会有很多的变数,便决定暂且把这新奇的玩意放到一边,静观其变。其实,Longhorn离我们还挺遥远,现在的硬件水平暂时也很难满足其需求。所以,对于我们这些普通人来说,了解其概貌及发展趋势便可,深究实是大可不必。

标签: