JP4394644B2 - データの編成、検索、および共有のためのストレージプラットフォーム - Google Patents

データの編成、検索、および共有のためのストレージプラットフォーム Download PDF

Info

Publication number
JP4394644B2
JP4394644B2 JP2005509111A JP2005509111A JP4394644B2 JP 4394644 B2 JP4394644 B2 JP 4394644B2 JP 2005509111 A JP2005509111 A JP 2005509111A JP 2005509111 A JP2005509111 A JP 2005509111A JP 4394644 B2 JP4394644 B2 JP 4394644B2
Authority
JP
Japan
Prior art keywords
item
items
relationship
type
data
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2005509111A
Other languages
English (en)
Other versions
JP2007521537A (ja
Inventor
ジェイ.クラーク クェンティン
ケイ.ノリ アニル
セリス ペドロ
エム.スピロ ピーター
ジー.キャンベル デイビッド
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Corp
Original Assignee
Microsoft Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Microsoft Corp filed Critical Microsoft Corp
Publication of JP2007521537A publication Critical patent/JP2007521537A/ja
Application granted granted Critical
Publication of JP4394644B2 publication Critical patent/JP4394644B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L69/00Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
    • H04L69/30Definitions, standards or architectural aspects of layered protocol stacks
    • H04L69/32Architecture of open systems interconnection [OSI] 7-layer type protocol stacks, e.g. the interfaces between the data link level and the physical level
    • H04L69/322Intralayer communication protocols among peer entities or protocol data unit [PDU] definitions
    • H04L69/329Intralayer communication protocols among peer entities or protocol data unit [PDU] definitions in the application layer [OSI layer 7]
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/10File systems; File servers
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L67/00Network arrangements or protocols for supporting network services or applications
    • H04L67/01Protocols
    • H04L67/10Protocols in which an application is distributed across nodes in the network
    • H04L67/1095Replication or mirroring of data, e.g. scheduling or transport for data synchronisation between network nodes

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Networks & Wireless Communication (AREA)
  • Signal Processing (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Description

本発明は一般に、情報の格納および取り出しの分野に関し、より具体的には、コンピュータ化されたシステムにおいて様々な型のデータを編成し、検索し、かつ共有するためのアクティブストレージプラットフォームに関する。
個々のディスク容量は、最近10年間に、ほぼ年70%の割合で増大してきている。ムーアの法則は、長年にわたって続いている中央演算処理装置(CPU)パワーの途方もない増大を正確に予測した。有線および無線技術は、驚異的な接続性および帯域幅をもたらした。現在のトレンドが続くと仮定すると、数年以内に、平均的なラップトップコンピュータでおおよそ1テラバイト(TB)のストレージを備え、数百万個のファイルを格納するようになり、500ギガバイト(GB)ドライブがあたりまえになることであろう。
消費者は、コンピュータを主に通信と個人情報の編成に使用しており、これは、従来の個人情報管理(Personal Information Manager)スタイルのデータであるか、デジタル音楽または写真などの媒体であるかを問わない。デジタルコンテンツの量、および未加工のバイトを格納する能力は、途方もなく増大してきているが、消費者がこのようなデータの編成および統合に使用できる方法は対応できていない。知識労働者は、情報の管理および共有に膨大な時間を費やしており、ある調査では、知識労働者は非生産的情報関連の活動に全時間の15〜25%を費やしていると推定している。また他の調査では、標準的な知識労働者は情報の検索に毎日約2.5時間を費やしている推定している。
開発者および情報技術(IT)部門は、人々、場所、時間、および出来事などを表す共通ストレージ抽象化(common storage abstractions)のための、彼ら自身のデータストアを構築することに相当の時間と資金を費やしている。この結果、作業を重複させるだけでなく、データの共通の検索または共有のためのメカニズムのない、共通データの孤島をいくつも生み出している。今日、Microsoft Windows(登録商標)オペレーティングシステムが稼働するコンピュータ上に、いったいいくつのアドレス帳が存在しうるか考えてみよう。電子メールクライアントおよびパーソナルファイナンスプログラムなどの多くのアプリケーションは、個々にアドレス帳を保存し、そのようなそれぞれのプログラムが個別に保持するアドレス帳データのアプリケーション間の共有はほとんどない。その結果、ファイナンスプログラム(Microsoft Money(登録商標)のようなプログラム)は、受取人のアドレスを、電子メール連絡先フォルダ(Microsoft Outlook(登録商標)が備えているようなフォルダ)に保持されているアドレスと共有しない。実際、多くのユーザは、複数のデバイスを持ち、論理的に、そのパーソナルデータをそれら自体の間で同期させ、また携帯電話からMSNおよびAOLなどの商業サービスに至るまで、様々な追加ソースにまたがって同期させなければならないが、共有されているドキュメントのコラボレーションは、電子メールメッセージにドキュメントを添付することにより大半が行われている、つまり、手作業で、しかも非効率的に行われている。
このようなコラボレーションの欠落の理由の1つは、コンピュータシステム内に情報を編成する伝統的なアプローチが、ファイル−フォルダ/ディレクトリベースのシステム(「ファイルシステム」)を使用し、複数のファイルを格納するために使用される記憶媒体の物理的編成の抽象化に基づいて、複数のファイルをフォルダのディレクトリ階層に編成することを中心に機能していることである。1960年代に開発されたMulticsオペレーティングシステムは初めて、ファイル、フォルダ、およびディレクトリを使用して、オペレーティングシステムレベルにおいてデータの格納可能ユニットを管理したことで高い評価を得ている。特に、Multicsは、ファイルの階層内で記号アドレスを使用し(それによってファイルパスという概念を導入)、ファイルの物理的アドレスはユーザ(アプリケーションおよびエンドユーザ)に対し透過的でなかった。このファイルシステムは、全体として、どの個別ファイルのファイル形式についても意識しておらず、ファイル間の関係は、オペレーティングシステムレベル(つまり、階層内のファイルの場所以外)においては重要でないとみなされていた。Multicsの出現以来、格納可能なデータは、オペレーティングシステムレベルにおいてファイル、フォルダ、およびディレクトリに編成されてきた。これらのファイルは、一般に、ファイルシステムにより保持されている特殊ファイルにおいて具現化されたファイル階層自体(「ディレクトリ」)を含む。このディレクトリは、次に、ディレクトリ内のその他のファイルおよび階層内のそのようなファイルの位置(nodal location)のすべてに対応するエントリのリストを保持する(ここでは、フォルダと呼ぶ)。このようなシステムが、約40年間にわたって最先端技術であった。
しかし、コンピュータの物理的ストレージシステム内に置かれている情報の十分妥当な表現を実現しているにもかかわらず、ファイルシステムは、その物理的ストレージシステムの抽象化であり、それらのファイルの利用には、ユーザの操作内容(コンテクストを持つユニット、特徴、および他のユニットとの関係)とオペレーティングシステムが備える内容(ファイル、フォルダ、およびディレクトリ)との間のあるレベルの指示(解釈)を必要とする。したがって、ユーザ(アプリケーションおよび/またはエンドユーザ)には、そうすることが非効率であり、不整合であり、または他の何らかの形で望ましくない場合でも、情報のユニットにファイルシステム構造を強いる以外に選択肢がない。さらに、既存のファイルシステムは、個別ファイルに格納されているデータの構造についてはほとんど関知しないため、情報のほとんどは、それらを書いたアプリケーションにしかアクセス(理解)できないファイル内にロックアップされたままとなる。その結果、このように情報のスキマティック(schematic)な記述、および情報を管理するためのメカニズムを欠いているため、個別の保管場所の間でほとんどデータを共有しないままデータの保管場所を作成することになる。例えば、多くのパーソナルコンピュータ(PC)ユーザは、ファイル編成はPCユーザにとってかなり難しい作業であるため、あるレベル−例えば、Outlook Contacts、オンライン口座アドレス、Windows(登録商標)Address Book、Quicken Payees、およびインスタントメッセージング(IM)の仲間リスト−においてやり取りする人々に関する情報を格納する5つを超える異なるストアを持つ。ほとんどの既存のファイルシステムではファイルおよびフォルダの編成にネストされたフォルダメタファを使用しているため、ファイルの個数が増えると、柔軟で効率的な編成方式を維持するために要する労力はかなり大変なものとなる。このような状況では、単一ファイルの複数の分類があると非常に有益であるが、既存ファイルシステム内のハードまたはソフトリンクを使用することは厄介であり、維持も困難である。
過去には、ファイルシステムの欠点をなくそうとする試みが何回かあったがうまくいかなかった。それらの以前の試みのうちいくつかは、連想メモリ(content addressable memory)を利用し、データに物理アドレスではなく内容でアクセスできるメカニズムを実現しようとした。しかし、連想メモリはキャッシュおよびメモリ管理ユニットなどのデバイスによる小規模な利用については有用であることが実証されたが、物理的記憶媒体などのデバイスでの大規模な利用は様々な理由からまだ可能でないため、こうした努力は成功しておらず、したがって、このような解決策はただ単に存在していない。オブジェクト指向データベース(OODB)システムを使用した他の試みもなされているが、これらの試みは、強いデータベース特性とよい非ファイル表現を特徴とする一方、ファイル表現の取り扱いにおいては効果的でなく、ハードウェア/ソフトウェアインターフェースのシステムレベルでの階層構造に基づくファイルおよびフォルダの速度、効率、および簡潔さを再現することもできない。SmallTalk(およびその派生言語)を使用する試みなどの他の取り組みは、ファイルおよび非ファイル表現の取り扱いでは極めて効果的であることが実証されたが、様々なデータファイルの間に存在する関係を効率よく編成し、利用するために必要なデータベース機能を欠いており、したがって、そのようなシステムの全体的効率は許容できないものであった。さらにBeOSを使用する他の試み(および他のそのようなオペレーティングシステム研究)は、必要なデータベース機能をいくつか備えておりファイルを適切に表現できるにもかかわらず、非ファイル表現を取り扱うのには不適当であること−従来のファイルシステムの中心的な欠点と同じ欠点−を実証した。
データベース技術は、同様の難題が存在するもう1つの技術分野である。例えば、リレーショナルデータベースモデルは大きな商業的成功を収めたが、実際には、独立系ソフトウェアベンダ(ISV)は、一般に、リレーショナルデータベースのソフトウェア製品(Microsoft SQL Serverなど)に用意されている機能のわずかな部分を利用している。その代わりに、そのような製品とのアプリケーションの相互作用のほとんどは、単純な「読み取る」と「書き込む」の形態である。これに対しすぐにわかる理由−プラットフォームまたはデータベースがわからないなど−が多数占めるが、気づかれないことが多い重要な理由の1つは、データベースは、必ずしも、大手ビジネスアプリケーションベンダが本当に必要とする的確な抽象化を行わないということである。例えば、現実世界には、「顧客」または「注文」(それら自身の中のアイテム、またそれら自身のアイテムとして注文の埋め込まれた「ラインアイテム」とともに)「アイテム」という概念があるが、リレーショナルデータベースはテーブルおよび行に関してしか認識しない。その結果、アプリケーションは、(例えば)アイテムレベルでの整合性、ロッキング、セキュリティ、および/またはトリガの側面を持つことが望ましいかもしれないが、一般的には、データベースはこれらの機能をテーブル/行のレベルでしか備えていない。これは、それぞれのアイテムがデータベースのあるテーブル内の単一行にマッピングされる場合にうまく機能する可能性があるが、複数のラインアイテムの注文の場合、アイテムが実際に複数のテーブルにマッピングされる理由がありえ、それがその場合であれば、単純なリレーショナルデータベースシステムではまったく正しい抽象化を行わない。その結果、アプリケーションは、それらの基本的抽象化を実現するためにデータベースの上にロジックを構築しなければならない。つまり、基本的リレーショナルモデルは、アプリケーションとストレージシステムとの間にあるレベルの間接性を必要とし、その場合データの意味構造は、特定の場合にしかアプリケーション内では見えない場合があるため、基本的リレーショナルモデルは、高水準のアプリケーションを容易に開発可能であるデータを格納するために十分なプラットフォームを提供しない。いくつかのデータベースベンダが、高水準の機能をその製品に組み込んでいる−オブジェクトリレーショナル機能、新しい組織化可能モデルなどを備える−が、どれも、必要な種類の包括的ソリューションを実現していない。というのも、本当に包括的なソリューションとは、有用なドメイン抽象化(「Persons」、「Locations」、「Events」など)に対し両方とも有用なデータモデル抽象化(「Item」、「Extensions」、「Relationships」など)を実現するものだからである。
既存のデータストレージおよびデータベース技術における前記の欠点に関して、コンピュータシステム内のデータのすべての型を編成し、検索し、共有する能力を高めた新しいストレージプラットフォーム−既存のファイルシステムおよびデータベースシステムを超えてデータプラットフォームを拡張し拡大する、すべての型のデータを格納するように設計されているストレージプラットフォーム−が必要である。本発明は、この要求条件を満たす。
以下の説明では、本発明の様々な態様の概要を述べる。この説明は、本発明の重要な態様のすべてを網羅的に説明することも、また本発明の範囲を定めることも意図していない。むしろ、この説明は、以下の詳細な説明および図面の導入部として使用されることを意図している。
本発明は、データの編成、検索、および共有のためのストレージプラットフォームを対象とする。本発明のストレージプラットフォームは、既存のファイルシステムおよびデータベースシステムを超えるデータストレージの概念を拡張し、広げるものであり、構造化、非構造化、または半構造化データを含むすべての型のデータ用のストアとなるように設計されている。
本発明の一態様によれば、本発明のストレージプラットフォームは、データベースエンジン上に実装されたデータストアを含む。本発明の様々な実施形態では、データベースエンジンは、オブジェクトリレーショナルの拡張機能を備えるリレーショナルデータベースエンジンを含む。データストアは、データの編成、検索、共有、同期、およびセキュリティをサポートするデータモデルを実装する。特定の型のデータがスキーマ内に記述されており、プラットフォームは新しい型のデータ(本質的に、スキーマにより実現される基本型の子型(subtype))を定義するためスキーマの集合を拡張するメカニズムを備える。同期処理機能は、ユーザまたはシステム間のデータの共有を円滑にする。ファイルシステム風の機能が用意され、これにより、そのような従来のファイルシステムの制限のない既存のファイルシステムとのデータストアの相互運用性を実現できる。変更追跡メカニズムは、データストアに対する変更追跡の機能を備える。ストレージプラットフォームは、さらに、アプリケーションからストレージプラットフォームの前記の機能のすべてにアクセスし、スキーマで記述されているデータにアクセスするための一組のアプリケーションプログラムインターフェースを備える。
本発明の他の態様によれば、データストアにより実装されるデータモデルは、アイテム、要素、および関係に関してデータストレージのユニットを定義する。アイテムは、データストアに格納可能なデータの1つのユニットであり、1つまたは複数の要素および関係を含むことができる。要素は、1つまたは複数のフィールドを含む型のインスタンスである(ここではプロパティとも呼ばれる)。関係は、2つのアイテムの間のリンクである。(本明細書で使用されているように、これらの用語および他の特定の用語は、極めて密接に使用される他の用語から分けるため原文の英語では先頭文字が大文字にされている場合があるが、何であれ英語で先頭が大文字の用語は例えば「Item」とし、英語で大文字でないときの同じ用語、例えば、「item」は日本語に訳してアイテムとするが、区別する意図はなく、そのような区別は想定されるべきでも、暗黙のうちに含まれるべきでもない)。
本発明の他の態様によれば、コンピュータシステムは、それぞれのItemがハードウェア/ソフトウェアインターフェースシステムにより操作することができる情報の離散的(discrete)格納可能ユニットを構成する複数のItem、前記Itemに対する組織構造を構成する複数のItem Folder、およびそれぞれのItemが少なくとも1つのItem Folderに属し、複数のItem Folderに属す場合もある、複数のItemを操作するためのハードウェア/ソフトウェアインターフェースシステムを備える。
本発明の他の態様によれば、コンピュータシステムは、複数のItemを備え、それぞれのItemは、ハードウェア/ソフトウェアインターフェースシステムにより操作することができる離散的情報ユニットを構成し、ItemまたはItemのプロパティ値のいくつかは、永続的ストアから求められるのとは反対に動的に計算される。つまり、ハードウェア/ソフトウェアインターフェースシステムは、Itemを格納する必要はなく、Itemの現在の集合を列挙する機能またはストレージプラットフォームの識別子(アプリケーションプログラミングインターフェースつまりAPIを説明する節でさらに詳しく説明する)が与えられた場合のItemを取り出す機能などのいくつかのオペレーションがサポートされる−例えば、Itemは、携帯電話の現在位置または温度センサ上の温度読み取り値とすることが可能である。
本発明の他の態様によれば、複数のItemを操作する、コンピュータシステムのハードウェア/ソフトウェアインターフェースシステムは、さらに、ハードウェア/ソフトウェアインターフェースシステムにより管理される複数のRelationshipにより相互接続されるItemを含む。本発明の他の態様によれば、コンピュータシステムのハードウェア/ソフトウェアインターフェースシステムは、前記ハードウェア/ソフトウェアインターフェースシステムにより理解可能なプロパティを持つ複数の離散的情報ユニットを操作する、コンピュータシステムのハードウェア/ソフトウェアインターフェースシステムである。本発明の他の態様によれば、コンピュータシステムのハードウェア/ソフトウェアインターフェースシステムは、前記ハードウェア/ソフトウェアインターフェースシステムが理解し、所定の予測可能な方法で直接処理することができるコアItemの集合を定義するコアスキーマを備える。本発明の他の態様によれば、前記Itemと複数のRelationshipとを相互接続し、ハードウェア/ソフトウェアインターフェースシステムレベルで前記Relationshipを管理することを含む、コンピュータシステムのハードウェア/ソフトウェアインターフェースシステムの複数の離散的情報ユニット(「Item」)を操作する方法が開示される。
本発明の他の特徴によれば、ストレージプラットフォームのAPIは、ストレージプラットフォームスキーマの集合で定義されているそれぞれのアイテム、アイテム拡張、および関係に対するデータクラスを用意する。さらに、アプリケーションプログラミングインターフェースは、データクラスに対するビヘイビア(behaviors)の共通の集合を定義し、データクラスとともに、ストレージプラットフォームAPIの基本プログラミングモデルを提供するフレームワーククラスの集合を実現する。本発明の他の特徴によれば、ストレージプラットフォームAPIは、アプリケーションプログラマを基礎のデータベースエンジンのクエリ言語の詳細から分離する形で、データストア内のアイテムの様々なプロパティに基づいてアプリケーションプログラマがクエリを形成するために使用できる簡略化されたクエリモデルを備える。本発明のストレージプラットフォームAPIのさらに他の態様によれば、このAPIは、アプリケーションプログラムによりアイテムに加えられた変更を集めてから、それらをデータストアが実装されているデータベースエンジン(または何らかの種類のストレージエンジン)により要求される正しい更新に編成する。これにより、アプリケーションプログラマは、データストア更新の複雑な部分をAPIに任せつつ、メモリ中のアイテムに変更を加えることができる。
本発明のストレージプラットフォームでは、共通のストレージ基盤および図式化されたデータを通じて、より効率的なアプリケーション開発を消費者、知識労働者、および企業向けに行うことができる。これは、データモデルに固有の機能を利用可能にするだけでなく、既存のファイルシステムおよびデータベースアクセス方法も包含し、拡張する機能豊富な拡張可能アプリケーションプログラミングインターフェースを備える。
本発明の他の特徴および利点は、本発明の以下の詳細な説明および付属の図面から明白になるであろう。
前述の概要は、本発明の以下の詳細な説明とともに、付属の図面を参照しつつ読むとよく理解できる。本発明を例示する目的のために、図面には、本発明の様々な態様の実施例が示されているが、本発明は、開示されている特定の方法および手段に限定されない。図面は以下で説明される。
目次
I.序論
A.例示的なコンピューティング環境
B.従来のファイルベースのストレージ
II.データの編成、検索、および共有のための新しいストレージプラットフォーム
A.用語解説
B.ストレージプラットフォームの概要
C.データモデル
1.Items
2.Itemの識別
a)アイテム参照
(1)ItemIDReference
(2)ItemPathReference
b)参照型階層
3.Item FoldersおよびCategories
4.Schemas
a)Base Schema
b)Core Schema
5.関係
a)関係の宣言
b)保持Relationship
c)埋め込み関係
d)参照関係
e)規則と制約条件
f)関係の順序付け
6.拡張性
a)アイテム拡張
b)NestedElement型の拡張
D.データベースエンジン
1.UDTを使用したデータストアの実装
2.アイテムのマッピング
3.拡張マッピング
4.ネストされている要素のマッピング
5.オブジェクト識別
6.SQLオブジェクトの命名規則
7.列の命名規則
8.検索ビュー
a)アイテム
(1)マスターアイテム検索ビュー
(2)型付きアイテム検索ビュー
b)アイテム拡張
(1)マスター拡張検索ビュー
(2)型付き拡張検索ビュー
c)ネストされている要素
d)関係
(1)マスター関係検索ビュー
(2)関係インスタンス検索ビュー
9.更新
10.変更追跡&ツームストーン
a)変更追跡
(1)「マスター」検索ビューでの変更追跡
(2)「型付き」検索ビューでの変更追跡
b)ツームストーン
(1)アイテムツームストーン
(2)拡張ツームストーン
(3)関係ツームストーン
(4)ツームストーンのクリーンアップ
11.ヘルパAPIおよび関数
a)関数[System.Storage].GetItem
b)関数[System.Storage].GetExtension
c)関数[System.Storage].GetRelationship
12.メタデータ
a)スキーマメタデータ
b)インスタンスメタデータ
E.セキュリティ
1.概要
2.セキュリティモデルの詳細な説明
a)セキュリティ記述子構造
(1)アクセスマスク形式
(2)汎用アクセス権
(3)標準アクセス権
b)アイテム特有の権利
(1)ファイルおよびディレクトリオブジェクト特有の権利
(2)WinFSItemRead
(3)WinFSItemReadAttributes
(4)WinFSItemWriteAttributes
(5)WinFSItemWrite
(6)WinFSItemAddLink
(7)WinFSItemDeleteLink
(8)アイテムを削除する権利
(9)アイテムをコピーする権利
(10)アイテムを移動する権利
(11)アイテム上のセキュリティポリシーを表示する権利
(12)アイテム上のセキュリティポリシーを変更する権利
(13)直接の等価物を持たない権利
3.実装
a)コンテナ内に新しいアイテムを作成する
b)明示的なACLをアイテムに追加する
c)保持Relationshipをアイテムに追加する
d)保持Relationshipをアイテムから削除する
e)明示的なACLをアイテムから削除する
f)アイテムに関連付けられているACLを修正する
F.通知および変更追跡
1.ストレージ変更イベント
a)イベント
b)ウォッチャ(Watchers)
2.変更追跡および通知生成メカニズム
a)変更追跡
b)タイムスタンプ管理
c)データ変更検出−イベント検出
G.同期
1.ストレージプラットフォームとストレージプラットフォームとの間の同期処理
a)同期(Sync)制御アプリケーション
b)スキーマ注釈
c)同期設定
(1)コミュニティフォルダ−マッピング
(2)プロファイル
(3)スケジュール
d)競合回避処理
(1)競合検出
(a)知識ベースの競合
(b)制約ベースの競合
(2)競合処理
(a)自動競合解決
(b)競合ログ作成
(c)競合の検査および解決
(d)レプリカの収束および競合解決の伝搬
2.非ストレージプラットフォームデータストアの同期処理
a)同期処理サービス
(1)Change Enumeration
(2)Change Application
(3)Conflict Resolution
b)アダプタの実装
3.セキュリティ
4.管理容易性
H.従来のファイルシステムの相互運用性
1.相互運用性のためのモデル
2.データストアの機能
a)ボリュームではない
b)ストア構造
c)すべてのファイルが移動(migrated)されるわけではない
d)NTFS名前空間でのストレージプラットフォームファイルへのアクセス
e)予期される名前空間/ドライブ文字(letters)
I.ストレージプラットフォームAPI
1.概要
2.命名およびスコープ
3.ストレージプラットフォームAPIコンポーネント
4.データクラス
5.ランタイムフレームワーク
a)ランタイムフレームワーククラス
(1)ItemContext
(2)ItemSearcher
(a)ターゲット型
(b)フィルタ
(c)検索の準備
(d)検索オプション
(3)アイテム結果ストリーム(「FindResult」)
b)動作中のランタイムフレームワーク
c)共通プログラミングパターン
(1)ItemContextオブジェクトを開く、閉じる
(2)オブジェクトの検索
(a)検索オプション
(b)FindOneおよびFindOnly
(c)ItemContext上のショートカットを検索する
(d)IDまたはパスによって検索する
(e)GetSearcherパターン
(3)ストアの更新
6.セキュリティ
7.関係についてのサポート
a)基本関係型
(1)関係クラス
(2)ItemReferenceクラス
(3)ItemIdReferenceクラス
(4)ItemPathReferenceクラス
(5)RelationshipId構造体
(6)VirtualRelationshipCollectionクラス
b)生成された関係型
(1)生成された関係型
(2)RelationshipPrototypeクラス
(3)RelationshipPrototypeCollection
クラス
c)Itemクラス内の関係サポート
(1)Itemクラス
(2)RelationshipCollectionクラス
d)検索式の中の関係サポート
(1)アイテムから関係へのトラバース
(2)関係からアイテムへのトラバース
(3)関係トラバースの組合せ
e)関係サポートの使用例
(1)関係の検索
(2)関係からソースおよびターゲットアイテムへのナビゲート
(3)ソースアイテムから関係へのナビゲート
(4)関係(およびアイテム)の作成
(5)関係(およびアイテム)の削除
8.ストレージプラットフォームAPIの「拡張」
a)ドメインビヘイビア
b)付加価値ビヘイビア
c)サービスプロバイダとしての付加価値ビヘイビア
9.デザインタイムフレームワーク
10.クエリ形式(formalism)
a)フィルタの基本事項
b)型変換
c)フィルタ構文
11.リモーティング
a)APIにおけるローカル/リモート透過性
b)リモーティングのストレージプラットフォーム実装
c)非ストレージプラットフォームストアへのアクセス
d)DFSとの関係
e)GXA/Indigoとの関係
12.制約条件
13.共有
a)共有の表現
b)共有の管理
c)共有のアクセス
d)発見可能性
14.Findの意味
15.ストレージプラットフォームContacts API
a)System.Storage.Contactの概要
b)ドメインビヘイビア
16.ストレージプラットフォームFile API
a)序論
(1)ストレージプラットフォーム内でのNTFSボリュームの反映
(2)ストレージプラットフォーム名前空間内でのファイルおよび
ディレクトリの作成
b)Fileスキーマ
c)System.Storage.Filesの概要
d)コード例
(1)ファイルを開き書き込む
(2)クエリの使用
e)ドメインビヘイビア
J.まとめ
I.序論
本発明の主題は、法的要件を満たすように特異性(specificity)とともに説明されている。しかし、説明自体は、本発明の範囲を制限することを意図されていない。むしろ、発明者は、主張されている主題は、他の現在または将来の技術とともに、本明細書で説明されているステップと類似しているが異なるステップまたはステップの組合せを含むように、他の方法でも具現化されうることを考察した。さらに、「ステップ」という用語は、本明細書では、採用されている方法の異なる要素を暗示するために使用される場合があるが、この用語は、個々のステップの順序が明示的に説明されている場合を除き、本明細書で開示されている様々なステップ間の特定の順序を示唆するものとして解釈すべきではない。
A.例示的なコンピューティング環境
本発明の数多くの実施形態は、コンピュータ上で実行することができる。図1および以下の説明は、本発明を実施できる適当なコンピューティング環境について簡潔に述べた一般的な説明となることを意図している。必要というわけではないが、本発明の様々な態様は、クライアントワークステーションまたはサーバなどのコンピュータにより実行される、プログラムモジュールなどの、コンピュータ実行可能命令の一般的文脈において説明することができる。一般に、プログラムモジュールは、特定のタスクを実行する、または特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などを含む。さらに、本発明は、ハンドヘルドデバイス、マルチプロセッサシステム、マイクロプロセッサベースのまたはプログラム可能な家電製品、ネットワークPC、ミニコンピュータ、メインフレームコンピュータなどを含む、他のコンピュータシステム構成を使用して実施できる。また、本発明は、通信ネットワークを通じてリンクされているリモート処理装置によりタスクが実行される分散コンピューティング環境で実施することもできる。分散コンピューティング環境では、プログラムモジュールは、ローカルおよびリモートの両方のメモリ記憶デバイス内に配置されうる。
図1に示されているように、例示的な汎用コンピューティングシステムは、処理ユニット21、システムメモリ22、およびシステムメモリを含む様々なシステムコンポーネントを処理ユニット21に結合するシステムバス23を備える、従来のパーソナルコンピュータ20を含む。システムバス23は、メモリバスまたはメモリコントローラ、ペリフェラルバス、および様々なバスアーキテクチャを使用するローカルバスを含む数種類のバス構造のうちのいずれでもよい。システムメモリは、読み取り専用メモリ(ROM)24およびランダムアクセスメモリ(RAM)25を含む。起動時などにパーソナルコンピュータ20内の要素間の情報伝送を助ける基本ルーチンを含む基本入出力システム26(BIOS)は、ROM24に格納される。パーソナルコンピュータ20は、さらに、図に示されていないハードディスクへの読み書きを行うためのハードディスクドライブ27、取外し可能な磁気ディスク29への読み書きを行うための磁気ディスクドライブ28、およびCD−ROMまたはその他の光媒体などの取外し可能な光ディスク31への読み書きを行うための光ディスクドライブ30を備える。ハードディスクドライブ27、磁気ディスクドライブ28、および光ディスクドライブ30は、ハードディスクドライブインターフェース32、磁気ディスクドライブインターフェース33、および光ディスクドライブインターフェース34によりそれぞれシステムバス23に接続される。ドライブおよび関連するコンピュータ読取り可能記憶媒体は、パーソナルコンピュータ20用のコンピュータ読取り可能命令、データ構造体、プログラムモジュール、およびその他のデータを格納する不揮発性記憶装置を実現する。本発明で説明されている環境例ではハードディスク、取外し可能な磁気ディスク29、および取外し可能な光ディスク31を使用しているが、当業者であれば、磁気カセット、フラッシュメモリカード、デジタルビデオディスク、ベルヌーイカートリッジ、複数のランダムアクセスメモリ(RAM)、複数の読み取り専用メモリ(ROM)などのコンピュータからアクセス可能なデータを格納できるその他のタイプのコンピュータ読取り可能媒体もこの例示的な動作環境で使用できることを理解するであろう。同様に、この例示的な環境は、さらに、熱感知器およびセキュリティまたは火災警報装置などの様々なタイプの監視デバイス、およびその他の情報源を含むことができる。
オペレーティングシステム35、1つまたは複数のアプリケーションプログラム36、その他のプログラムモジュール37、およびプログラムデータ38を含む、多くのプログラムモジュールは、ハードディスク、磁気ディスク29、光ディスク31、ROM24、またはRAM25に格納されることができる。ユーザはキーボード40およびポインティングデバイス42などの入力デバイスを通じてパーソナルコンピュータ20にコマンドおよび情報を入力することができる。その他の入力デバイス(図に示されていない)としては、マイク、ジョイスティック、ゲームパッド、衛星放送受信アンテナ、スキャナなどがある。これらの入力デバイスやその他の入力デバイスは、システムバスに結合されているシリアルポートインターフェース46を介して処理ユニット21に接続されることが多いが、パラレルポート、ゲームポート、またはユニバーサルシリアルバス(USB)などの他のインターフェースにより接続することもできる。モニタ47またはその他の種類の表示デバイスも、ビデオアダプタ48などのインターフェースを介してシステムバス23に接続される。パーソナルコンピュータは、通常、モニタ47の他に、スピーカおよびプリンタなど、その他の周辺出力装置(図に示されていない)を備える。図1の例示的なシステムは、さらに、ホストアダプタ55、SCSI(Small Computer System Interface)バス56、およびSCSIバス56に接続された外部記憶デバイス62も含む。
パーソナルコンピュータ20は、リモートコンピュータ49などの1つまたは複数のリモートコンピュータへの論理接続を使用してネットワーク接続環境で動作することができる。リモートコンピュータ49は、他のパーソナルコンピュータ、サーバ、ルータ、ネットワークPC、ピアデバイス、またはその他の共通ネットワークノードでもよく、通常は、パーソナルコンピュータ20に関係する上述の要素の多くまたはすべてを含むが、メモリ記憶デバイス50だけが図1に示されている。図1で説明されている論理接続は、ローカルエリアネットワーク(LAN)51とワイドエリアネットワーク(WAN)52を含む。このようなネットワーキング環境は、オフィス、企業規模のコンピュータネットワーク、イントラネット、およびインターネットでは一般的である。
LANネットワーキング環境で使用される場合、パーソナルコンピュータ20は、ネットワークインターフェースまたはアダプタ53を介してLAN51に接続される。WANネットワーキング環境で使用される場合、パーソナルコンピュータ20は、通常、モデム54またはインターネットなどのワイドエリアネットワーク52上で通信を確立するためのその他の手段を備える。モデム54は、内蔵でも外付けでもよいが、シリアルポートインターフェース46を介してシステムバス23に接続される。ネットワーク接続環境では、パーソナルコンピュータ20またはその一部に関して示されているプログラムモジュールは、リモートメモリ記憶デバイスに格納されうる。図に示されているネットワーク接続は例示的であり、コンピュータ間の通信リンクを確立するために他の手段が使用可能であることは理解されるであろう。
図2のブロック図に例示されているように、コンピュータシステム200は、大まかに言って、ハードウェアコンポーネント202、ハードウェア/ソフトウェアインターフェースシステムコンポーネント204、およびアプリケーションプログラムコンポーネント206(本明細書では状況に応じて「ユーザコンポーネント」または「ソフトウェアコンポーネント」とも呼ぶ)の3つのコンポーネントグループに分けることができる。
コンピュータシステム200の様々な実施形態において、図1を再び参照すると、ハードウェアコンポーネント202は、処理ユニット(CPU)21、メモリ(ROM24およびRAM25の両方)、基本入出力システム(BIOS)26、およびキーボード40、マウス42、モニタ47、および/またはプリンタ(図に示されていない)などの様々な入出力(I/O)デバイスを備えることができる。ハードウェアコンポーネント202は、コンピュータシステム200用の基本的な物理的インフラストラクチャを備える。
アプリケーションプログラムコンポーネント206は、限定はしないが、コンパイラ、データベースシステム、ワードプロセッサ、ビジネスプログラム、ビデオゲームなどを含む、様々なソフトウェアプログラムを備える。アプリケーションプログラムは、様々なユーザ(マシン、他のコンピュータシステム、および/またはエンドユーザ)のために問題を解決し、解決策を提供し、データを処理するため、コンピュータ資源を利用するための手段を備える。
ハードウェア/ソフトウェアインターフェースシステムコンポーネント204は、それ自体、ほとんどの場合、シェルおよびカーネルを含むオペレーティングシステムを備える(および、いくつかの実施形態では、そのようなオペレーティングシステムのみで構成することができる)。「オペレーティングシステム」(OS)は、アプリケーションプログラムとコンピュータハードウェアとの間の媒介として動作する特別なプログラムである。ハードウェア/ソフトウェアインターフェースシステムコンポーネント204は、さらに、仮想マシンマネージャ(VMM)、共通言語ランタイム(CLR)またはその機能的等価物、Java(登録商標)仮想マシン(JVM)またはその機能的等価物、またはコンピュータシステム内のオペレーティングシステムの代わりとなる、またはそれへの追加となる他のそのようなソフトウェアコンポーネントを含むこともできる。ハードウェア/ソフトウェアインターフェースシステムの目的は、ユーザがアプリケーションプログラムを実行できるような環境を用意することである。ハードウェア/ソフトウェアインターフェースシステムの目標は、コンピュータシステムを使いやすくするだけでなく、コンピュータハードウェアを効率的な方法で利用できるようにすることである。
ハードウェア/ソフトウェアインターフェースシステムは、一般に、起動時にコンピュータシステムにロードされ、それ以降、コンピュータシステム内のすべてのアプリケーションプログラムを管理する。アプリケーションプログラムは、アプリケーションプログラムインターフェース(API)を介してサービスを要求することによりハードウェア/ソフトウェアインターフェースシステムとやり取りをする。一部のアプリケーションプログラムでは、エンドユーザはコマンド言語またはグラフィカルユーザインターフェース(GUI)などのユーザインターフェースを介してハードウェア/ソフトウェアインターフェースシステムとやり取りすることができる。
ハードウェア/ソフトウェアインターフェースシステムは、従来、アプリケーションに対し様々なサービスを実行するものである。複数のプログラムを同時に実行できるマルチタスクのハードウェア/ソフトウェアインターフェースシステムにおいて、ハードウェア/ソフトウェアインターフェースシステムは、どのアプリケーションをどのような順序で実行し、それぞれのアプリケーションについて次のアプリケーションに切り換えるまでにどれだけの時間を許すべきかを決定する。ハードウェア/ソフトウェアインターフェースシステムは、さらに、複数のアプリケーション間で内部メモリの共有を管理し、さらに、ハードディスク、プリンタ、およびダイアルアップポートなどの接続されているハードウェアデバイスへの入力およびそこからの出力を処理する。ハードウェア/ソフトウェアインターフェースシステムは、さらに、オペレーションのステータスおよび発生した可能性のあるエラーに関するメッセージをそれぞれのアプリケーション(および、場合によってはエンドユーザ)に送信する。ハードウェア/ソフトウェアインターフェースシステムは、さらに、バッチジョブ(例えば、印刷)の管理の負担を取り除き、開始アプリケーションがこのような作業から解放され、他の処理および/またはオペレーションを再開できるようにすることもできる。並列処理機能を備えることができるコンピュータでは、ハードウェア/ソフトウェアインターフェースシステムは、さらに、プログラムを分割して一度に複数のプロセッサ上で実行させることも管理する。
ハードウェア/ソフトウェアインターフェースシステムのシェル(本明細書では単に「シェル」と呼ぶ)は、ハードウェア/ソフトウェアインターフェースシステムとの対話型エンドユーザインターフェースである。(シェルは、「コマンドインタプリタ」と呼ばれたり、オペレーティングシステムでは、「オペレーティングシステムシェル」と呼ばれたりもする。)シェルは、アプリケーションプログラムおよび/またはエンドユーザにより直接アクセス可能なハードウェア/ソフトウェアインターフェースシステムの外側の層である。シェルとは対照的に、カーネルはハードウェアコンポーネントと直接やり取りするハードウェア/ソフトウェアインターフェースシステムの一番内側の層である。
本発明の多数の実施形態は、コンピュータ化されたシステムに特によく適していると考えられるが、本明細書では、本発明をそのような実施形態に限定することを一切意図していない。それどころか、本明細書で使用されているように、「コンピュータシステム」という用語は、情報を格納し処理することができ、および/または格納されている情報を使用してデバイス自体のビヘイビアまたは実行を、そのようなデバイスがその性質上電子デバイスであろうと、機械デバイスであろうと、論理デバイスであろうと、仮想デバイスであろうと、関係なく、制御できることができるありとあらゆるデバイスを包含することが意図されている。
B.従来のファイルベースのストレージ
ほとんどの今日のコンピュータシステムでは、「ファイル」は、ハードウェア/ソフトウェアインターフェースシステムだけでなくアプリケーションプログラム、データセットなどをも含むことができる格納可能な情報のユニットである。現代的なすべてのハードウェア/ソフトウェアインターフェースシステム(Windows(登録商標)、Unix(登録商標)、Linux、MacOS、仮想マシンシステムなど)では、ファイルは、ハードウェア/ソフトウェアインターフェースシステムにより操作可能な情報(例えば、データ、プログラムなど)の基本的な個別の(格納可能および取り出し可能な)ユニットである。ファイルのグループは、「フォルダ」単位で一般的には編成される。Microsoft Windows(登録商標)、Macintosh OS、およびその他のハードウェア/ソフトウェアインターフェースシステムでは、フォルダとは、取り出し可能、移動可能、そして単一の情報ユニットとして他の何らかの手段により操作できるファイルのコレクションのことである。これらのフォルダは、次に、「ディレクトリ」(以下で詳述する)と呼ばれるツリーベースの階層型配列で編成される。DOS、z/OS、およびほとんどのUnix(登録商標)ベースのオペレーティングシステムなど他のいくつかのハードウェア/ソフトウェアインターフェースシステムでは、「ディレクトリ」および/または「フォルダ」という用語は交換して使用することができ、また以前のAppleコンピュータシステム(例えば、Apple IIe)ではディレクトリの代わりに「カタログ」という用語を使用していたが、本明細書で使用されているように、これらの用語はすべて、同義語であり交換可能であるとみなし、階層型情報記憶構造およびそのフォルダおよびファイルコンポーネントに対する他のすべての相当する用語および参照を含むことを意図している。
従来、ディレクトリ(別名、フォルダのディレクトリ)は、ツリーベースの階層構造であり、ファイルは複数のフォルダにグループ化され、フォルダは、さらに、ディレクトリツリーを含む相対的ノード位置に応じて配列される。例えば、図2Aに例示されているように、DOSベースのファイルシステムのベースフォルダ(または「ルートディレクトリ」)212は、複数のフォルダ214を含むことができ、それぞれのフォルダは、さらに、追加フォルダ(その特定のフォルダの「サブフォルダ」として)216を含むことができ、それぞれ、さらに、追加フォルダを含むことができ、というように無限に続けることができる。これらのフォルダはそれぞれ、1つまたは複数のファイル220を保持できるが、ハードウェア/ソフトウェアインターフェースシステムレベルでは、フォルダ内の個々のファイルは、ツリー階層内のその位置以外共通するものは何も持たない。ファイルをフォルダ階層に編成するこのアプローチは、ファイルを格納するために使用される標準的な記憶媒体(例えば、ハードディスク、フロッピー(登録商標)ディスク、CD−ROMなど)の物理的構成を間接的に反映することは驚くことではない。
前記に加えて、それぞれのフォルダは、そのサブフォルダおよびそのファイル用のコンテナである。つまり、それぞれのフォルダはそのサブフォルダおよびファイルを所有するということである。例えば、フォルダがハードウェア/ソフトウェアインターフェースシステムにより削除されると、そのフォルダのサブフォルダおよびファイルも削除される(それぞれのサブフォルダの場合、さらにその所有するサブフォルダおよびファイルを再帰的に含む)。同様に、それぞれのファイルは、一般的に、1つのフォルダのみにより所有される。ファイルはコピーされ、そのコピーは異なるフォルダに配置されることができるが、ファイルのコピーはそれ自体、オリジナルとの直接の関連を持たない、異なる別のユニットである(例えば、オリジナルのファイルに変更を加えても、ハードウェア/ソフトウェアインターフェースシステムレベルではそのコピーファイルに反映されない)。この点に関して、ファイルおよびフォルダは、本質的に特徴として「物理的」である。それは、フォルダは物理的コンテナのように取り扱われ、ファイルはそれらのコンテナ内の離散的な別々の物理的要素として取り扱われるからである。
II.データの編成、検索、および共有のための新しいストレージプラットフォーム
本発明は、データの編成、検索、および共有のためのストレージプラットフォームを対象とする。本発明のストレージプラットフォームは、上述の種類の既存のファイルシステムおよびデータベースシステムを超えてデータプラットフォームの概念を拡張し、広げるものであり、Itemと呼ばれるデータの新しい形態を含む、すべての型のデータ用のストアとなるように設計されている。
A.用語解説
本明細書で使用されているように、また請求項で使用されているように、以下の用語は以下の意味を持つ。
「Item」は、単純ファイルとは異なり、ハードウェア/ソフトウェアインターフェースシステムシェルによりエンドユーザに対し公開されるすべてのオブジェクトにわたって一般的にサポートされるプロパティの基本集合を持つオブジェクトであるハードウェア/ソフトウェアインターフェースシステムにアクセスできる格納可能情報のユニットである。Itemは、さらに、新しいプロパティおよび関係を導入することができる機能を含むすべてのItem型にわたって一般的にサポートされるプロパティおよび関係も有する(本明細書の後のほうで詳述する)。
「オペレーティングシステム」(OS)は、アプリケーションプログラムとコンピュータハードウェアとの間の媒介として動作する特別なプログラムである。オペレーティングシステムは、ほとんどの場合、シェルおよびカーネルを備える。
「ハードウェア/ソフトウェアインターフェースシステム」は、コンピュータシステム上で実行されるコンピュータシステムおよびアプリケーションの基礎となるハードウェアコンポーネント間のインターフェースとして使用される、ソフトウェア、またはハードウェアとソフトウェアとの組合せである。ハードウェア/ソフトウェアインターフェースシステムは、通常、オペレーティングシステムを備える(いくつかの実施形態では、オペレーティングシステムのみからなる)。ハードウェア/ソフトウェアインターフェースシステムは、さらに、仮想マシンマネージャ(VMM)、共通言語ランタイム(CLR)またはその機能的等価物、Java(登録商標)仮想マシン(JVM)またはその機能的等価物、またはコンピュータシステム内のオペレーティングシステムの代わりとなる、またはそれへの追加となる他のそのようなソフトウェアコンポーネントを含むこともできる。ハードウェア/ソフトウェアインターフェースシステムの目的は、ユーザがアプリケーションプログラムを実行できるような環境を用意することである。ハードウェア/ソフトウェアインターフェースシステムの目標は、コンピュータシステムを使いやすくするだけでなく、コンピュータハードウェアを効率的な方法で利用できるようにすることである。
B.ストレージプラットフォームの概要
図3を参照すると、本発明によるストレージプラットフォーム300は、データベースエンジン314上に実装されたデータストア302を備える。一実施形態では、データベースエンジンは、オブジェクトリレーショナルの拡張機能を備えるリレーショナルデータベースエンジンを含む。一実施形態では、リレーショナルデータベースエンジン314は、Microsoft SQL Serverリレーショナルデータベースエンジンを含む。
データストア302は、データの編成、検索、共有、同期、およびセキュリティをサポートするデータモデル304を実装する。データの特定の型は、スキーマ340などのスキーマで記述され、ストレージプラットフォーム300は、以下で詳しく説明するように、それらのスキーマを展開するとともに、それらのスキーマを拡張するためのツール346を備える。
データストア302内に実装された変更追跡メカニズム306は、データストアへの変更を追跡する機能を備える。データストア302は、さらに、セキュリティ機能308および格上げ(promotion)/格下げ(demotion)機能310も備え、両方とも以下で詳述する。データストア302は、さらに、一組のアプリケーションプログラミングインターフェース312を備え、データストア302の機能を他のストレージプラットフォームコンポーネントおよびそのストレージプラットフォームを利用するアプリケーションプログラム(例えば、アプリケーションプログラム350a、350b、および350c)に公開する。
本発明のストレージプラットフォームは、さらに、アプリケーションプログラム350a、350b、および350cなどのアプリケーションプログラムを、ストレージプラットフォームの前記の機能すべてにアクセスできるようにし、スキーマで記述されたデータにアクセスできるようにするアプリケーションプログラミングインターフェース(API)322を備える。ストレージプラットフォームAPI322は、アプリケーションプログラムにより、OLE DB API324およびMicrosoft Windows(登録商標)Win32 API326などの他のAPIと併用することができる。
本発明のストレージプラットフォーム300は、ユーザまたはシステム間でのデータの共有を円滑にする同期処理サービス330を含む、様々なサービス328をアプリケーションプログラムに提供することができる。例えば、同期処理サービス330では、データストア302と同じ形式を持つ他のデータストアとの相互運用性とともに、他の形式を持つデータストアへのアクセスをも可能にすることができる。ストレージプラットフォーム300は、さらに、データストア302とWindows(登録商標)NTFSファイルシステム318などの既存のファイルシステムとの相互運用を可能にするファイルシステムの機能をも備える。
少なくとも一部の実施形態では、ストレージプラットフォーム300は、さらに、データへの操作を可能にし、また他のシステムとのやり取りを可能にするための追加機能をアプリケーションプログラミングに付加することもできる。これらの機能は、Info Agentサービス334および通知サービス332などの追加サービスの形態だけでなく、他のユーティリティ336の形態で具現化することができる。
少なくとも一部の実施形態では、ストレージプラットフォームは、コンピュータシステムのハードウェア/ソフトウェアインターフェースシステム内に具現化されるか、またはそのなくてはならない一部を形成する。例えば、限定はしないが、本発明のストレージプラットフォームは、オペレーティングシステム、仮想マシンマネージャ(VMM)、共通言語ランタイム(CLR)またはその機能的等価物、またはJava(登録商標)仮想マシン(JVM)またはその機能的等価物で具現化されるか、またはそのなくてはならない一部を形成することができる。
本発明のストレージプラットフォームは、共通のストレージ基盤および図式化された(schematized)データを通じて、消費者、知識労働者、および企業に、より効率的なアプリケーション開発を行わせることができる。これは、データモデルに固有の機能を利用可能にするだけでなく、既存のファイルシステムおよびデータベースアクセス方法も包含し、拡張する機能豊富な拡張可能プログラミングサーフェスエリア(programming surface area)を提供する。
以下の説明、および様々な図において、本発明のストレージプラットフォーム300は、「WinFS」と呼ぶことができる。しかし、この名称を使用してストレージプラットフォームを指すのは、説明の便宜上のことにすぎず、決して限定することを意図していない。
C.データモデル
本発明のストレージプラットフォーム300のデータストア302は、ストア内に置かれているデータの編成、検索、共有、同期、およびセキュリティをサポートするデータモデルを実装する。本発明のデータモデルでは、「Item」は、ストレージ情報の基本ユニットである。このデータモデルは、以下で詳述するが、ItemおよびItem拡張を宣言し、Item間の関係を確立し、Item FoldersとCategories内にItemを編成するためのメカニズムを備える。
データモデルは、TypesとRelationshipsという2つのプリミティブなメカニズムに依存している。Typesは、Typeのインスタンスの形態を制御する形式を定める構造である。その形式は、Propertiesの順序集合として表される。Propertyは、与えられたTypeの値または値の集合に対する名前である。例えば、USPostalAddress型は、プロパティStreet、City、Zip、Stateを持つことができ、その中で、Street、City、StateはString型であり、ZipはType Int32である。Streetプロパティに対しアドレスは複数の値をとりうるので、Streetは、多値(つまり、値の集合)とすることができる。システムでは、他の型の構成で使用できるいくつかのプリミティブ型を定義している−これらは、String、Binary、Boolean、Int16、Int32、Int64、Single、Double、Byte、DateTime、Decimal、およびGUIDを含む。TypeのPropertiesは、プリミティブ型のどれか、または(下記のいくつかの制約があるが)構成された型のどれかを使用して定義することができる。例えば、Properties CoordinateとAddressを持つLocation Typeが定義されうるが、Address Propertyは上述のようにType USPostalAddressである。Propertiesは、さらに、必須またはオプションとすることもできる。
Relationshipsは、2つの型のインスタンスの集合の間のマッピングとして宣言され、それを表すことができる。例えば、Person Typeと、どの人々がどの場所に住んでいるかを定義するLivesAtと呼ばれるLocation Typeとの間のRelationshipを宣言することができる。Relationshipは、1つの名前、2つの終点、つまり、ソース終点とターゲット終点を持つ。Relationshipsは、さらに、プロパティの順序集合を持つこともできる。SourceとTargetの終点は両方ともNameとTypeを持つ。例えば、LivesAt Relationshipは、Type PersonのOccupantと呼ばれるSource、およびType LocationのDwellingと呼ばれるTargetを持ち、さらに、居住者(occupant)がその住居(dwelling)に住んでいた期間を示すプロパティStartDateおよびEndDateを持つ。Personは、長い目で見ると複数の住居に居住する可能性があり、また住居には複数の住人がいる場合もあるので、StartDateおよびEndDate情報を入れるために最も適した場所は、関係(relationship)自体であることに注意されたい。
Relationshipsは、終点の型として与えられた型により制約されるインスタンス間のマッピングを定義する。例えば、LivesAt Relationshipは、AutomobileがOccupantである関係とはなりえない。というのも、AutomobileはPersonではないからである。
データモデルは、型の間の子型−親型関係(subtype-supertype relationship)の定義を許容する。BaseType関係とも呼ばれる子型−親型関係は、Type AがType Bに対しBaseTypeならば、Bのすべてのインスタンスは、Aのインスタンスでもあるというように定義される。これを表現するもう1つの方法は、Bに適合するすべてのインスタンスが、さらにAにも適合しなければならないとするものである。例えば、AがType StringのプロパティNameを持つが、BはType Int16のプロパティAgeを持つ場合、Bのインスタンスはどれも、NameとAgeの両方を持たなければならないということになる。型階層は、ルートに一つの親型(supertype)を有するツリーと考えることができる。ルートからの分岐は、第1レベルの子型(subtype)を定め、このレベルの分岐は、第2レベルの子型を定め、というように、それ自体子型を持たない最も先端の葉である子型へ進む。ツリーは、均一な深さとなるように制約されないが、循環を含むことはできない。与えられたTypeは、0個またはそれ以上の子型と0個または1個の親型を持つことができる。与えられたインスタンスは、その型の親型とともに1つの型に適合することができる。別の言い方をすると、ツリー内の任意のレベルにおいて与えられたインスタンスについて、そのインスタンスはそのレベルにおいて1つの子型に適合することができるということである。
型は、型のインスタンスがさらにその型の子型のインスタンスでもなければならない場合にAbstractという。
1.Items
Itemは、単純ファイルとは異なり、ストレージプラットフォームによりエンドユーザまたはアプリケーションプログラムに対し公開されるすべてのオブジェクトにわたって一般的にサポートされるプロパティの基本集合を持つオブジェクトである格納可能情報のユニットである。Itemは、さらに、以下で説明するように、新しいプロパティおよび関係を導入することができる機能を含むすべてのItem型にわたって一般的にサポートされるプロパティおよび関係も有する。
Itemは、コピー、削除、移動、開く、印刷、バックアップ、リストア、複製などの共通オペレーション用のオブジェクトである。Itemは、格納し、取り出すことのできるユニットであり、ストレージプラットフォームにより操作される格納可能情報のすべての形態が、Item、Itemのプロパティ、またはItem間のRelationshipsとして存在し、それぞれについては以下で詳述される。
Itemは、(あらゆる種類の)Contacts、People、Services、Locations、Documentsなどの現実世界の容易に理解できるデータのユニットを表すことを意図されている。図5Aは、Itemの構造を例示するブロック図である。Itemの未修飾の名前は「Location」である。Itemの修飾名は「Core.Location」であり、これは、このItem構造がCore Schema内のItemの特定の型として定義されることを示している。(Core Schemaについては、本明細書の後のほうで詳しく説明する。)
Location Itemは、EAddresses、MetropolitanRegion、Neighborhood、およびPostalAddressesを含む複数のプロパティを持つ。それぞれに対するプロパティの特定の型は、プロパティ名の直後に示され、コロン(「:」)でプロパティ名と区切られる。型名の右には、そのプロパティ型について許された値の個数があり、これは角括弧(「[ ]」)の間に示され、コロン(「:」)の右にあるアスタリスク(「*」)は、未指定および/または無制限の数(「many」)を示す。コロンの右にある「1」は、1つの値がありえることを示す。コロンの左にあるゼロ(「0」)はプロパティがオプションであることを示す(値がまったくない場合もある)。コロンの左にある「1」は、少なくとも1つの値がなければならないことを示す(プロパティは必須である)。NeighborhoodおよびMetropolitanRegionは、両方とも、定義済みのデータ型または「単純型」(また、本明細書では大文字使用でないことにより表される)である、型「nvarchar」(または同等の型)である。しかし、EAddressesおよびPostalAddressesは、それぞれ型EAddressおよびPostalAddressの定義済み型または「複合型」(本明細書では大文字使用で表される)のプロパティである。複合型は、1つまたは複数の単純データ型および/または他の複合型から派生した型である。Itemのプロパティに対する複合型は、さらに、複合型の詳細はそのプロパティを定義するためにイミディエイトItem内にネストされるため「ネストされた要素」も構成し、それらの複合型に関係する情報は、(本明細書な後のほうで説明するように、Itemの境界内の)それらのプロパティを持つItemとともに保持される。型付け(typing)のこれらの概念は、よく知られており、当業者であれば容易に理解できる。
図5Bは、複合プロパティ型PostalAddressおよびEAddressを例示するブロック図である。PostalAddressプロパティ型は、プロパティ型PostalAddressのItemが0または1つのCity値、0または1つのCountryCode値、0または1つのMailStop値、および任意の数(0から多数)のPostalAddressTypesなどを持つことを予想できるものとして定義する。このようにして、Item内の特定のプロパティに対するデータの形状が定義される。EAddressプロパティ型も、同様に、示されているように定義される。このApplicationにおいてオプションにより使用されるが、Location Item内の複合型を表すもう1つの方法は、Itemをそこにリストされている複合型の個々のプロパティで描画することである。図5Cは、複合型がさらに記述されるLocation Itemを例示するブロック図である。しかし、この図5C内のLocation Itemのこの代替表現は、図5Aに例示されているものとまったく同じItemに対するものであると理解すべきである。本発明のストレージプラットフォームでは、さらに、サブタイプ化も可能であり、それによって、一方のプロパティ型を他方の子型とすることができる(ただし、一方のプロパティ型は他方の親のプロパティ型のプロパティを継承する)。
プロパティおよびそのプロパティ型と同様のItemは、本質的に、サブタイプ化の対象ともなりうる自Item Typesを表す。つまり、本発明のいくつかの実施形態におけるストレージプラットフォームでは、Itemを他のItemの子型とすることができるということである(それによって、一方のItemは他方の親Itemのプロパティを継承する)。さらに、本発明の様々な実施形態について、すべてのItemはBase Schemaに見られる第1の、基礎的なItem型である「Item」Item型の子型である。(Base Schemaは、さらに、本明細書の後のほうで詳しく説明される。)図6Aは、Item、つまりこのInstanceのLocation ItemをBase SchemaにあるItem Item型の子型であるとして例示している。この図面では、矢印は、(他のすべてのItemのような)Location Itemが、Item Item型の子型であることを示している。Item Item型は、他のすべてのItemの派生元である基礎的なItemとして、ItemIdおよび様々なタイムスタンプなどの重要なプロパティを多数持ち、それによって、オペレーティングシステムにおいて、すべてのItemの標準プロパティを定義する。この図では、Item Item型のこれらのプロパティは、Locationにより継承され、それによって、Locationのプロパティになる。
Item Item型から継承されたLocation Itemにおいてプロパティを表す他の方法は、そこにリストされている親Itemから各プロパティ型の個々のプロパティでLocationを描画することである。図6Bは、イミディエイトプロパティに加えて継承型が記述されるLocation Itemを例示するブロック図である。このItemは図5Aに例示されているのと同じItemであるが、この図では、Locationはそのプロパティのすべてとともに例示されており、両方ともイミディエイトであり−この図と図5Aの両方に示されている−および継承される−この図に示されているが、図5Aには示されていない−ことに注意し、理解されたい(しかし、図5Aでは、Location ItemがItem Item型の子型であることを矢印で示すことによりそれらのプロパティが参照されている)。
Itemは、スタンドアロンのオブジェクトであり、そのため、Itemを削除すると、それらのItemのイミディエイトおよび継承プロパティもすべて削除される。同様に、Itemを取り出した場合に受け取る内容は、Itemおよびそのイミディエイトおよび継承プロパティのすべて(複合プロパティ型に関係する情報を含む)である。本発明のいくつかの実施形態では、特定のItemを取り出す際にプロパティの部分集合を要求することが可能であるが、そのような実施形態の多くの既定(default)として、取り出したときにイミディエイトおよび継承プロパティのすべてをItemに供給する。さらに、Itemのプロパティは、新しいプロパティをそのItemの型の既存のプロパティに追加することにより拡張することもできる。これらの「拡張」は、これ以降、Itemの本物のプロパティであり、そのItem型の子型は、自動的に、拡張プロパティを含むことができる。
Itemの「境界」は、そのプロパティ(複合プロパティ型、拡張などを含む)により表される。Itemの境界は、さらに、コピー、削除、移動、作成などのItemに対し実行されるオペレーションの限界も表す。例えば、本発明のいくつかの実施形態では、Itemがコピーされる場合、そのItemの境界内にあるものもすべてコピーされる。Item毎に、境界は以下を包含する。
・ ItemのItem Type、およびItemが他のItemの子型の場合(すべてのItemがBase Schema内の単一ItemおよびItem Typeから派生する本発明のいくつかの実施形態の場合のように)は、任意の適用可能な子型情報(つまり、親Item Typeに関係する情報)。コピー元のオリジナルのItemが他のItemの子型の場合、そのコピーも、その同じItemの子型ともなりうる。
・ もしあればItemの複合型プロパティおよび拡張。オリジナルのItemが複合型のプロパティ(ネイティブまたは拡張)を持つ場合、そのコピーも同じ複合型を持ちうる。
・ 「所有関係」に関するItemのレコード、つまり、このItem(「Owning Item」)によって所有される他のItem(「Target Item」)のItem自身のリスト。これは、特に、以下で詳しく説明する、Item Foldersに関して特に適切であり、規則では、すべてのItemは少なくとも1つのItem Folderに属していなければならないことを以下で規定している。さらに、埋め込まれているアイテム−以下でさらに詳しく説明する−に関しては、埋め込みアイテムは、コピー、削除などのオペレーションに対して埋め込まれているItemの一部と考えられる。
2.Itemの識別
Itemは、ItemIDを持つ大域的アイテム空間(global items space)内で一意に識別される。Base.Item型は、ItemのIDを格納する型GUIDのフィールドItemIDを定義する。Itemは、データストア302内にちょうど1つのIDを持たなければならない。
a)アイテム参照
アイテム参照は、Itemを特定し、識別するための情報を格納するデータ構造体である。データモデルでは、抽象型は、すべてのアイテム参照型の派生元のItemReferenceという名前を持つものとして定義される。ItemReference型は、Resolveという名前の仮想メソッドを定義する。Resolveメソッドは、ItemReferenceを解決して、Itemを返す。このメソッドは、参照が与えられているItemを取り出す関数を実装するItemReferenceの具体的な子型によりオーバーライドされる。Resolveメソッドは、ストレージプラットフォームAPI322の一部として呼び出される。
(1)ItemIDReference
ItemIDReferenceはItemReferenceの子型である。これは、LocatorおよびItemIDフィールドを定義する。Locatorフィールドは、アイテム領域(domain)に名前を付ける(つまり、識別する)。これは、Locatorの値をアイテム領域に解決することができるロケータ解決メソッドにより処理される。ItemIDフィールドは、ItemID型である。
(2)ItemPathReference
ItemPathReferenceは、LocatorおよびPathフィールドを定義するItemReferenceの特殊化(specializaiton)である。Locatorフィールドは、アイテム領域を識別する。これは、Locatorの値をアイテム領域に解決することができるロケータ解決メソッドにより処理される。Pathフィールドは、Locatorにより与えられるアイテム領域をルートとするストレージプラットフォーム名前空間内の(相対)パスを含む。
この型の参照は、setオペレーションで使用することはできない。参照は、一般に、パス解決プロセスを通じて解決されなければならない。ストレージプラットフォームAPI322のResolveメソッドは、この機能を備える。
b)参照型階層
上述の参照形態は、図11に例示されている参照型階層を通じて表される。これらの型から継承する追加参照型は、スキーマで定義することができる。それらは、ターゲットフィールドの型として関係宣言の中で使用することができる。
3.Item FoldersおよびCategories
以下で詳しく説明するが、Itemのグループは、Item Folders(ファイルフォルダと混同すべきでない)と呼ばれる特別なItemに編成されることができる。しかし、大半のファイルシステムとは異なり、Itemは、複数のItem Folderに属すことができ、そのため、Itemが一方のItem Folderでアクセスされ改訂された場合、この改訂されたItemは、他方のItemフォルダから直接アクセスすることができる。本質的に、Itemへのアクセスは異なるItem Foldersから発生しうるが、実際にアクセスされる内容は、事実、まったく同じItemである。しかし、Item Folderは、必ずしも、そのメンバItemのすべてを所有するわけではなく、または単に、他のフォルダとともにItemを共同所有することができ、Item Folderを削除しても、その結果Itemの削除も必ずしも行われるわけではない。しかしながら、本発明のいくつかの実施形態では、Itemは、少なくとも1つのItem Folderに属していなければならず、したがって、特定のItemに対する単独のItem Folderが削除されると、ある実施形態では、Itemは自動的に削除されるか、または他の実施形態では、Itemは自動的に、既定のItem Folder(例えば、様々なファイル−フォルダベースのシステムで使用される類似名フォルダと概念上類似の「Trash Can」Item Folder)のメンバとなる。
また以下で詳述するが、Itemは、さらに、(a)Item Type(またはTypes)、(b)特定のイミディエイトまたは継承プロパティ(または複数のプロパティ)、または(c)Itemプロパティに対応する特定の値(または複数の値)などの共通の記述されている特性に基づいてCategoriesに属している場合がある。例えば、個人連絡情報の特定のプロパティを含むItemは、自動的にContact Categoryに属すことがあり、そうすれば連絡先情報プロパティを含むItemも同様に、自動的にこのCategoryに属するのである。同様に、値「New York City」を持つ位置プロパティが設定されているItemであれば、自動的にNew York City Categoryに属すことが可能である。
Item Foldersは相互関連性のない(つまり、共通の記述された特性を持たない)Itemを含むことができるが、Category内のそれぞれのItemは、そのCategoryについて記述された共通の型、プロパティ、または値(「共通性」)を持ち、Category内の他のItemとの関係、および他のItem同士の間の関係の基礎をなすことがこの共通性であるという点において、Categoriesは、Item Foldersと概念上異なる。さらに、特定のFolderへのItemの帰属関係(membership)は、そのItemの特定の態様に基づく強制的なものではないが、いくつかの実施形態では、共通性がカテゴリについてCategoryに関係しているすべてのItemは、ハードウェア/ソフトウェアインターフェースシステムレベルにおいてCategoryのメンバに自動的になることが可能である。概念上、Categoriesは、帰属関係が特定のクエリの結果に基づく(データベースを背景とした場合のように)仮想Item Foldersと考えることもでき、また(Categoryの共通性により定義された)このクエリの条件を満たすItemは、Categoryの帰属関係を含むであろう。
図4は、本発明の様々な実施形態におけるItem、Item Folder、およびCategory間の構造的関係を例示する。複数のItem402、404、406、408、410、412、414、416、418、および420は、様々なItem Folders422、424、426、428、および430のメンバである。複数のItem Folderに属すItemもあり、例えば、Item402はItem Folders422および424に属している。いくつかのItem、例えば、Item402、404、406、408、410、および412は、1つまたは複数のCategories432、434、および436のメンバでもあるが、例えば、Item414、416、418、および420はどのCategoriesにも属しえない(ただし、これはプロパティの所有が自動的にCategoryへの帰属を意味するいくつかの実施形態ではほとんどありえず、Itemは、そのような実施形態におけるカテゴリのメンバとならないためには完全に無特徴でなければならないであろう)。フォルダの階層構造と対照的に、CategoriesとItem Foldersは両方とも、図に示されているように有向グラフに比較的類似している。いずれにせよ、Item、Item Folders、およびCategoriesは、(異なるItem Typesであるにもかかわらず)すべてItemである。
ファイル、フォルダ、およびディレクトリとは対照的に、本発明のItem、Item Folders、およびCategoriesについては、物理的コンテナに相当する概念がなく、したがって、Itemはそのような複数の場所に存在する可能性があるため、本質的に「物理的」という特徴を持たない。Itemが複数のItem Folderロケーションで存在できることとともに、Categoriesに編成されることにより、当業で現在利用できるレベルを超える、ハードウェア/ソフトウェアインターフェースレベルにおいて、データ操作およびストレージ構造の機能が高められ、豊富になっている。
4.Schemas
a)Base Schema
Itemの作成および使用に普遍的基盤を用意するため、本発明のストレージプラットフォームの様々な実施形態は、Itemおよびプロパティの作成および編成に使用する概念フレームワークを確立するBase Schemaを備える。Base Schemaは、Itemおよびプロパティのいくつかの特殊な型、および子型をさらに派生することができる派生元のこれらの特別な基礎型の特徴を定義する。このBase Schemaを使用することにより、プログラマは、Item(およびそれぞれの型)をプロパティ(およびそれぞれの型)から概念的に区別することができる。さらに、Base Schemaでは、すべてのItem(およびその対応するItem Types)がBase Schema内のこの基礎的なItem(およびその対応するItem Type)から派生するときにすべてのItemが所有することができるプロパティの基礎的な集合を規定する。
図7に例示されているように、また本発明のいくつかの実施形態に関して、Base Schemaは、Item、Extension、およびPropertyBaseという3つの最上位の型を定義する。図に示されているように、Item型は、この基礎的な「Item」Item型のプロパティにより定義される。対照的に、最上位レベルのプロパティ型「PropertyBase」は、定義済みプロパティを持たず、他のすべてのプロパティ型の派生元となる、すべての派生プロパティ型が相互に関係付けられる際の単なるアンカーにすぎない(通常は単一のプロパティ型から派生する)。Extension型プロパティは、Itemが複数の拡張を持つ可能性があるときに、拡張でどのItemが拡張されるかを定義するとともに、一方の拡張を他方の拡張から区別するための識別をも定義する。
ItemFolderは、Itemから継承されたプロパティに加えて、(もしあれば)メンバへのリンクを確立するRelationshipを特徴とするItem Item型の子型であるが、IdentityKeyとPropertyは両方とも、PropertyBaseの子型である。同様に、CategoryRefは、IdentityKeyの子型である。
b)Core Schema
本発明のストレージプラットフォームの様々な実施形態は、さらに、最上位レベルのItem型構造の概念フレームワークを提供するCore Schemaを含む。図8Aは、Core Schema内のItemを例示するブロック図であり、図8Bは、Core Schema内のプロパティ型を例示するブロック図である。異なる拡張子(*.com、*.exe、*.bat、*.sysなど)を持つファイルとファイル−フォルダベースのシステムのそのような他の基準を持つファイルとの区別は、Core Schemaの関数に類似している。Core Schemaが、Itemベースのハードウェア/ソフトウェアインターフェースシステムでは、直接的に(Item型により)または間接的に(Item子型により)、すべてのItemを、Itemベースのハードウェア/ソフトウェアインターフェースシステムが理解し、所定の予測可能な方法で直接処理できる1つまたは複数のCore Schema Item型に特徴付ける、コアItem型の集合を定義する。定義済みItem型は、Itemベースのハードウェア/ソフトウェアインターフェースシステム内の最も一般的なItemを反映し、したがって、一定レベルの効率が、Core Schemaを含む定義済みItem型を認識するItemベースのハードウェア/ソフトウェアインターフェースシステムにより得られる。
いくつかの実施形態では、Core Schemaは拡張可能でない−つまり、Core Schemaの一部である特定の定義済み派生Item型を除き、追加Item型を直接、Base SchemaのItem型からサブタイプ化することはできない。後続のすべてのItem型が必ずCore Schema Item型の子型であるため、Core Schemaへの拡張を禁止することにより(つまり、新しいItemをCore Schemaに追加することを禁止することにより)、ストレージプラットフォームはCore Schema Item型の使用を必須とする。この構造により、コアItem型の定義済み集合を持つ利点も維持しながら、追加Item型を定義する自由度も十分に高められる。
本発明の様々な実施形態について、図8Aを参照すると、Core Schemaによってサポートされている特定のItem型は以下のうちの1つまたは複数を含むことができる。
・ Categories:このItem Type(およびそれから派生した子型)のItemは、Itemベースのハードウェア/ソフトウェアインターフェースシステムの有効なCategoriesを表す。
・ Commodities:価値を有する識別可能なものであるItem。
・ Devices:情報処理機能をサポートする論理構造を備えるItem。
・ Documents:Itemベースのハードウェア/ソフトウェアインターフェースシステムにより解釈されないが、代わりにドキュメント型に対応するアプリケーションプログラムにより解釈されるコンテンツを持つItem。
・ Events:環境内で生じた何らかの出来事を記録するItem。
・ Locations:物理的場所を表すItem(例えば、地理的場所)。
・ Messages:2つ以上のプリンシパルの間の通信のItem(以下に定義する)。
・ Principals:ItemIDだけでなく少なくとも1つの決定的に証明可能なIDを持つItem(例えば、人、組織、グループ、世帯、機関、サービスなどの識別)。
・ Statements:限定はしないが、ポリシー、サブスクリプション、信用(credentials)などを含む環境に関する特別な情報を持つItem。
同様に、図8Bを参照すると、Core Schemaによってサポートされている特定のプロパティ型は以下のうちの1つまたは複数を含むことができる。
・ Certificates(Base Schema内の基礎的なPropertyBase型から派生)
・ Principal Identity Keys(Base Schema内のIdentityKey型から派生)
・ Postal Address(Base Schema内のProperty型から派生)
・ Rich Text(Base Schema内のProperty型から派生)
・ EAddress(Base Schema内のProperty型から派生)
・ IdentitySecurityPackage(Base Schema内のRelationship型から派生)
・ RoleOccupancy(Base Schema内のRelationship型から派生)
・ BasicPresence(Base Schema内のRelationship型から派生)
これらのItemおよびPropertiesは、さらに、図8Aおよび図8Bで述べられているそれぞれのプロパティにより記述される。
5.関係
Relationshipsは、一方のItemがソースとして指定され、他方のItemがターゲットとして指定されている2項関係である。ソースItemおよびターゲットItemは、この関係によって関連付けられる。ソースItemは、一般に、関係の存続期間を制御する。つまり、ソースItemが削除されるとそれらのItem間の関係も削除されるということである。
Relationshipsは、包含関係Containmentと参照関係Referenceに分類される。包含関係は、ターゲットItemの存続期間を制御するが、参照関係は、存続期間管理の意味を持たない。図12は、関係が分類される仕方を例示している。
Containment関係型は、さらに、保持関係Holdingと埋め込み関係Embeddingに分類される。Itemに対するすべての保持関係が削除されると、そのItemも削除される。保持関係は、参照カウントメカニズムを使ってターゲットの存続期間を制御する。埋め込み関係を使用すると、複合Itemのモデル化が可能になり、これは排他的保持関係と考えることができる。Itemは、1つまたは複数の保持関係のターゲットとすることができるが、Itemは、正確に1つの埋め込み関係のターゲットとすることができる。埋め込み関係のターゲットであるItemは、その他の保持または埋め込み関係のターゲットとすることはできない。
参照関係は、ターゲットItemの存続期間を制御しない。これらは、宙ぶらりんになっていることがある−ターゲットItemが存在しない場合がある。参照関係は、大域的Item名前空間(つまり、リモートデータストアを含む)内のどこかにあるItemへの参照をモデル化するために使用できる。
Itemをフェッチしても、その関係は自動的にフェッチされない。アプリケーション側で、Itemの関係を明示的に要求しなければならない。さらに、関係を修正しても、ソースまたはターゲットItemは修正されず、同様に、関係を追加しても、ソース/ターゲットItemに影響は及ばない。
a)関係の宣言
明示的関係型は、以下の要素により定義される。
・ 関係名は、Name属性で指定される。
・ 関係型として、Holding、Embedding、Referenceのうちの1つ。これは、Type属性において指定される。
・ ソースおよびターゲット終点。それぞれの終点は、参照されているItemの名前および型を指定する。
・ ソース終点フィールドは、一般的に、ItemID型(宣言されない)であり、関係インスタンスと同じデータストア内のItemを参照しなければならない。
・ HoldingおよびEmbedding関係については、ターゲット終点フィールドは、ItemIDReference型でなければならず、関係インスタンスと同じストア内のItemを参照しなければならない。Reference関係については、ターゲット終点は任意のItemReference型でよく、その他のストレージプラットフォームのデータストア内のItemを参照することができる。
・ オプションにより、スカラーまたはPropertyBase型の1つまたは複数のフィールドを宣言することができる。これらのフィールドは、関係に関連付けられたデータを格納することができる。
・ 関係インスタンスは、大域的関係テーブル内に格納される。
・ すべての関係インスタンスは、組合せ(ソースItemID、関係ID)により一意に識別される。関係IDは、その型に関係なく与えられたItemをソースとするすべての関係について、与えられたソースItemID内で一意である。
ソースItemは、関係の所有者である。所有者として指定されているItemは関係の存続期間を制御するが、関係自体はそれが関係するItemとは別である。ストレージプラットフォームAPI322は、Itemと関連する関係を公開するメカニズムを提供する。
関係宣言の一実施例を以下に示す。
Figure 0004394644
これは、Reference関係の一実施例である。この関係は、ソース参照によって参照された人の(person)Itemが存在しない場合には作成することはできない。さらに、人の(person)Itemが削除された場合、人(person)と組織(organization)との間の関係インスタンスが削除される。しかし、Organization Itemが削除された場合、関係は削除されず、宙ぶらりんになる。
b)保持(Holding)Relationship
保持関係は、ターゲットItemの参照カウントベースの存続期間管理をモデル化するために使用される。
Itemは、Itemとの0またはそれ以上の関係に対するソース終点とすることができる。埋め込まれたItemではないItemは、1つまたは複数の保持関係におけるターゲットとすることができる。
ターゲット終点参照型は、ItemIDReferenceでなければならず、また関係インスタンスと同じストア内のItemを参照しなければならない。
保持関係は、ターゲット終点の存続期間管理を行う。保持関係インスタンスおよびそれがターゲットとしているItemの作成は、アトミックオペレーションである。同じItemをターゲットとしている追加保持関係インスタンスの作成が可能である。与えられたItemをターゲット終点として持つ最後の保持関係インスタンスが削除されると、ターゲットItemも削除される。
関係宣言内で指定される終点Itemの型は、一般的に、関係のインスタンスが作成されるときに強制される。関係が確立された後では、終点Itemの型は変更できない。
保持関係は、Item名前空間を形成する際に重要な役割を果たす。これらは、ソースItemに相対的にターゲットItemの名前を定義する「Name」プロパティを含む。この相対名は、与えられたItemから生じるすべての保持関係について一意である。ルートItemから始まり与えられたItemに至るこの相対名の順序付けされたリストは、Itemに対するフルネームを形成する。
保持関係は、非循環有向グラフ(DAG)を形成する。保持関係が作成されると、システムは、サイクルが作成されないことを保証し、Item名前空間がDAGを必ず形成する。
保持関係はターゲットItemの存続期間を制御するが、ターゲット終点Itemの動作の整合性を制御しない。ターゲットItemは、保持関係を通じてそれを所有するItemから、動作に関して独立している。保持関係のソースであるItemに対するCopy、Move、Backup、およびその他のオペレーションは、同じ関係のターゲットであるItemに影響を及ぼさない−例えば、つまり、Folder Itemをバックアップしても、すべてのItemをフォルダ(FolderMember関係のターゲット)内に自動的にバックアップするわけではない。
以下は、保持関係の一実施例である。
Figure 0004394644
FolderMembers関係は、Folderの概念をItemのジェネリックコレクションとして使用可能にする。
c)埋め込み(Embedding)関係
埋め込み関係は、ターゲットItemの存続期間の排他的制御という概念をモデル化する。これらは、複合Itemの概念を有効にする。
埋め込み関係インスタンスおよびそれがターゲットとしているItemの作成は、アトミックオペレーションである。Itemは、0またはそれ以上の埋め込み関係のソースとすることができる。しかし、Itemは、唯一の埋め込み関係のターゲットとすることができる。埋め込み関係のターゲットであるItemは、保持関係のターゲットとすることはできない。
ターゲット終点参照型は、ItemIDReferenceでなければならず、また関係インスタンスと同じデータストア内のItemを参照しなければならない。
関係宣言内で指定される終点Itemの型は、一般的に、関係のインスタンスが作成されるときに強制される。関係が確立された後では、終点Itemの型は変更できない。
埋め込み関係は、ターゲット終点の動作の整合性を制御する。例えば、Itemをシリアライズするオペレーションは、そのItemをソースとするすべての埋め込み関係だけでなく、そのターゲットのすべてのシリアライズをも含むことができ、Itemをコピーすることで、そのすべての埋め込まれているItemもコピーされる。
以下は、宣言例である。
Figure 0004394644
d)参照関係
参照関係は、参照するItemの存続期間を制御しない。さらには、参照関係は、ターゲットの存在を保証せず、また関係宣言内で指定された通りにターゲットの型を保証するわけでもない。これは、参照関係が宙ぶらりんになる可能性のあることを意味している。また、参照関係は、他のデータストア内のItemを参照することができる。参照関係は、Webページ内のリンクに類似の概念として考えることができる。
参照関係宣言の一例を以下に示す。
Figure 0004394644
参照型は、ターゲット終点において使用できる。参照関係に関わるItemは、任意のItem型とすることができる。
参照関係は、Item間のほとんどの非存続期間管理関係をモデル化するために使用される。ターゲットの存在は強制されないので、参照関係は、疎結合関係をモデル化するために都合がよい。参照関係は、他のコンピュータ上のストアを含む他のデータストア内のItemをターゲットとするために使用することができる。
e)規則と制約条件
以下の追加規則および制約条件を関係について適用する。
1.Itemは、(ちょうど1つの埋め込み関係)または(1つまたは複数の保持関係)のターゲットでなければならない。例外の1つは、ルートItemである。Itemは、0またはそれ以上の参照関係のターゲットとすることができる。
2.埋め込み関係のターゲットであるItemは、保持関係のソースとすることはできない。これは、参照関係のソースとすることができる。
3.Itemはファイルから格上げされた場合、保持関係のソースとすることはできない。これは、埋め込み関係および参照関係のソースとすることができる。
4.ファイルから格上げされたItemは、埋め込み関係のターゲットとすることはできない。
f)関係の順序付け
少なくとも一実施形態では、本発明のストレージプラットフォームは、関係の順序付けをサポートする。順序付けは、基本関係定義の中で「Order」という名前のプロパティを通じて実行される。Orderフィールド上には一意性制約条件はない。同じ「順序」プロパティ値を持つ関係の順序は保証されないが、低い「順序」の値を持つ関係の後、および高い「順序」フィールド値を持つ関係の前に、順序付けできることが保証される。
アプリケーションは、組合せ(SourceItemID、RelationshipID、Order)の順序付けによって既定の順序で関係を取得することができる。与えられたItemをソースとするすべての関係インスタンスは、単一のコレクションとして、そのコレクション内の関係の型と関係なく、順序付けされる。しかし、これは、与えられた型(例えば、FolderMembers)のすべての関係が、与えられたItemに対する関係コレクションの順序付き部分集合であることを保証する。
関係を操作するデータストアAPI312は、関係の順序付けをサポートするオペレーションの集合を実装している。以下の用語は、オペレーションを説明する補助として導入される。
RelFirstは、順序値OrdFirstを持つ順序付きコレクション内の最初の関係である。
RelLastは、順序値OrdLastを持つ順序付きコレクション内の最後の関係である。
RelXは、順序値OrdXを持つコレクション内の与えられた関係である。
RelPrevは、順序値OrdPrevがOrdXよりも小さい、コレクション内のRelXとの最も近い関係である。
RelNextは、順序値OrdNextがOrdXよりも大きい、コレクション内のRelXとの最も近い関係である。
InsertBeforeFirst (SourceItemID, Relationship)
関係を第1の関係としてコレクション内に挿入する。新しい関係の「Order」プロパティの値はOrdFirstよりも小さい場合がある。
InsertAfterLast (SourceItemID, Relationship)
関係を最後の関係としてコレクション内に挿入する。新しい関係の「Order」プロパティの値はOrdLastよりも大きい場合がある。
InsertAt (SourceItemID, ord, Relationship)
「Order」プロパティに対する指定された値を持つ関係を挿入する。
InsertBefore (SourceItemID, ord, Relationship)
与えられた順序値を持つ関係の前に関係を挿入する。新しい関係には、OrdPrevとordの間の、しかもそれを含まない、「Order」値を割り当てることができる。
InsertAfter (SourceItemID, ord, Relationship)
与えられた順序値を持つ関係の後に関係を挿入する。新しい関係には、ordとOrdNextの間の、しかもそれを含まない、「Order」値を割り当てることができる。
MoveBefore (SourceItemID, ord, RelationshipID)
与えられた関係IDを持つ関係を指定された「Order」値を持つ関係の前に移動する。この関係には、OrdPrevとordの間の、しかもそれを含まない、新しい「Order」値を割り当てることができる。
MoveAfter (SourceItemID, ord, RelationshipID)
与えられた関係IDを持つ関係を指定された「Order」値を持つ関係の後に移動する。この関係には、ordとOrdNextの間の、しかもそれを含まない、新しい順序値を割り当てることができる。
すでに述べたように、すべてのItemはItem Folderのメンバでなければならない。Relationshipsに関して、すべてのItemはItem Folderと関係を持っていなければならない。本発明のいくつかの実施形態では、Item間に存在するRelationshipsにより特定の関係が表される。
本発明の様々な実施形態で実装されているように、Relationshipは一方のItem(ソース)により他方のItem(ターゲット)に「拡張」される有向2項関係を実現する。Relationshipは、ソースItem(それを拡張したItem)により所有され、したがってRelationshipは、ソースが削除されると削除される(例えば、Relationshipは、ソースItemが削除されると削除される)。さらに、いくつかのインスタンスでは、Relationshipは、ターゲットItemの所有権を共有(共同所有)することができ、そのような所有権は、RelationshipのIsOwnedプロパティ(またはその等価物)内に反映されることが可能である(図7に、Relationshipプロパティ型について示されているように)。これらの実施形態では、新しいIsOwned Relationshipを作成すると、自動的にターゲットItemの参照カウントがインクリメントされ、そのようなRelationshipを削除すると、ターゲットItemの参照カウントがデクリメントされる。これらの特定の実施形態では、Itemは、参照カウントが0よりも大きければ存在し続け、カウントが0になった場合に自動的に削除される。ここでもまた、Item Folderは、他のItemとのRelationshipsの集合を持つ(または持つことができる)Itemであり、それらの他のItemは、Item Folderの帰属関係を含む。Relationshipsの他の実際の実装も可能であり、本発明により本明細書で説明されている機能を実現することが予想される。
実際の実装に関係なく、Relationshipは、一方のオブジェクトから他方のオブジェクトへの選択可能な接続である。Itemが複数のItem Folderに属すことができることとともに、1つまたは複数のCategoriesに属すことができること、さらに、これらのItem、Folders、およびCategoriesがパブリックであるかプライベートであるかは、Itemベースの構造内で存在すること(または存在しないこと)に対し与えられた意味により決定される。これらの論理的Relationshipsは、本明細書で説明されている機能を実現するために特に採用されている、物理的実装に関係ない、Relationshipsの集合に割り当てられた意味である。論理的Relationshipsは、ItemとそのItem Folder(s)またはCategoriesとの間で確立されている(およびその逆に)が、それは、本質的にItem FoldersおよびCategoriesはそれぞれItemの特殊な型であるからである。したがって、Item FoldersおよびCategoriesは、他のItemと同じようにして作用−限定はしないが、コピー、電子メールメッセージへの追加、ドキュメントへの埋め込み、など−を受けることができ、Item FoldersおよびCategoriesに対して、他のItemの場合と同じメカニズムを使用してシリアライズおよびデシリアライズ(インポートおよびエクスポート)を行うことができる。(例えば、XMLでは、すべてのItemは、シリアライズ形式を持つことができ、この形式はItem Folders、Categories、およびItemにも等しく適用される。)
前述のRelationshipsは、ItemとそれのItem Folder(s)と間の関係を表すが、ItemからItem Folderに、Item FolderからItemに、またはその両方に論理的に拡張することができる。論理的にItemからItem Folderに拡張するRelationshipは、Item FolderがそのItemに対しパブリックであることを表し、そのItemとの帰属関係情報を共有するが、逆に、ItemからItem Folderへの論理的Relationshipが存在しないことは、Item FolderがそのItemに対しプライベートであり、そのItemとの帰属関係情報を共有しないことを表す。同様に、Item FolderからItemに論理的に拡張するRelationshipは、ItemがそのItem Folderに対しパブリックであり共有可能であることを表すが、Item FolderからItemへの論理的Relationshipが存在しないことは、Itemがプライベートであり、非共有可能であることを表す。したがって、Item Folderは、他のシステムにエクスポートされる場合、新しい文脈で共有される「パブリック」Itemであり、ItemがそのItem Folders内で他の共有可能なItemを検索する場合、それは属する共有可能Itemに関する情報をItemに供給する「パブリック」Item Foldersである。
図9は、Item Folder(これもまた、Item自体である)、そのメンバItem、およびItem FolderとそのメンバItemとの間の相互接続Relationshipsを例示するブロック図である。Item Folder 900は、複数のItem 902、904、および906をメンバとして持つ。Item Folder 900は、Item 902がパブリックでありItem Folder 900、そのメンバ904および906、およびItem Folder 900にアクセスする可能性のある他のItem Folders、Categories、またはItem(図に示されていない)に対し共有可能であることを表す、それ自体からItem 902へのRelationship 912を持つ。しかし、Item Folder 900がItem 902に対しプライベートであり、Item 902と帰属関係情報を共有しないことを表す、Item 902からItem Folder 900へのRelationshipはない。他方、Item 904は、Item Folder 900がパブリックであり、Item 904と帰属関係情報を共有することを表す、それ自体からItem Folder 900へのRelationship 924を持つ。しかし、Item 904がプライベートであり、Item Folder 900、それの他のメンバ902および906、およびItem Folder 900にアクセスする可能性のある他のItem Folders、Categories、またはItem(図に示されていない)に対し共有可能でないことを表す、Item Folder 900からItem 904へのRelationshipはない。Item 902および904に対するそのRelationships(またはそれが存在しないこと)とは対照的に、Item Folder 900はそれ自体からItem 906へのRelationship 916を持ち、Item 906はItem Folder 900に戻るRelationship 926を持ち、これらは併せて、Item 906がパブリックであり、Item Folder 900、それのメンバ902および904、およびItem Folder 900にアクセスする可能性のある他のItem Folders、Categories、またはItem(図に示されていない)に対し共有可能であること、およびItem Folder 900がパブリックであり、Item 906と帰属関係情報を共有することを表す。
すでに説明したように、Item Folder内のItemは、Item Foldersが「記述」されていないため共通性を共有する必要はない。他方、Categoriesは、そのメンバItemのすべてに共通である共通性により記述される。したがって、Categoryの帰属関係は、本質的に、記述されている共通性を持つItemに制限され、いくつかの実施形態では、Categoryの記述を満たすすべてのItemは自動的にCategoryのメンバにされる。したがって、Item Foldersでは自明な型構造をその帰属関係により表すことができるが、Categoriesでは、帰属関係は定義済み共通性に基づくようにできる。
もちろん、Category記述は、その性質上論理的であり、したがって、Categoryは、型、プロパティ、および/または値の論理表現により記述することができる。例えば、Categoryの論理表現は、Itemを含む帰属関係が2つのプロパティのうちの一方または両方を持つものとすることができる。Categoryに対するこれらの記述されたプロパティが「A」および「B」の場合、Categories帰属関係は、プロパティAを持つがBを持たないItem、プロパティBを持つがAを持たないItem、およびプロパティAおよびBの両方を持つItemを含むことができる。プロパティのこの論理表現は、論理演算子「OR」により記述され、Categoryにより記述されるメンバの集合はプロパティA OR Bを持つItemとなる。類似の論理オペランド(限定はしないが、「AND」、「XOR」、および「NOT」を単独で、または組み合わせて含む)も、カテゴリを記述するために使用することができることは、当業者であれば理解するであろう。
Item Folders(記述されていない)とCategories(記述されている)との区別にもかかわらず、Categories Relationship対ItemとItem Relationship対Categoriesは、本発明の多くの実施形態におけるItem FoldersおよびItemについて本明細書でこれまでに開示されたものと本質的に同じものである。
図10は、Category(ここでも、Item自体である)、そのメンバItem、およびCategoryとそのメンバItemとの間の相互接続のRelationshipsを例示するブロック図である。Category 1000は、複数のItem 1002、1004、および1006をメンバとして持ち、それらはすべて、Category 1000により記述されているように(共通性記述1008’)共通のプロパティ、値、または型1008の何らかの組合せを共有する。Category 1000は、Item 1002がパブリックであり、Category 1000、そのメンバ1004および1006、およびCategory 1000にアクセスする可能性のある他のCategories、Item Folders、またはItem(図に示されていない)に対し共有可能であることを表す、それ自体からItem 1002へのRelationship 1012を持つ。しかし、Category 1000がItem 1002に対しプライベートであり、Item 1002と帰属関係情報を共有しないことを表す、Item 1002からCategory 1000へのRelationshipはない。他方、Item 1004は、Category 1000がパブリックであり、Item 1004と帰属関係情報を共有することを表す、それ自体からCategory 1000へのRelationship 1024を持つ。しかし、Item 1004がプライベートであり、Category 1000、それの他のメンバ1002および1006、およびCategory 1000にアクセスする可能性のある他のCategories、Item Folders、またはItem(図に示されていない)に対し共有可能でないことを表す、Category 1000からItem 1004へのRelationshipはない。Item 1002および1004に対するそのRelationships(またはそれが存在しないこと)とは対照的に、Category 1000はそれ自体からItem 1006へのRelationship 1016を持ち、Item 1006はCategory 1000に戻るRelationship 1026を持ち、これらは併せて、Item 1006がパブリックであり、Category 1000、それのItemメンバ1002および1004、およびCategory 1000にアクセスする可能性のある他のCategories、Item Folders、またはItem(図に示されていない)に対し共有可能であること、およびCategory 1000がパブリックであり、Item 1006と帰属関係情報を共有することを表す。
最後に、他のいくつかの実施形態では、CategoriesおよびItem Foldersは、それ自体Itemであるので、Itemは互いとのRelationshipを、CategoriesはItem FoldersへのRelationship およびその逆を持ち、Categories、Item Folders、およびItemはそれぞれ他のCategories、Item Folders、およびItemに対するRelationshipを持つことができる。しかし、様々な実施形態では、Item Folder構造および/またはCategory構造は、ハードウェア/ソフトウェアインターフェースシステムレベルでサイクルを含むことが禁止されている。Item FolderおよびCategory構造は、有効グラフに似ており、サイクルを禁止する実施形態は、グラフ理論の分野の数学的定義により、どのような経路も同じ頂点から始まり、終わるということのない有向グラフである、非循環有向グラフ(DAGs)に似ている。
6.拡張性
ストレージプラットフォームに対して、上述のように、スキーマの初期集合(プラットフォームスキーマ)340を与えることが意図されている。しかし、それに加えて、少なくともいくつかの実施形態では、ストレージプラットフォームにより、独立系ソフトウェアベンダ(ISV)を含む顧客は、新しいスキーマ344(つまり、新しいItemおよびNested Element型)を作成することができる。この節では、スキーマの初期集合(プラットフォームスキーマ)340内で定義されているItem型およびNested Element型(または単純に、「Element」型)を拡張することによりそのようなスキーマを作成するためのメカニズムを取りあげる。
ItemおよびNested Element型の初期集合の拡張は、以下のように制約されるのが好ましい。
ISVは新しいItem型、つまり、子型Base.Itemを導入することが許される。
ISVは新しいNested Element型、つまり、子型Base.NestedElementを導入することが許される。
ISVは新しい拡張、つまり、子型Base.NestedElementを導入することが許される。しかし、
ISVは、ストレージプラットフォームのスキーマの初期集合(プラットフォームスキーマ)340により定義されている型(Item、Nested Element、またはExtension型)をサブタイプ化することはできない。
ストレージプラットフォームスキーマの初期集合により定義されているItem型またはNested Element型は、ISVアプリケーションの要求条件に正確に一致しない場合があるので、ISV側で型をカスタマイズできるようにする必要がある。これは、Extensionsという概念で可能になる。Extensionsは、強く型付けされたインスタンスであるが、(a)それらは独立して存在することはできず、(b)ItemまたはNested Elementに付随しなければならない。
スキーマの拡張性の必要性に応える他に、Extensionsは、「多重型付け」問題を解消することも意図されている。いくつかの実施形態では、ストレージプラットフォームは、多重継承または重複子型をサポートしていない場合があるため、アプリケーション側でExtensionsを重複型のインスタンスをモデル化する一手段として使用することができる(例えば、Documentは、法律文書であるとともにセキュリティに関する文書でもある)。
a)アイテム拡張
Item拡張を行うために、データモデルは、さらに、Base.Extensionという名前の抽象型を定義する。これは、拡張型の階層に対するルート型である。アプリケーションでは、Base.Extensionをサブタイプ化して、特定の拡張型を作成することができる。
Base.Extension型は、以下のようにBase schemaで定義される。
Figure 0004394644
ItemIDフィールドは、拡張子が関連付けられているアイテムのItemIDを含む。このItemIDを持つItemは存在していなければならない。拡張は、与えられたItemIDを持つアイテムが存在しない場合には、作成することができない。Itemが削除されると、同じItemIDを持つ拡張はすべて削除される。タプル(ItemID,ExtensionID)は拡張インスタンスを一意に識別する。
拡張型の構造は、アイテム型の構造と類似している。
拡張型はフィールドを持つ。
フィールドは、プリミティブまたはネスト要素型とすることができる。
拡張型は、サブタイプ化することができる。
以下の制約が、拡張型に対し適用される。
拡張は、関係のソースおよびターゲットとすることはできない。
拡張型インスタンスは、アイテムから独立しては存在し得ない。
拡張型は、ストレージプラットフォームの型定義でのフィールド型として使用することはできない。
与えられたItem型に関連付けられる拡張の型には制約はない。どのような拡張型も、アイテム型の拡張に使用することができる。複数の拡張インスタンスがアイテムに付随する場合、それらは、構造とビヘイビアの両面で互いに独立している。
複数の拡張インスタンスは、格納され、アイテムから別々にアクセスされる。すべての拡張型インスタンスは大域的拡張ビューからアクセス可能である。関連するアイテムの型がどうであれ、与えられた拡張の型のすべてのインスタンスを返す効率的なクエリを作成することができる。ストレージプラットフォームAPIは、アイテム上の拡張の格納、取り出し、および修正を行うことができるプログラミングモデルを提供する。
拡張型は、ストレージプラットフォームの単一継承モデルを使用してサブタイプ化された型とすることができる。拡張型からの派生は、新しい拡張型を生み出す。拡張の構造またはビヘイビアは、アイテム型階層の構造またはビヘイビアをオーバーライドまたは置き換えることができない。
Item型と同様に、Extension型インスタンスは、拡張型に関連付けられているビューを通じて直接アクセスされることが可能である。拡張のItemIDは、どのアイテムに属しているかを示し、これを使用して、大域的Itemビューから対応するItemオブジェクトを取り出すことができる。
拡張は、動作の整合性のためにアイテムの一部と考えられる。ストレージプラットフォームが定義するCopy/Move、Backup/Restore、およびその他の共通オペレーションは、そのアイテムの一部として拡張上で動作することができる。
以下の例を考察する。Contact型は、Windows(登録商標)Type設定において定義される。
Figure 0004394644
CRMアプリケーション開発者は、CRMアプリケーション拡張をストレージプラットフォームに格納されている連絡先に付随させたい。アプリケーション開発者は、アプリケーション側で操作することができる追加データ構造を含むCRM拡張を定義する。
Figure 0004394644
HRアプリケーション開発者は、Contactに追加データを付随させたいとも考えている。このデータは、CRMアプリケーションデータと無関係である。ここでもまた、このアプリケーション開発者は拡張を作成することができる。
Figure 0004394644
CRMExtensionおよびHRExtensionは、Contactアイテムに付随させることができる2つの独立の拡張である。これらは、互いに独立に作成されアクセスされる。
上記の例では、CRMExtension型のフィールドおよびメソッドは、Contact階層のフィールドまたはメソッドをオーバーライドすることができない。CRMExtension型のインスタンスは、Contact以外のItem型に付随させることができる。
Contactアイテムが取り出される場合、そのアイテム拡張は自動的に取り出されはしない。Contactアイテムが与えられた場合、関連するアイテム拡張は、同じItemIdで拡張の大域的拡張ビューにクエリを実行することによりアクセスすることが可能である。
システム内のすべてのCRMExtension拡張は、どのアイテムに属しているか関係なく、CRMExtension型ビューを通じてアクセスすることができる。アイテムのすべてのアイテム拡張は、同じアイテムidを共有する。上記の例では、Contactアイテムインスタンスおよび付随するCRMExtensionおよびHRExtensionは同じItemIDをインスタンス化する。
以下のテーブルは、Item、Extension、およびNestedElement型の間の類似点と相違点をまとめたものである。
Figure 0004394644
b)NestedElement型の拡張
NestedElement型は、Item型と同じメカニズムで拡張されない。ネストされた要素の拡張は、ネストされた要素型のフィールドと同じメカニズムにより格納され、アクセスされる。
データモデルは、Elementという名前のネストされた要素型のルートを定義する。
Figure 0004394644
NestedElement型はこの型から継承する。NestedElement要素型は、さらに、Elementsの多重集合であるフィールドを定義する。
Figure 0004394644
NestedElement拡張は、以下の点でアイテム拡張と異なる。
ネストされた要素拡張は、拡張型ではない。それらは、Base.Extension型をルートとする拡張型階層に属さない。
ネストされた要素拡張は、アイテムの他のフィールドとともに格納され、大域的にはアクセス可能でない−与えられた拡張型のすべてのインスタンスを取り出すクエリを作成できない。
これらの拡張は、他の(アイテムの)ネストされた要素が格納されるのと同じ方法で格納される。他のネストされた集合のように、NestedElement拡張はUDTに格納される。これらは、ネストされた要素型のExtensionsフィールドを通じてアクセス可能である。
多値(multi-valued)プロパティにアクセスするために使用されるコレクションインターフェースも、型拡張の集合についてアクセスおよび反復するために使用される。
以下の表は、Item ExtensionsおよびNestedElement拡張のまとめと比較である。
Figure 0004394644
D.データベースエンジン
上述のように、データストアは、データベースエンジン上に実装される。本発明では、データベースエンジンは、オブジェクトリレーショナル拡張とともに、Microsoft SQL Serverなどの、SQLクエリ言語を実装するリレーショナルデータベースエンジンを含む。この節では、データストアが実装するデータモデルのリレーショナルストアへのマッピングについて説明し、また本発明によるストレージプラットフォームクライアントによって使われる論理APIに関する情報も掲載する。しかし、異なるデータベースエンジンが使用される場合に、異なるマッピングを採用できることは理解されるであろう。実際、ストレージプラットフォームの概念データモデルをリレーショナルデータベースエンジン上に実装することに加えて、さらに、他のタイプのデータベース、例えば、オブジェクト指向およびXMLデータベース上に実装されることも可能である。
オブジェクト指向(OO)データベースシステムは、プログラミング言語オブジェクト(例えば、C++、Java(登録商標))に対する永続性およびトランザクションを提供する。ストレージプラットフォームにおける「アイテム」の概念は、オブジェクト指向システムにおける「Object」にうまくマッピングされるが、ただし、埋め込まれたコレクションはObjectに追加されなければならないであろう。継承およびネストされた要素型のような他のストレージプラットフォームの型概念も、オブジェクト指向型システムをマッピングする。オブジェクト指向システムでは、通常、オブジェクト識別をすでにサポートしており、したがって、アイテム識別は、オブジェクト識別にマッピングすることができる。アイテムビヘイビア(オペレーション)は、オブジェクトメソッドにうまくマッピングされる。しかし、オブジェクト指向システムは、通常、編成に関する機能を欠いており、検索能力が劣る。また、オブジェクト指向システムは、非構造化および半構造化データのサポートも行わない。本明細書で説明されている完全なストレージプラットフォームデータモデルをサポートするため、関係、フォルダ、および拡張などの概念は、オブジェクトデータモデルに追加される必要があるであろう。さらに、格上げ(promotions)、同期、通知、およびセキュリティなどのメカニズムも、実装される必要があるであろう。
オブジェクト指向システムと同様に、XMLデータベースは、XSD(XMLスキーマ定義)に基づいており、単一継承ベースの型システムをサポートする。本発明のアイテム型システムは、XSD型モデルにマッピングされることも可能である。また、XSDは、ビヘイビアをサポートしない。アイテムに対するXSDは、アイテムビヘイビアにより増強されなければならないであろう。XMLデータベースでは、単一のXSDドキュメントを取り扱い、編成および広範な検索機能を欠いている。オブジェクト指向データベースの場合と同様、本明細書で説明されているデータモデルをサポートするため、関係、およびフォルダなどの他の概念は、そのようなXMLデータベースに組み込まれる必要があり、また、同期、通知、およびセキュリティなどのメカニズムも実装される必要がある。
1.UDTを使用したデータストアの実装
本発明の実施形態では、一実施形態においてMicrosoft SQL Serverエンジンを含むリレーショナルデータベースエンジン314は、組み込みスカラー型をサポートする。組み込みスカラー型は「ネイティブ」と「単純(simple)」である。それらは、ユーザが独自の型を定義することはできないという点でネイティブであり、複合構造をカプセル化できないという点で単純である。ユーザ定義型(User-defined types)(これ以降、UDT)は、複合構造型を定義することによりユーザが型システムを拡張できるようにすることによりネイティブのスカラー型システムの上の、またそれを超える、型拡張性のためのメカニズムを提供する。UDTは、ユーザにより定義された後、型システムにおいて組み込みスカラー型が使用できる場所であればどこででも使用することができる。
本発明の一態様によれば、ストレージプラットフォームスキーマは、データベースエンジンストア内のUDTクラスにマッピングされる。データストアItemは、Base.Item型から派生するUDTクラスにマッピングされる。Itemのように、ExtensionsもUDTクラスにマッピングされ、継承を使用する。ルートExtension型は、Base.Extensionであり、そこからすべてのExtension型が派生する。
UDTはCLRクラスである−これは状態(つまり、データフィールド)とビヘイビア(つまり、ルーチン)を持つ。UDTは、マネージド言語−C#、VB.NETなどを使用して定義される。UDTメソッドおよび演算子は、その型のインスタンスに対してT−SQLで呼び出すことができる。UDTは、1行の中の1列の型、T−SQLのルーチンのパラメータの型、またはT−SQLの変数の型とすることができる。
以下の実施例は、UDTの基本事項を例示している。MapLib.dllがMapLibというアセンブリを持つと仮定する。このアセンブリでは、名前空間BaseTypesの下に、Pointと呼ばれるクラスがある。
Figure 0004394644
以下のT−SQLコードは、クラスPointをPointと呼ばれるSQL Server UDTにバインドする。第1のステップでは、「CreateAssembly」を呼び出すが、これは、MapLibアセンブリをデータベース内にロードする。第2のステップでは、「Create Type」を呼び出して、ユーザ定義型「Point」を作成し、マネージド型BaseTypes.Pointにバインドする。
Figure 0004394644
作成された後、「Point」UDTは、テーブル内の列として使用することができ、メソッドは、以下に示されているようにT−SQLで呼び出すことができる。
Figure 0004394644
ストレージプラットフォームスキーマをUDTクラスにマッピングすることは、高いレベルにおいてかなり容易である。一般に、ストレージプラットフォームSchemaは、CLR名前空間にマッピングされる。ストレージプラットフォームTypeは、CLRクラスにマッピングされる。CLRクラス継承は、ストレージプラットフォームType継承を反映し、ストレージプラットフォームPropertyは、CLRクラスプロパティにマッピングされる。
図29に例示されているItem階層は、本明細書では一実施例として使用されている。これは、すべてのItem型の派生元となるBase.Item型を、派生Item型の集合(例えば、Contact.PersonおよびContact.Employee)とともに示しており、継承は矢印で示されている。
2.アイテムのマッピング
Itemが大域的に検索可能であることが望ましく、継承および型代替可能性に対する本発明のリレーショナルデータベースでのサポートがあれば、データベースストア内のItemストレージの1つの可能な実装は、すべてのItemを型Base.Itemの列を含む単一テーブルに格納することである。型代替可能性を使用すると、すべての型のItemを格納することが可能になり、またYukonの「is of(Type)」演算子を使用してItem型と子型により検索をフィルタ処理することが可能になる。
しかし、本発明においては、そのようなアプローチに関連するオーバーヘッドに関する心配から、Itemは、最上位の型により分割され、それぞれの型の「族(family)」のItemが別々のテーブルに格納される。このパーティション分割スキームに従って、Base.Itemから直接継承するItem型毎に1つのテーブルが作成される。これらの下の型継承は、上述のように、型代替え可能性を使用して適切な型族テーブルに格納される。Base.Itemからの継承の第1のレベルのみが特別に処理される。例えば、図29に示されているItem階層では、この結果、以下の型族テーブルが得られる。
Figure 0004394644
すべてのItemに対する大域的に検索可能なプロパティのコピーを格納するために「シャドウ」テーブルが使用される。このテーブルは、すべてのデータ変更が行われる際に使用される、ストレージプラットフォームAPIのUpdate()メソッドにより保持することできる。型族テーブルと異なり、大域的Itemテーブルは、完全なUDT Itemオブジェクトではなく、Itemの最上位スカラープロパティのみを含む。大域的Itemテーブルの構造は以下の通りである。
Figure 0004394644
大域的Itemテーブルでは、ItemIDおよびTypeIDを公開することにより型族テーブルに格納されているItemオブジェクトにナビゲートすることができる。ItemIDは、一般に、データストア内のItemを一意に識別する。TypeIDは、ここでは説明しないメタデータを使用して、型名およびItemを含むビューにマッピングすることができる。
ItemをそのItemIDにより見つけることはごく普通のオペレーションといえるので、大域的Itemテーブルおよび他の何らかの手段の両方の文脈において、ItemのItemIDを指定するとItemオブジェクトを取り出すGetItem()関数が用意されている。この関数は以下の宣言を持つ。
Base.Item Base.GetItem (uniqueidentifier ItemID)
アクセスを簡単に、実装の詳細をできる限り隠すために、Itemのすべてのクエリは、上述のItemテーブル上に構築されたビューに対して行われるようにできる。特に、ビューは、該当する型族テーブルと突き合わせてItem型毎に作成されうる。これらの型ビューでは、子型を含む、関連付けられた型のすべてのItemを選択することができる。便宜のため、UDTオブジェクトに加えて、それらのビューは、継承されたフィールドを含む、その型の最上位レベルのフィールドのすべてに対する列を公開することができる。図29に示されているItem階層例のビューは以下の通りである。
Figure 0004394644
完全を期すため、大域的Itemテーブルの上にビューも作成することができる。このビューは、最初に、そのテーブルと同じ列を公開することができる。
Figure 0004394644
3.拡張マッピング
Extensionsは、Itemに非常によく似ており、同じ要求条件のうちいくつかを持つ。継承をサポートする他のルート型として、Extensionsはストレージに対する同じ考慮事項とトレードオフの関係の多くの影響を受ける。このため、類似の型族マッピングは、単一テーブルアプローチではなく、むしろ、Extensionsに適用される。もちろん、他の実施形態では、単一テーブルアプローチを使用することが可能である。
本発明の実施形態では、ExtensionはItemIDによりちょうど1つのItemに関連付けられ、Itemの文脈において一意であるExtensionIDを含む。Extensionテーブルは、以下の定義を持つ。
Figure 0004394644
Itemの場合と同様に、ItemIDとExtensionIDのペアからなる、識別を与えられたExtensionを取り出す関数を用意することが可能である。この関数は以下の宣言を持つ。
Figure 0004394644
Viewは、Extension型毎に作成され、Item型ビューに類似している。Base.Extension、Contact.PersonExtension、Contact.EmployeeExtensionの型を持つ、Item階層例と並行するExtension階層を仮定する。以下のビューを作成できる。
Figure 0004394644
4.ネストされている要素のマッピング
Nested Elementsは、深くネストされた構造を形成するためにItem、Extensions、Relationships、または他のNested Elements内に埋め込むことができる型である。ItemおよびExtensionsのように、Nested Elementsは、UDTとして実装されるが、ItemとExtensions内に格納される。したがって、Nested Elementsは、そのItemおよびExtensionコンテナを超えるストレージマッピングを持たない。つまり、NestedElement型のインスタンスを直接格納するテーブルはシステムにはなく、Nested Elements専用のビューもない。
5.オブジェクト識別(Identity)
データモデル内の各エンティティ、つまり、各Item、Extension、およびRelationshipは一意のキー値を持つ。Itemは、ItemIDにより一意に識別される。Extensionは、(ItemId,ExtensionId)の複合キーにより一意に識別される。Relationshipは、複合キー(ItemId,RelationshipId)により識別される。ItemId、ExtensionId、およびRelationshipIdはGUID値である。
6.SQLオブジェクトの命名規則
データストア内に作成されたすべてのオブジェクトは、ストレージプラットフォームスキーマ名から派生されたSQLスキーマ名で格納することができる。例えば、ストレージプラットフォームBaseスキーマ(「Base」と呼ばれることが多い)は、「[System.Storage].Item」などの「[System.Storage]」SQLスキーマで型を生成することができる。生成された名前は、命名の競合をなくすため、修飾子が先頭に付けられる。適宜、感嘆符(!)が、名前の各論理部分の仕切りとして使用される。以下の表は、データストア内のオブジェクトに使用される命名規則の概要である。それぞれのスキーマ要素(Item、Extension、Relationship、およびView)は、データストア内のインスタンスにアクセスするために使用される装飾された命名規則とともに一覧にされている。
Figure 0004394644
7.列の命名規則
オブジェクトモデルをストアにマッピングする場合、アプリケーションオブジェクトとともに追加情報が格納されているため、命名競合が発生する可能性がある。命名競合を回避するため、すべての非型固有列(non-type specific columns)(型宣言で名前付きPropertyに直接マッピングされない列)の先頭に、下線(_)文字を付ける。本発明の実施形態では、下線(_)文字は、識別子プロパティの先頭文字としては禁止されている。さらに、CLRとデータストアとの間の命名法の統一のため、ストレージプラットフォームの型またはスキーマ要素(関係など)のすべてのプロパティは、先頭文字を大文字にしていなければならない。
8.検索ビュー
ビューは、格納されているコンテンツを検索するためストレージプラットフォームにより用意される。SQLビューは、各ItemおよびExtension型について用意されている。さらに、ビューは、RelationshipsとViewsをサポートするためにも用意されている(Data Modelでの定義に従って)。ストレージプラットフォーム内のすべてのSQLビューおよび基礎のテーブルは読み取り専用である。データは、以下に詳述するように、ストレージプラットフォームAPIのUpdate()メソッドを使用して格納または変更することができる。
ストレージプラットフォームスキーマで明示的に定義されているそれぞれのビューは(スキーマデザイナにより定義され、ストレージプラットフォームにより自動的には生成されない)は、名前付きSQLビュー[<schema−name>].[View!<view−name>]によりアクセス可能である。例えば、スキーマ「AcmePublisher.Books」内の「BookSales」という名前のビューは、名前「[AcmePublisher.Books].[View!BookSales]」を使用するとアクセス可能である。ビューの出力形式はビュー毎に変更できるので(ビューを定義する当事者により与えられる任意のクエリにより定義される)、列は、スキーマビュー定義に基づいて直接マッピングされる。
ストレージプラットフォームのデータストア内のすべてのSQL検索ビューは、列に対し以下の順序付け規則を使用する。
1.ItemId、ElementId、RelationshipId、...などのビュー結果の(複数の)論理「key」列。
2.TypeIdなどの結果の型に関するメタデータ情報。
3.CreateVersion、UpdateVersion、...などの変更追跡列。
4.(複数の)型特有の列(宣言された型のProperties)
5.型特有のビュー(族ビュー)も、オブジェクトを返すオブジェクト列を含む。
各型族のメンバは、一連のItemビューを使用して検索可能であり、データストア内にItem型毎に1つのビューがある。
a)アイテム
各Item検索ビューは、特定の型またはその子型のItemの各インスタンスに対する1つの行を含む。例えば、Documentに対するビューは、Document、LegalDocument、およびReviewDocumentのインスタンスを返すことができる。この例では、Itemビューは、図28に示されているように概念化することができる。
(1)マスターアイテム検索ビュー
ストレージプラットフォームのデータストアのそれぞれのインスタンスは、マスターアイテムビューという特別なItemビューを定義する。このビューは、データストア内のそれぞれのItemに関する概要情報を示す。ビューは、Item型プロパティ毎に1つの列を示し、列は、変更追跡および同期情報を供給するために使用されるItemおよび複数の列の型を記述している。マスターアイテムビューは、名前「[System.Storage].[Master!Item]」を使用してデータストア内で識別される。
Figure 0004394644
(2)型付きアイテム検索ビュー
各Item型は、さらに、検索ビューを持つ。ルートItemビューに似ているが、このビューは、さらに、「_Item」列を介してItemオブジェクトにアクセスできる。各型付きアイテム検索ビューは、名前[schemaName].[itemTypeName]を使用してデータストア内で識別される。例えば、[AcmeCorp.Doc].[OfficeDoc]。
Figure 0004394644
b)アイテム拡張
WinFS Store内のすべてのItem Extensionsは、検索ビューを使用してアクセスすることもできる。
(1)マスター拡張検索ビュー
データストアのそれぞれのインスタンスは、マスター拡張ビュー(Master Extension View)という特別なExtensionビューを定義する。このビューは、データストア内のそれぞれのExtensionに関する概要情報を示す。ビューは、Extensionプロパティ毎に1つの列を持ち、列は、変更追跡および同期情報を供給するために使用されるExtensionおよび複数の列の型を記述している。マスター拡張ビューは、名前「[System.Storage].[Master!Extension]」を使用してデータストア内で識別される。
Figure 0004394644
(2)型付き拡張検索ビュー
各Extension型は、さらに、検索ビューを持つ。マスター拡張ビューに似ているが、このビューは、さらに、_Extension列を介してItemオブジェクトにアクセスできる。各型付き拡張検索ビューは、名前[schemaName].[Extension!extensionTypeName]を使用してデータストア内で識別される。例えば、[AcmeCorp.Doc].[Extension!OfficeDocExt]。
Figure 0004394644
c)ネストされている要素
すべてのネストされている要素は、Item、Extensions、またはRelationshipsインスタンス内に格納される。したがって、該当するItem、Extension、またはRelationship検察ビューにクエリを行うことで、これらはアクセスされる。
d)関係
上述のように、Relationshipsは、ストレージプラットフォームのデータストア内にItem間のリンキングの基本ユニットを形成する。
(1)マスター関係検索ビュー
それぞれのデータストアは、Master Relationship Viewを与える。このビューは、データストア内のすべての関係インスタンスに関する情報を示す。マスター関係ビューは、名前「[System.Storage].[Master!Relationship]」を使用してデータストア内で識別される。
Figure 0004394644
(2)関係インスタンス検索ビュー
それぞれの宣言されたRelationshipは、さらに、特定の関係のすべてのインスタンスを返す検索ビューを持つ。マスター関係ビューに似ているが、このビューは、さらに、関係データのプロパティ毎に名前付き列を示す。各関係インスタンス検索ビューは、名前[schemaName].[Relationship!relationshipName]を使用してデータストア内で識別される。例えば、[AcmeCorp.Doc].[Relationship!DocumentAuthor]。
Figure 0004394644
9.更新
ストレージプラットフォームのデータストア内のすべてのビューは読み取り専用である。データモデル要素(アイテム、拡張、または関係)の新しいインスタンスを作成する、または既存のインスタンスを更新するには、ストレージプラットフォームAPIのProcessOperationまたはProcessUpdategramメソッドが使用されなければならない。ProcessOperationメソッドは、実行されるアクションの詳細を決める「オペレーション」を消費するデータストアにより定義された単一のストアドプロシージャである。ProcessUpdategramメソッドは、実行されるアクションの集合の詳細を包括的に決める、「アップデートグラム」と呼ばれる、オペレーションの順序付き集合を受け取るストアドプロシージャである。
オペレーション形式は、拡張可能であり、スキーマ要素に対する様々なオペレーションを用意している。共通オペレーションとしては以下のものがある。
1.Itemオペレーション:
a.CreateItem(埋め込みまたは保持関係の文脈において新しいアイテムを作成する)
b.UpdateItem(既存のItemを更新する)
2.Relationshipオペレーション:
a.CreateRelationship(参照または保持関係のインスタンスを作成する)
b.UpdateRelationship(関係インスタンスを更新する)
c.DeleteRelationship(関係インスタンスを削除する)
3.Extensionオペレーション:
a.CreateExtension(既存のItemに拡張を追加する)
b.UpdateExtension(既存の拡張を更新する)
c.DeleteExtension(拡張を削除する)
10.変更追跡&ツームストーン
変更追跡およびツームストーンサービスは、以下で詳述するように、データストアにより提供される。このセクションでは、データストア内に公開された変更追跡情報の概要を述べる。
a)変更追跡
データストアによって与えられるそれぞれの検索ビューは、変更追跡情報を供給するために使用される列を含み、それらの列は、すべてのItem、Extension、およびRelationshipビュー間で共通である。ストレージプラットフォームのSchema Viewsは、スキーマデザイナにより明示的に定義され、変更追跡情報を自動的に供給することはしない−そのような情報は、ビュー自体が構築される検索ビューを通じて間接的に供給される。
データストア内の要素毎に、変更追跡情報は2つの場所−「マスター」要素ビューと「型付き」要素ビューから利用できる。例えば、AcmeCorp.Document.Document Item型に関する変更追跡情報は、マスターアイテムビュー「[System.Storage].[Master!Item]」および型付きアイテム検索ビュー[AcmeCorp.Document].[Document]から利用できる。
(1)「マスター」検索ビューでの変更追跡
マスター検索ビュー内の変更追跡情報は、要素の作成および更新バージョンに関する情報、要素を作成した同期パートナに関する情報、要素を最後に更新した同期パートナに関する情報、および作成および更新に関する各パートナからのバージョン番号を示す。同期関係にあるパートナ(後述)は、パートナキーにより識別される。型[System.Storage.Store].ChangeTrackingInfoの_ChangeTrackingInfoという名前の単一のUDTオブジェクトがこの情報を格納する。この型は、System.Storageスキーマで定義される。_ChangeTrackingInfoは、Item、Extension、およびRelationshipについてすべての大域的検索デビューで利用可能である。ChangeTrackingInfoの型定義は以下の通りである。
Figure 0004394644
これらのプロパティは、以下の情報を含む。
Figure 0004394644
(2)「型付き」検索ビューでの変更追跡
大域的検索ビューと同じ情報を供給することに加えて、それぞれの型付き検索ビューは、同期トポロジ内の各要素の同期状態を記録した追加情報を供給する。
Figure 0004394644
b)ツームストーン
データストアは、Item、Extensions、およびRelationshipsのツームストーン情報を与える。ツームストーンビューは、ある場所にあるライブ状態のエンティティとツームストーン状態のエンティティ(live and tombstoned entities)(アイテム、拡張、および関係)の両方に関する情報を示す。アイテムおよび拡張ツームストーンビューは、対応するオブジェクトへのアクセスを行えないが、関係ツームストーンビューは、関係オブジェクトへのアクセスを行える(関係オブジェクトは、ツームストーン状態の関係の場合にはNULLである)。
(1)アイテムツームストーン
アイテムツームストーンは、ビュー[System.Storage].[Tombstone!Item]を介してシステムから取り出される。
Figure 0004394644
(2)拡張ツームストーン
拡張ツームストーンは、ビュー[System.Storage].[Tombstone!Extension]を使用してシステムから取り出される。拡張変更追跡情報は、ExtensionIdプロパティの追加を含むItemについて与えられる情報と類似している。
Figure 0004394644
(3)関係ツームストーン
関係ツームストーンは、ビュー[System.Storage].[Tombstone!Relationship]を介してシステムから取り出される。関係ツームストーン情報は、Extensionsについて与えられる情報と類似している。しかし、追加情報は、関係インスタンスのターゲットItemRef上で与えられる。さらに、関係オブジェクトも選択される。
Figure 0004394644
(4)ツームストーンのクリーンアップ
ツームストーン情報の際限のない増殖を防ぐために、データストアは、ツームストーンのクリーンアップタスクを用意している。このタスクは、ツームストーン情報をいつ破棄できるかを決定する。このタスクは、ローカルの作成/更新バージョンに対する限界を計算し、その後、旧いすべてのツームストーンバージョンを破棄することによりツームストーン情報を切り詰める。
11.ヘルパAPIおよび関数
Baseマッピングは、さらに、多数のヘルパ関数も備える。これらの関数は、データモデルに対する共通のオペレーションを補助するために用意されている。
a)関数[System.Storage].GetItem
ItemIdを与えられたItemオブジェクトを返す。
//
Item GetItem (ItemId ItemId)
b)関数[System.Storage].GetExtension
//ItemIdおよびExtensionIdを与えられた拡張オブジェクトを返す。
//
Extension GetExtension (ItemId ItemId, ExtensionId ExtensionId)
c)関数[System.Storage].GetRelationship
//ItemIdおよびRelationshipIdを与えられた関係オブジェクトを返す。
//
Relationship GetRelationship (ItemId ItemId, RelationshipId RelationshipId)
12.メタデータ
ストアで表されるメタデータは、インスタンスメタデータ(Itemの型など)および型メタデータの2種類がある。
a)スキーマメタデータ
スキーマメタデータは、MetaスキーマからのItem型のインスタンスとしてデータストア内に格納される。
b)インスタンスメタデータ
インスタンスメタデータは、Itemの型についてクエリを実行するためにアプリケーションによって使用され、これによりItemに関連付けられている拡張を見つける。Itemに対するItemIdが与えられれば、アプリケーションは、大域的アイテムビューにクエリを実行して、Itemの型を返し、この値を使用して、Meta.Typeビューにクエリを実行し、Itemの宣言された型に関する情報を返す。例えば、以下のようになる。
Figure 0004394644
E.セキュリティ
この節では、一実施形態による、本発明のストレージプラットフォームのセキュリティモデルを説明する。
1.概要
本発明の実施形態により、ストレージプラットフォームのセキュリティポリシーが指定され強制される精度は、与えられたデータストア内のアイテムに対する様々なオペレーションのレベルにあり、全体とは別にアイテムの一部分をセキュリティ保護する機能はない。セキュリティモデルでは、アクセス制御リスト(ACL)を通じてそれらのオペレーションをアイテムに対し実行するため誰かにアクセス権を付与し、または誰かを拒絶することができるプリンシパルの集まりを指定する。それぞれのACLは、アクセス制御エントリ(ACE)の順序付きコレクションである。
アイテムのセキュリティポリシーは、自由裁量的アクセス制御ポリシーおよびシステムアクセス制御ポリシーにより完全に記述することができる。これらはそれぞれACLの集合である。第1の集合(DACL)は、アイテムの所有者により様々なプリンシパルに付与される自由裁量的アクセス権を記述するが、ACLの第2の集合は、SACL(システムアクセス制御リスト)と呼ばれ、オブジェクトがいくつかの方法で操作される場合にシステム監査がどのように実行されるかを指定する。これらに加えて、データストア内のそれぞれのアイテムは、アイテムの所有者に対応するSID(Owner SID)に関連付けられる。
ストレージプラットフォームのデータストア内にアイテムを編成する一次メカニズムは、包含階層のメカニズムである。包含階層は、アイテム間の保持関係を使用して実現される。「AはBを含む」として表される2つのアイテムAとBとの間の保持関係により、アイテムAはアイテムBの存続期間に影響を及ぼすことができる。一般に、データストア内のアイテムは、他のアイテムからそのアイテムへの保持関係がある間、存在しえない。保持関係は、アイテムの存続期間を制御することに加えて、アイテムのセキュリティポリシーを伝搬する必要なメカニズムも備える。
それぞれのアイテムについて指定されたセキュリティポリシーは、そのアイテムについて明示的に指定された部分とデータストア内のアイテムの親から継承される部分の2つの部分からなる。アイテムに対する明示的に定義されたセキュリティポリシーは、考慮対象のアイテムへのアクセスを管理する部分と包含階層内のすべての子孫により継承されるセキュリティポリシーに影響を及ぼす部分の2つの部分からなる。子孫により継承されるセキュリティポリシーは、明示的に定義されているポリシーおよび継承されたポリシーに応じて変わる。
セキュリティポリシーは保持関係を通じて伝搬され、任意のアイテムのところでオーバーライドされうるので、アイテムに対する有効なセキュリティポリシーがどのように決定されるかを指定する必要がある。本発明の実施形態では、データストアの包含階層内のアイテムは、ストアのルートからそのアイテムまでのすべてのパスにそってACLを継承する。
与えられたパスについて継承されたACL内で、ACL内の様々なACEの順序付けにより、強制される最終的なセキュリティポリシーが決定される。以下の注釈を使用して、ACL内のACEの順序付けを記述する。アイテムにより継承されるACL内のACEの順序付けは、以下の2つの規則により決定される。
第1の規則は、包含階層のルートからアイテムIへのパス内の様々なアイテムから継承されるACEを階層化する。近いコンテナから継承されたACEは、遠いコンテナから継承されるエントリに優先する。直観的には、これにより、管理者は、包含階層内のさらに遠くから上に継承されるACEをオーバーライドすることができる。この規則は、次の通りである。
アイテムI上の継承されるすべてのACLのLについて
すべてのアイテムI1、I2について
L内のすべてのACEのA1およびA2について
I1はI2の祖先であり、
I2はI3の祖先であり、
A1はI1から継承されたACEであり、
A2はI2から継承されたACEである
ことが成り立てば、
A2はL内のA1に先行する
第2の規則は、アイテムへのアクセスを拒絶するACEをアイテムへのアクセスを許可するACEより先になるように順序付ける。
アイテムI上の継承されるすべてのACLのLについて
すべてのアイテムI1について
L内のすべてのACEのA1およびA2について
I1はI2の祖先であり、
A1はI1から継承されたACCESS_DENIED_ACEであり、
A2はI1から継承されたACCESS_GRANTED_ACEである
ことが成り立てば、
A1はL内のA2に先行する
包含階層がツリーの場合、ツリーのルートからアイテムへのパスはちょうど1つあり、そのアイテムは、ちょうど1つの継承されたACLを持つ。これらの状況の下で、アイテムにより継承されるACLは、中に含まれるACEの相対的順序付けに関して既存のWindows(登録商標)セキュリティモデルでのファイル(アイテム)により継承されるACLとマッチングする。
しかし、データストア内の包含階層は、複数の保持関係がアイテムに対し許可されるため非循環有向グラフ(DAG)である。これらの条件の下で、包含階層のルートからアイテムへの複数のパスがある。アイテムは、すべてのパスにそってACLを継承するので、それぞれのアイテムは、単一のACLではなく、ACLのコレクションと関連付けられる。これは、従来のファイルシステムモデルとは異なり、ちょうど1つのACLが1つのファイルまたはフォルダに関連付けられることに注意されたい。
ツリーとは反対に、包含階層がDAGである場合には、詳細にする必要のある態様が2つある。親から複数のACLを継承する場合にアイテムに対する有効なセキュリティポリシーをどのように計算するかについての説明が必要であり、また編成および表現の仕方は、ストレージプラットフォームのデータストアのセキュリティモデルの管理に直接影響を及ぼす。
以下のアルゴリズムでは、与えられたアイテムに対する与えられたプリンシパルのアクセス権を評価する。本明細書全体を通して、以下の表記を使用して、アイテムに関連付けられているACLを説明する。
Inherited_ACLs(ItemId)−アイテムIDがストア内の親からのItemIdであるアイテムにより継承されるACLの集合。
Explicit_ACL(ItemId)−IDがItemIdであるアイテムについて明示的に定義されているACL。
Figure 0004394644
上記ルーチンは、所望のアクセスが明示的に拒絶されなかった場合にSTATUS_SUCCESSを返し、pGrantedAccessは、ユーザが望む権利のうちのどれが指定されたACLにより付与されたかを決定する。所望のアクセス権が明示的に拒絶された場合、ルーチンはSTATUS_ACCESS_DENIEDを返す。
Figure 0004394644
任意のアイテムで定義されているセキュリティポリシーの影響範囲は、データストア上で定義されている包含階層内のアイテムのすべての子孫を含む。明示的ポリシーが定義されているすべてのアイテムについて、ここでは事実上、包含階層内のすべての子孫により継承されるポリシーを定義している。すべての子孫により継承される有効なACLは、アイテムにより継承されるACLのそれぞれを受け取り、明示的なACL内の継承可能なACEをACLの先頭に追加することにより得られる。これは、そのアイテムに関連付けられた継承可能なACLの集合と呼ばれる。
フォルダアイテムをルートとする包含階層内のセキュリティの明示的指定がない場合、そのフォルダのセキュリティ指定は、包含階層内のそのアイテムのすべての子孫に適用される。そのため、明示的なセキュリティポリシー指定が与えられるすべてのアイテムは、まったく同じように保護されているアイテムの領域を定義し、その領域内のすべてのアイテムに対する有効なACLは、そのアイテムに対する継承可能なACLの集合である。これは、ツリーである包含階層の場合に領域を完全に定義する。それぞれの領域に番号が関連付けられるとすれば、アイテムが属する領域をそのアイテムとともに単に含むだけで十分であろう。
しかし、DAGである包含階層では、有効なセキュリティポリシーが変化する包含階層のポイントは、2種類のアイテムにより決定される。第1は、明示的なACLが指定されているアイテムである。通常、これらは、管理者が明示的にACLを指定した包含階層内のポイントである。第2は、複数の親を持つアイテムであり、親は、それらに関連付けられている異なるセキュリティポリシーを持つ。通常、これらは、ボリュームについて指定されたセキュリティポリシーの合流点であるアイテムであり、新しいセキュリティポリシーの開始を示す。
この定義により、データストア内のすべてのアイテムは、2つのカテゴリまったく同じように保護されているセキュリティ領域のルートであるカテゴリとそうでないカテゴリのうちの1つに分類される。セキュリティ領域を定義しないアイテムは、ちょうど1つのセキュリティ領域に属する。ツリーの場合のように、アイテムに対する有効なセキュリティは、アイテムが属す領域をそのアイテムとともに指定することにより指定できる。これにより、ストア内の様々なまったく同じように保護されている領域に基づいてストレージプラットフォームのデータストアのセキュリティを管理する簡単なモデルが得られる。
2.セキュリティモデルの詳細な説明
この節では、セキュリティ記述子内の個々の権利および含まれるACLが様々なオペレーションにどのように影響を及ぼすかを記述することによりアイテムのセキュリティ保護方法の詳細を示す。
a)セキュリティ記述子構造
セキュリティモデルの詳細を説明する前に、セキュリティ記述子の基本事項を説明すると有益である。セキュリティ記述子は、セキュリティ設定可能なオブジェクトに関連付けられたセキュリティ情報を含む。セキュリティ記述子は、SECURITY_DESCRIPTOR構造体およびその関連付けられたセキュリティ情報からなる。セキュリティ記述子は、以下のセキュリティ情報を含むことができる。
1.オブジェクトの所有者および一次グループに対するSID。
2.特定のユーザまたはグループに対して許可または拒絶されるアクセス権を指定するDACL。
3.オブジェクトに対する監査レコードを生成するアクセスの試行の型を指定するSACL。
4.セキュリティ記述子またはその個別のメンバの意味を限定する制御ビットの集合。
アプリケーションは、セキュリティ記述子の内容を直接操作できないのが好ましい。オブジェクトのセキュリティ記述子内のセキュリティ情報の設定および取り出しを行う関数がある。さらに、新しいオブジェクトのセキュリティ記述子を作成し初期化する関数がある。
自由裁量的アクセス制御リスト(DACL)は、セキュリティ設定可能なオブジェクトへのアクセスを許可または拒絶される受託者を識別する。プロセスがセキュリティ設定可能なオブジェクトにアクセスしようとした場合、システムでは、オブジェクトのDACL内のACEをチェックして、それにアクセス権を付与するかどうかを決定する。オブジェクトがDACLを持たない場合、システムは、全員に完全なアクセス権を付与する。オブジェクトのDACLがACEを持たない場合、システムは、DACLがアクセス権を許可しないためオブジェクトにアクセスするすべての試みを拒絶する。システムは、要求されたすべてのアクセス権を許可する1つまたは複数のACEを見つけるか、または要求されたアクセス権のどれかが拒絶されるまで、順番にACEをチェックしてゆく。
システムアクセス制御リスト(SACL)により、管理者は、セキュリティ保護されたオブジェクトにアクセスする試みをログに記録することができる。それぞれのACEは、システムにセキュリティイベントログ内への記録生成を行わせる指定された受託者によるアクセス試行の型を指定する。SACL内のACEは、アクセス試行が失敗した場合、成功した場合、またはその両方の場合に、監査レコードを生成することができる。SACLは、さらに、無許可ユーザがオブジェクトへのアクセス権を獲得しようとした場合にアラームを発生することもできる。
すべての型のACEは、以下のアクセス制御情報を含む。
1.ACEが適用される受託者を識別するセキュリティ識別子(SID)。
2.ACEにより制御されるアクセス権を指定するアクセスマスク。
3.ACEの型を示すフラグ。
4.子コンテナまたはオブジェクトが、ACLがアタッチされる一次オブジェクトからACEを継承することができるかどうかを決定するビットフラグの集合。
以下の表は、すべてのセキュリティ設定可能なオブジェクトによりサポートされる3つのACEの型をまとめたものである。
Figure 0004394644
(1)アクセスマスク形式
すべてのセキュリティ設定可能なオブジェクトは、図26に示されているアクセスマスク形式を使用してそのアクセス権を設定する。この形式では、下位16ビットはオブジェクト特有のアクセス権に、次の7ビットは標準アクセス権に使用され、これは、オブジェクトのほとんどの型に適用され、上位4ビットは各オブジェクト型で標準およびオブジェクト特有の権利の集合にマッピングできる汎用アクセス権を指定するために使用される。ACCESS_SYSTEM_SECURITYビットは、オブジェクトのSACLにアクセスする権利に対応する。
(2)汎用アクセス権
汎用アクセス権は、マスク内で上位4ビットで指定される。各タイプのセキュリティ設定可能なオブジェクトは、これらのビットをその標準およびオブジェクト特有のアクセス権の集合にマッピングする。例えば、ファイルオブジェクトは、GENERIC_READビットをREAD_CONTROLおよびSYNCHRONIZE標準アクセス権、およびFILE_READ_DATA、FILE_READ_EA、およびFILE_READ_ATTRIBUTESオブジェクト特有のアクセス権にマッピングする。他のタイプのオブジェクトは、GENERIC_READビットをそのタイプのオブジェクトに適したアクセス権の集合にマッピングする。
汎用アクセス権は、オブジェクトのハンドルを開く場合に必要なアクセスのタイプを指定するために使用することができる。これは、対応するすべての標準および特定の権利を指定するのよりも単純であるのが普通である。以下の表は、汎用アクセス権について定義された定数をまとめたものである。
Figure 0004394644
(3)標準アクセス権
それぞれのタイプのセキュリティ設定可能なオブジェクトは、そのタイプのオブジェクトに特有のオペレーションに対応するアクセス権の集合を持つ。それらのオブジェクト特有のアクセス権に加えて、ほとんどのタイプのセキュリティ設定可能なオブジェクトに共通のオペレーションに対応する標準アクセス権の集合がある。以下の表は、標準アクセス権について定義された定数をまとめたものである。
Figure 0004394644
b)アイテム特有の権利
図26のアクセスマスク構造では、アイテム特有の権利は「Object Specific Rights」セクション(下位16ビット)に置かれる。本発明の実施形態では、ストレージプラットフォームは、セキュリティを管理する2組のAPI−Win32およびストレージプラットフォームAPI−を公開しているため、ファイルシステムオブジェクト特有の権利は、ストレージプラットフォーム特有の権利の設計の動機付けをするために考慮されなければならない。
(1)ファイルおよびディレクトリオブジェクト特有の権利
以下の表を考察する。
Figure 0004394644
前記の表を参照しつつ、ファイルシステムでは、基本的に、ファイルとディレクトリとを区別することに注意すべきであるが、それは、ファイルおよびディレクトリの権利が同じビット上でオーバーラップしているからである。ファイルシステムでは、アプリケーションがそれらのオブジェクト上のビヘイビアを制御できるようにする、非常に精度の高い権利を定義する。例えば、これらにより、アプリケーションは、属性(Attributes)(FILE_READ/WRITE_ATTRIBUTES)、拡張属性(Extended Attributes)、およびファイルに関連付けられたDATAストリームを区別することができる。
本発明のストレージプラットフォームのセキュリティモデルの目標は、データストアアイテム(Contacts、Emailsなど)に作用するアプリケーションが一般に、例えば属性、拡張属性、およびデータストリームを区別する必要がないように、権利割り当てモデルを簡素化することである。しかし、ファイルおよびフォルダの場合、細かいWin32権利は保持され、ストレージプラットフォームを介したアクセスの意味は、Win32アプリケーションとの互換性が実現可能なように定義される。このマッピングについては、以下で指定されたアイテム権利のそれぞれとともに説明される。
以下のアイテム権利は、関連付けられている許可可能なオペレーションとともに指定される。これらのアイテム権利のそれぞれを裏付ける同等のWin32権利も提供される。
(2)WinFSItemRead
この権利を使用すると、埋め込まれた関係を介してアイテムにリンクされているアイテムを含むアイテムのすべての要素への読み込みアクセスが可能になる。また、保持関係を介してこのアイテムにリンクされているアイテムの列挙も可能である(ディレクトリリスティングともいう)。これは、参照関係を介してリンクされたアイテムの名前を含む。この権利は以下のようにマッピングされる。
ファイル:
(FILE_READ_DATA|SYNCHRONIZE)
フォルダ:
(FILE_LIST_DIRECTORY|SYNCHRONIZE)
これは、セキュリティアプリケーションが、WinFSItemReadDataを設定し、権利マスクを上で指定したファイル権利の組合せとして指定することが可能であることを意味する。
(3)WinFSItemReadAttributes
この権利は、ファイルシステムが基本ファイル属性とデータストリームとを区別するのと同様に、Itemの基本属性への読み込みアクセスを可能にする。これらの基本属性は、すべてのアイテムの派生元となる基本アイテム内に配置される属性であるのが好ましい。この権利は以下のようにマッピングされる。
ファイル:
(FILE_READ_ATTRIBUTES)
フォルダ:
(FILE_READ_ATTRIBUTES)
(4)WinFSItemWriteAttributes
この権利は、ファイルシステムが基本ファイル属性とデータストリームとを区別するのと同様に、Itemの基本属性への書き込みアクセスを可能にする。これらの基本属性は、すべてのアイテムの派生元となる基本アイテム内に配置されるのが好ましい。この権利は以下のようにマッピングされる。
ファイル:
(FILE_WRITE_ATTRIBUTES)
フォルダ:
(FILE_WRITE_ATTRIBUTES)
(5)WinFSItemWrite
この権利を使用すると、埋め込まれた関係を介してアイテムにリンクされているアイテムを含むアイテムのすべての要素への書き込みアクセスを実行できるようになる。この権利を使用すると、さらに、埋め込まれた関係を他のアイテムに追加または削除することもできるようになる。この権利は以下のようにマッピングされる。
ファイル:
(FILE_WRITE_DATA)
フォルダ:
(FILE_ADD_FILE)
ストレージプラットフォームのデータストアでは、アイテムとフォルダとの間に違いはなく、アイテムはデータストア内の他のアイテムとの保持Relationshipも持つことができる。したがって、FILE_ADD_SUBDIRECTORY(またはFILE_APPEND_DATA)権利がある場合、アイテムを他のアイテムとのRelationshipsのソースにすることができる。
(6)WinFSItemAddLink
この権利を使用すると、ストア内のアイテムに保持Relationshipを追加することができるようになる。複数の保持Relationshipのセキュリティモデルはアイテム上のセキュリティを変更し、それらの変更は階層内の上位のポイントから来る場合にWRITE_DACをバイパスすることができるので、それとのRelationshipを作成できるようにするためにWRITE_DACはデスティネーションアイテム上に必要であることに留意されたい。この権利は以下のようにマッピングされる。
ファイル:
(FILE_APPEND_DATA)
フォルダ:
(FILE_ADD_SUBDIRECTORY)
(7)WinFSItemDeleteLink
この権利により、アイテムに対する保持Relationshipを削除する機能は、そのアイテムを削除する権利がプリンシパルに付与されていないとしても使用可能になる。これは、ファイルシステムモデルと整合しており、パージに役立つ。この権利は以下のようにマッピングされる。
ファイル:
(FILE_DELETE_CHILD)−ファイルシステムは、この権利に相当するファイルを持たないが、アイテムは他のアイテムとの保持Relationshipを持つという概念はあり、したがって、非フォルダに対しても同様にこの権利を伝えられる。
フォルダ:
(FILE_DELETE_CHILD)
(8)アイテムを削除する権利
アイテムとの最後の保持Relationshipが消えると、アイテムは削除される。アイテムを削除するという明示的な概念はない。アイテムとのすべての保持Relationshipを削除するが、高水準の機能であってシステムプリミティブではないパージオペレーションがある。
パスを使用して指定されたアイテムのリンクを解除できるのは、(1)そのパスにそった親アイテムがその対象への書き込みアクセスを付与するか、または(2)アイテム自体の標準の権利がDELETEを付与するかの2つの条件のうちのいずれか一方が満たされている場合である。最後のRelationshipが削除されると、アイテムはシステムから消える。ItemIDを使用して指定されたアイテムのリンクを解除できるのは、アイテム自体の標準の権利がDELETEを付与する場合である。
(9)アイテムをコピーする権利
アイテムは、対象がアイテムに対するWinFSItemReadおよびデスティネーションフォルダに対するWinFSItemWriteを付与された場合に、ソースからデスティネーションフォルダにコピーすることができる。
(10)アイテムを移動する権利
ファイルシステム内のファイル移動は、デスティネーション上でACLを保持するので、ソースファイルに対するDELETE権利およびデスティネーションディレクトリに対するFILE_ADD_FILEだけを必要とする。しかし、フラグは、クロスボリューム移動(cross−volume move)の場合にCopyFileの意味を許容できることをアプリケーションに指定させるMoveFileEx呼び出し(MOVEFILE_COPY_ALLOWED)で指定することができる。移動するとセキュリティ記述子に何が生じるかについて可能な4つの選択肢がある。
1.ACL全体をファイルとともに搬送する−既定のイントラボリューム移動(intra−volume move)の意味。
2.ACL全体をファイルとともに搬送し、保護されているというマークをACLに付ける。
3.デスティネーション間で明示的なACEだけを搬送し、デスティネーション上で再継承する。
4.何も搬送せず、デスティネーション上で再継承する−既定のインターボリューム移動の意味−ファイルのコピーと同じ。
本発明のセキュリティモデルでは、アプリケーション側でMOVEFILE_COPY_ALLOWEDフラグを指定した場合、インターボリュームとイントラボリュームの両方の場合について第4のオプションが実行される。このフラグが指定されない場合、第2のオプションは、デスティネーションがさらに同じセキュリティ領域(つまり、同じ継承の意味)内にない限り実行される。ストレージプラットフォームレベルの移動では、第4の選択肢も実装し、コピーの場合と同様に、ソース上のREAD_DATAを必要とする。
(11)アイテム上のセキュリティポリシーを表示する権利
アイテムのセキュリティは、そのアイテムが標準の権利READ_CONTROLを対象に付与する場合に表示できる。
(12)アイテム上のセキュリティポリシーを変更する権利
アイテムのセキュリティは、そのアイテムが標準の権利WRITE_DACを対象に付与する場合に変更できる。しかし、データストアは暗黙の継承を提供するので、これは、階層上でのセキュリティの変更方法に密接に関係している。階層のルートがWRITE_DACを付与する場合、セキュリティポリシーは、階層(またはDAG)内の特定のアイテムがWRITE_DACを対象に付与するかどうかに関係なく階層全体で変更されるというのが規則である。
(13)直接の等価物を持たない権利
本発明の実施形態では、FILE_EXECUTE(ディレクトリのFILE_TRAVERSE)はストレージプラットフォーム内に直接の等価物を持たない。モデルは、Win32との互換性のためこれらを保持しているが、それらの権利に基づいてアイテムに対しアクセス決定が下されることはない。FILE_READ/WRITE_EAの場合のように、データストアアイテムは、拡張属性の概念を持たないため、このビットに対する意味は用意されていない。しかし、このビットは、Win32の互換性のために残されている。
3.実装
まったく同じように保護されている領域を定義するすべてのアイテムは、セキュリティテーブル内でそれらに関連付けられたエントリを持つ。セキュリティテーブルは、次のように定義される。
Figure 0004394644
Item Identityエントリは、まったく同じように保護されているセキュリティ領域のルートのアイテム識別である。Item Ordpathエントリは、まったく同じように保護されているセキュリティ領域のルートに関連付けられているordpathである。Explicit Item ACLエントリは、まったく同じように保護されているセキュリティ領域のルートについて定義された明示的ACLである。場合によっては、これは、例えば、アイテムが異なる領域に属する複数の親を持つため新しいセキュリティ領域が定義される場合に、NULLとすることができる。Path ACLsエントリは、アイテムにより継承されるACLの集合であり、Region ACLsエントリは、アイテムに関連付けられているまったく同じように保護されているセキュリティ領域について定義されているACLの集合である。
与えられたストア内のアイテムに対する有効セキュリティの計算には、このテーブルを利用する。アイテムに関連付けられたセキュリティポリシーを決定するために、アイテムに関連付けられたセキュリティ領域が得られ、その領域に関連付けられたACLが取り出される。
アイテムに関連付けられたセキュリティポリシーは、明示的なACLを直接追加するか、または新しいセキュリティ領域を形成することになる保持Relationshipを追加することにより間接的に変更されるので、アイテムの有効なセキュリティを決定する上記のアルゴリズムが必ず有効なアルゴリズムであるようにするためセキュリティテーブルは最新状態に維持される。
ストアに対する様々な変更およびセキュリティテーブルを維持する随伴するアルゴリズムは以下の通りである。
a)コンテナ内に新しいアイテムを作成する
アイテムがコンテナ内に新たに作成されると、これは、コンテナに関連付けられたすべてのACLを継承する。新たに作成されたアイテムは、ちょうど1つの親を持つので、その親と同じ領域に属す。したがって、新しいエントリをセキュリティテーブル内に作成する必要はない。
b)明示的なACLをアイテムに追加する
ACLがアイテムに追加された場合、これは、与えられたアイテム自体と同じセキュリティ領域に属す包含階層内のすべての子孫に対し新しいセキュリティ領域を定義する。他のセキュリティ領域に属しているが包含階層内の与えられたアイテムの子孫ではないすべてのアイテムについて、セキュリティ領域は、変更されないが、その領域に関連付けられている有効なACLは、新しいACLの追加を反映するように変更される。
この新しいセキュリティ領域の導入は、旧いセキュリティ領域と新しく定義されたセキュリティ領域とをまたにかける祖先との複数の保持Relationshipsを持つすべてのアイテムに対しさらに領域定義を行うきっかけとなりうる。このようなすべてのアイテムについて、新しいセキュリティ領域を定義する必要があり、手順が繰り返される。
図27(a)、(b)、および(c)は、新しい明示的なACLを導入することにより、既存のセキュリティ領域から切り出される新しいまったく同じように保護されているセキュリティ領域を示している。これは、2というマークが付けられているノードにより示される。しかし、この新しい領域を導入した結果、アイテムが複数の保持Relationshipを持つことから追加領域3が作成される。
セキュリティテーブルでの以下の一連の更新は、まったく同じように保護されるセキュリティ領域の因数分解を反映する。
c)保持Relationshipをアイテムに追加する
保持Relationshipがアイテムに追加されると、3つの可能性のうちの1つが生じる。保持Relationshipのターゲット、つまり、考察対象のアイテムがセキュリティ領域のルートである場合、その領域に関連付けられる有効なACLは変更され、セキュリティテーブルにさらに修正を加える必要はない。新しい保持Relationshipのソースのセキュリティ領域がアイテムの既存の親のセキュリティ領域と同じである場合、変更は不要である。しかし、アイテムが異なるセキュリティ領域に属する親を持たないようになれば、新しいセキュリティ領域が形成され、与えられたアイテムをセキュリティ領域のルートとして持つ。この変更は、そのアイテムに関連付けられているセキュリティ領域を修正することにより包含階層内のすべてのアイテムに伝搬される。考察対象のアイテムと同じセキュリティ領域に属するすべてのアイテムおよび包含階層内のその子孫は、変更される必要がある。変更が行われた後、複数の保持Relationshipを持つすべてのアイテムは、さらに変更が必要かを判定するために調べられなければならない。これらのアイテムのどれかが異なるセキュリティ領域の親を持つ場合には、さらに変更が必要になることがある。
d)保持Relationshipをアイテムから削除する
保持Relationshipがアイテムから削除された場合、いくつかの条件が満たされていれば、セキュリティ領域をその親領域とともに縮小することが可能である。より正確に言うと、これは、(1)保持Relationshipを削除すると1つの親を持つアイテムが生じ、そのアイテムについて明示的なACLが指定されていない、(2)保持Relationshipを削除すると親がすべて同じセキュリティ領域内にあるアイテムが生じ、そのアイテムについて明示的なACLが定義されていないという条件の下で実行することができる。これらの状況の下で、セキュリティ領域は、親と同じになるようにマーキングすることができる。このマーキングは、セキュリティ領域が縮小される領域に対応するすべてのアイテムに適用する必要がある。
e)明示的なACLをアイテムから削除する
明示的なACLがアイテムから削除された場合、その親の領域とともにそのアイテムをルートとするセキュリティ領域を縮小することが可能である。より正確に言うと、これは、明示的なACLを削除すると包含階層内の親が同じセキュリティ領域に属しているアイテムが生じる場合に実行できる。これらの状況の下で、セキュリティ領域は、親と同じになるようにマーキングすることができ、変更は、セキュリティ領域が縮小される領域に対応するすべてのアイテムに適用される。
f)アイテムに関連付けられているACLを修正する
このシナリオでは、セキュリティテーブルに新しい追加を行う必要はない。その領域に関連付けられている有効なACLは更新され、新しいACLの変更がそれの影響を受けるセキュリティ領域に伝搬される。
F.通知および変更追跡
本発明の他の態様によれば、ストレージプラットフォームは、データ変更をアプリケーションで追跡できるようにする通知機能を備える。この機能は、主に、揮発性状態を維持するか、またはデータ変更イベントに関するビジネスロジックを実行するアプリケーション向けである。アプリケーションは、アイテム、アイテム拡張、およびアイテム関係に関する通知を登録する。通知は、データ変更がコミットされた後に非同期に送り出される。アプリケーション側では、アイテム、拡張、および関係型さらにオペレーションの種類により、通知をフィルタ処理することができる。
一実施形態により、ストレージプラットフォームAPI 322は、2種類のインターフェースを通知用に用意している。第1に、アプリケーションはアイテム、アイテム拡張、およびアイテム関係への変更によりトリガされた単純データ変更イベントを登録する。第2に、アプリケーションは、アイテム、アイテム拡張、およびアイテム間の関係の集まりを監視する「ウォッチャ」オブジェクトを作成する。ウォッチャオブジェクトの状態は、システム障害の後、またはシステムが長時間オフライン状態になってしまった後に、保存され、再作成されるようにできる。単一の通知で、複数の更新を反映する場合がある。
1.ストレージ変更イベント
この節では、ストレージプラットフォームAPI 322により提供される通知インターフェースのいくつかの使用例を取りあげる。
a)イベント
Item、ItemExtensions、およびItemRelationshipsは、データ変更通知の登録のためアプリケーションにより使用されるデータ変更イベントを公開する。以下のコードサンプルは、基本Itemクラス上のItemModifiedおよびItemRemovedイベントハンドラの定義を示している。
Figure 0004394644
すべての通知は、変更されたアイテムをデータストアから取り出すのに十分なデータを搬送できる。以下のコードサンプルは、Item、ItemExtension、またはItemRelationship上でイベントを登録する方法を示している。
Figure 0004394644
本発明の実施形態では、ストレージプラットフォームは、最後に通知を配送した以降にそれぞれのアイテムが修正または削除された場合、またはデータストアから最後にフェッチされた以降に新しい登録があった場合にアプリケーションが通知を受けることを保証する。
b)ウォッチャ(Watchers)
本発明の実施形態では、ストレージプラットフォームは、(1)フォルダまたはフォルダ階層、(2)アイテムコンテクスト、または(3)特定のアイテムに関連付けられているオブジェクトを監視するウォッチャクラスを定義する。3つのカテゴリのそれぞれについて、ストレージプラットフォームは、関連付けられているアイテム、アイテム拡張、またはアイテム関係を監視する特定のウォッチャクラスを提供し、例えばストレージプラットフォームは、それぞれのFolderItemWatcher、FolderRelationshipWatcher、およびFolderExtensionWatcherクラスを提供する。
ウォッチャを作成するときに、アプリケーションは、事前に存在するアイテム、つまり、アイテム、拡張、または関係の通知を要求することができる。このオプションは、ほとんど、プライベートアイテムキャッシュを維持するアプリケーション用である。要求されない場合、アプリケーションは、ウォッチャオブジェクトが作成された後に生じるすべての更新の通知を受信する。
通知を配送することとともに、ストレージプラットフォームは、「WatcherState」オブジェクトを供給する。WatcherStateをシリアライズして、ディスク上に保存することができる。その後、失敗した後、またはオフラインになってから再接続するときにウォッチャ状態を使用してそれぞれのウォッチャを再作成することができる。新しく再作成されたウォッチャは、未受領確認通知を再生成する。アプリケーションは、通知への参照を供給するそれぞれのウォッチャ状態で「Exclude」メソッドを呼び出すことにより通知の配送を示す。
ストレージプラットフォームは、ウォッチャ状態の別々のコピーをそれぞれのイベントハンドラに配送する。同じイベントハンドラの後の呼び出しで受信されたウォッチャ状態では、すでに受信されたすべての通知の配送を想定する。
例えば、以下のコードサンプルは、FolderItemWatcherの定義を示す。
Figure 0004394644
以下のコードサンプルは、フォルダの内容を監視するフォルダウォッチャオブジェクトを作成する方法を示している。ウォッチャは、新しい音楽アイテムが追加されるか、または既存の音楽アイテムが更新されるかまたは削除されたときに、通知、つまり、イベントを生成する。フォルダウォッチャは、フォルダ階層内の特定のフォルダまたはすべてのフォルダを監視する。
Figure 0004394644
2.変更追跡および通知生成メカニズム
ストレージプラットフォームは、データ変更を追跡し、通知を生成する単純ではあるが効率的なメカニズムを備える。クライアントは、データを取り出すために使用されるのと同じ接続で通知を取り出す。このため、セキュリティチェックが大幅に簡素化され、可能なネットワーク構成に対する待ち時間および制約条件が排除される。通知は、selectステートメントを発行することにより取り出される。ポーリングを行わないようにするために、クライアントは、データベースエンジン314が備える「waitfor」機能を使用することができる。図13は、基本的なストレージプラットフォーム通知概念を示している。このwaitforクエリは、同期して実行される場合、呼び出し側スレッドは、結果が得られるまでブロックされ、非同期に実行される場合、スレッドはブロックされず、結果は用意されれば、別のスレッドで返される。
通知ロックをそれぞれのデータ範囲に設定することにより変更を監視できるので、「waitfor」と「select」の組合せは、特定のデータ範囲に収まるデータ変更を監視するのに魅力的である。これは、多くの共通のストレージプラットフォームシナリオについて成り立つ。個々のアイテムに対する変更は、通知ロックをそれぞれのデータ範囲に設定することにより効率よく監視することができる。フォルダおよびフォルダツリーに対する変更は、通知ロックをパス範囲に設定することにより監視できる。型およびその子型に対する変更は、通知ロックを型範囲に設定することにより監視できる。
一般に、通知の処理には、(1)データ変更または均等検出、(2)サブスクリプションマッチング(subscription matching)、および(3)通知配送の3つの異なるフェーズが関連する。同期通知配送、つまり、データ変更を実行するトランザクションの一部としての通知配送を除き、ストレージプラットフォームは以下の2つの形態の通知配送を実装することができる。
1)即時イベント検出:イベント検出およびサブスクリプションマッチングは、更新トランザクションの一部として実行される。通知は、サブスクライバにより監視されるテーブル内に挿入される。
2)遅延イベント検出:イベント検出およびサブスクリプションマッチングは、更新トランザクションがコミットされた後に実行される。その後、実際のサブスクライバまたは媒介物がイベントを検出し、通知を生成する。
即時イベント検出では、追加コードを更新オペレーションの一部として実行する必要がある。これにより、相対的な状態変更を示すイベントを含む注目するすべてのイベントを取り込むことができる。
遅延イベント検出では、追加コードを更新オペレーションに加える必要がなくなる。イベント検出は、最終的なサブスクライバにより実行される。遅延イベント検出では、当然ながら、イベント検出およびイベント配送をバッチ処理し、データベースエンジン314(例えば、SQLサーバ)のクエリ実行インフラストラクチャにうまく適合する。
遅延イベント検出は、更新オペレーションによって残されたログまたはトレースに依存する。ストレージプラットフォームは、削除されたデータアイテムに対するツームストーンとともに論理的タイムスタンプの集合を維持する。データストアをスキャンし、変更がないか調べるときに、クライアントは、変更を検出するための低ウォーターマークを定義するタイムスタンプおよび重複通知を防止するためのタイムスタンプの集合を供給する。アプリケーションは、その低ウォーターマークにより示される時刻以降に発生したすべての変更の通知を受信する。
コアビューにアクセスできる高度なアプリケーションでは、さらに、プライベートパラメータおよび重複フィルタテーブルを作成することにより潜在的に大きくなりうるアイテムの集合を監視するために必要なSQLステートメントの数を最適化し、低減することができる。リッチビューをサポートしなければならないような特別なニーズのあるアプリケーションでは、利用可能な変更追跡フレームワークを使用してデータ変更を監視し、そのプライベートスナップショットをリフレッシュすることができる。
したがって、一実施形態では、ストレージプラットフォームは、以下でさらに詳しく説明するように、遅延イベント検出アプローチを実装するのが好ましい。
a)変更追跡
すべてのアイテム、拡張、およびアイテム関係定義は、一意的な識別子を伝える。変更追跡では、すべてのデータアイテムの作成、更新、および削除時刻を記録する論理的タイムスタンプの集合を維持する。ツームストーンエントリを使用して、削除済みデータアイテムを表す。
アプリケーションではその情報を使用して、アプリケーションが最後にデータストアにアクセスした以降に特定のアイテム、アイテム拡張、またはアイテム関係が新しく追加されたか、更新されたか、または削除されたかどうかを効率よく監視する。以下の実施例は、このメカニズムを例示している。
Figure 0004394644
削除されたすべてのアイテム、アイテム拡張、および関係は、対応するツームストーンテーブル内に記録される。テンプレートを以下に示す。
Figure 0004394644
効率上の理由からストレージプラットフォームは、アイテム、アイテム拡張、関係、およびパス名の大域的テーブルの集合を維持する。これらの大域的ルックアップテーブルは、データ範囲を効率よく監視し、割り当てられているタイムスタンプおよび型情報を取り出すためにアプリケーションによって使用することができる。
b)タイムスタンプ管理
論理的タイムスタンプは、データベースに対し「ローカル」である、つまり、ストレージプラットフォームボリュームである。タイムスタンプは、単調増加の64ビット値である。単一のタイムスタンプを保持することは、ストレージプラットフォームボリュームに最後に接続した後データ変更が発生したかどうかを検出するのに十分であることが多い。しかし、最も現実的なシナリオでは、重複のチェックのためさらにいくつかのタイムスタンプを保持する必要がある。理由について以下で説明する。
リレーショナルデータベーステーブルは、物理的データ構造の集合、つまり、B−Tree、ヒープなどの上に構築される論理的抽象化である。タイムスタンプを新しく作成されたまたは更新されたレコードに割り当てることは、アトミックアクションではない。そのレコードを基礎をなすデータ構造体内に挿入することは、異なる時間に発生することがありえ、したがって、アプリケーションには、レコードが順不同に来るように見える。
図14は、2つのトランザクションが両方とも新しいレコードを同じB−Tree内に挿入することを示している。トランザクションT3は、トランザクションT2の挿入がスケジュールされる前にレコードを挿入するので、B−Treeをスキャンするアプリケーションは、T2により挿入されたレコードの前にトランザクションT3により挿入されたレコードを見る可能性がある。したがって、リーダーは、時刻「10」まで作成されたすべてのレコードを見たと誤って仮定しうる。この問題を解決するために、データベースエンジン314は、すべての更新がコミットし、それぞれの基礎のデータ構造体内に挿入された低ウォーターマークまでを返す関数を提供する。上記の実施例では、返された低ウォーターマークは「5」となり、リーダーはトランザクションT2がコミットされる前に開始したと仮定する。データベースエンジン314により与えられる低ウォーターマークにより、アプリケーションは、データ変更についてデータベースまたはデータ範囲をスキャンするときにどのアイテムを無視するかを効率よく決定できる。一般に、ACIDトランザクションは、非常に短い時間の間続くと想定され、低ウォーターマークは、一番最近に分配されたタイムスタンプに非常に近いと予期される。長く続いているトランザクションが存在する場合、アプリケーションは、重複を検出し破棄するために個々のタイムスタンプを保持していなければならない可能性がある。
c)データ変更検出−イベント検出
データストアのクエリを実行するときに、アプリケーションは低ウォーターマークを取得する。その後、アプリケーションはそのウォーターマークを使用して、作成、更新、または削除タイムスタンプが返された低ウォーターマークよりも大きいエントリがないかデータストアをスキャンする。図15は、このプロセスを例示している。
重複する通知を防止するために、アプリケーションでは、返された低ウォーターマークよりも大きいタイムスタンプを記憶しておき、それらを使用して重複を除去する。アプリケーションは、セッションレベルの一時テーブルを作成して、重複タイムスタンプの大きな集合を効率よく取り扱う。以下に示すように、selectステートメントを発行する前に、アプリケーションは、すでに返されているすべての重複タイムスタンプを挿入し、返された最後の低ウォーターマークよりも古いものを削除する。
Figure 0004394644
G.同期
本発明の別の態様によれば、ストレージプラットフォームは、(i)ストレージプラットフォーム(それぞれ自データストア302を備える)の複数のインスタンスが柔軟な規則の集まりに従ってその内容の部分の同期をとれるようにし、(ii)本発明のストレージプラットフォームのデータストアと専用プロトコルを実装する他のデータソースとの同期をとるサードパーティ用のインフラストラクチャを備える同期サービス330を提供する。
ストレージプラットフォーム間の同期は、参加レプリカのグループのうちで実行される。例えば、図3を参照すると、おそらく異なるコンピュータシステム上で稼働しているであろう、ストレージプラットフォームの他のインスタンスの制御の下で、ストレージプラットフォーム300のデータストア302と他のリモートデータストア338との同期をとることが望ましい場合がある。このグループの全体的な帰属関係は、必ずしも、与えられた時刻与えられたレプリカに知られているわけではない。
異なるレプリカは、変更を独立して行うことができる(つまり、同時に)。同期処理のプロセスは、他のレプリカによって行われる変更をすべてのレプリカに気づかせることとして定義される。この同期処理機能は、本質的に、マルチマスターである。
本発明の同期機能では、レプリカは以下のようにできる。
・ 他のレプリカがどの変更を認識するかを決定する。
・ このレプリカが認識しない変更に関する情報を要求する。
・ 他のレプリカが認識しない変更に関する情報を伝達する。
・ 2つの変更がいつ互いに競合するかを決定する。
・ 変更をローカルで適用する。
・ 競合する解決を他のレプリカに伝達し、収束を保証する。
・ 競合する解決に対する指定されたポリシーに基づき競合状態を解決する。
1.ストレージプラットフォームとストレージプラットフォームとの間の同期処理
本発明のストレージプラットフォームの同期処理サービス330の主要な適用は、ストレージプラットフォームの複数のインスタンスの同期をとることである(それぞれ、自データストアを有する)。同期処理サービスは、ストレージプラットフォームのスキーマレベルで動作する(データベースエンジン314の基礎のテーブルではなく)。したがって、例えば、「Scopes」は、後述のように同期を定義するために使用される。
同期処理サービスは、「純変化」の原理に基づいて動作する。同期処理サービスでは、個別のオペレーションを(トランザクション複製などにより)記録し、送信するのではなく、それらのオペレーションの最終結果を送り、それによって、複数のオペレーションの結果を得られた単一の変更に統合することが多い。
同期処理サービスは、一般的にはトランザクション境界を考慮しない。つまり、単一のトランザクションでストレージプラットフォームのデータストアに2つの変更が加えられた場合、それらの変更が他のすべてのレプリカに最小単位として適用されることは保証されない−一方が他方なしで現れることがある。この原理の例外は、同じトランザクションで2つの変更が同じItemに加えられた場合に、それらの変更は送信され、他のレプリカに最小単位として適用されることが保証されるという点である。したがって、Itemは、同期処理サービスの整合性ユニットである。
a)同期(Sync)制御アプリケーション
どのアプリケーションも、同期処理サービスに接続し、同期処理オペレーションを開始することができる。そのようなアプリケーションは、同期処理を実行するために必要なすべてのパラメータを用意する(以下のsyncプロファイルを参照)。このようなアプリケーションは、本明細書では、同期制御アプリケーション(SCA)と呼ばれる。
2つのストレージプラットフォームインスタンスの同期をとる場合、syncはSCAにより片方の側で開始される。そのSCAは、リモートパートナと同期することをローカル同期処理サービスに通知する。他方の側では、同期処理サービスは、発信側マシンから同期処理サービスにより送られるメッセージによって目覚める。これは、送信先マシン上に存在する永続的構成情報(以下のマッピングを参照)に基づいて応答する。同期処理サービスは、スケジュールに従って実行されるか、またはイベントに対する応答として実行されることが可能である。これらの場合に、スケジュールを実行する同期処理サービスがSCAとなる。
同期処理を有効にするには、2つのステップが実行される必要がある。第1に、スキーマデザイナが適切なsyncの意味をストレージプラットフォームスキーマに注釈として入れなければならない(後述のようにChange Unitsを指定する)。第2に、同期処理は、同期処理に関わるストレージプラットフォームのインスタンスを持つすべてのマシン上で適切に構成されなければならない(後述のように)。
b)スキーマ注釈(annotation)
同期処理サービスの基本概念は、Change Unitの概念である。Change Unitは、ストレージプラットフォームにより個別に追跡されるスキーマの最小断片である。すべてのChange Unitについて、同期処理サービスは、最後のsync以降に変化したか、変化しなかったかを判別することができる。
スキーマでのChange Unitsの指定は、複数の目的に使用される。第1に、これは、同期処理サービスが回線上でどれだけ混雑しているかを判別する。Change Unit内で変更が加えられた場合、同期処理サービスはChange Unitのどの部分が変更されたかを認識していないので、Change Unit全体が他のレプリカに送信される。第2に、これは、競合検出の精度を決定する。2つの同時変更(これらの用語は、後のセクションで詳しく定義される)が同じ変更ユニットに対し加えられた場合、同期処理サービスは競合の通知を発し、その一方で、同時変更が異なる変更ユニットに加えられた場合、競合の通知は発せず、変更は自動的にマージされる。第3に、これは、システムによって保持されているメタデータの量に強い影響を及ぼす。同期処理サービスのメタデータの多くは、Change Unit毎に保持され、そのため、Change Unitsを小さくすれば、syncのオーバーヘッドが大きくなる。
Change Unitsを定義するには、正しいトレードオフを見つける必要がある。そのような理由から、同期処理サービスを使用すると、スキーマデザイナはそのプロセスに関与することができる。
一実施形態では、同期処理サービスは、要素よりも大きなChange Unitsをサポートしていない。しかし、スキーマデザイナが要素よりも小さい変更ユニットを指定すること−つまり、要素の複数の属性を1つの独立したChange Unitにグループ化すること−はサポートしている。その実施形態では、これは、以下の構文を使用して行われる。
Figure 0004394644
c)同期設定
データの特定の部分の同期を維持したいストレージプラットフォームパートナのグループは、syncコミュニティと呼ばれる。コミュニティのメンバが同期を維持したい場合、必ずしも、まったく同じ方法でデータを表すわけではない、つまり、syncパートナは、同期処理をしているデータを変換することができる。
ピアツーピアのシナリオでは、ピアがそのパートナのすべてについて変換マッピングを維持することは実際的ではない。そうする代わりに、同期処理サービスは、「コミュニティフォルダ」を定義するアプローチをとる。コミュニティフォルダは、すべてのコミュニティメンバが同期をとる仮想「共有フォルダ」を表す抽象化である。
この概念は、例を使うと最もよくわかる。Joeが複数のコンピュータのMy Documentsフォルダの同期をとりたい場合、Joeは、例えば、JoesDocumentsというコミュニティフォルダを定義する。次に、すべてのコンピュータ上で、Joeは仮想JoesDocumentsフォルダとローカルのMy Documentsフォルダとの間のマッピングを構成する。この時点以降、Joeのコンピュータが互いに同期した場合、そのローカルアイテムではなく、JoesDocuments内のドキュメントに関してやり取りすることになる。このようにして、すべてのJoeのコンピュータは相手が誰であるかを知らなくても互いを理解しあう−そのコミュニティフォルダが同期コミュニティの共通語となるのである。
同期処理サービスの構成は、(1)ローカルフォルダとコミュニティフォルダとの間のマッピングを定義するステップ、(2)何が同期されるか(例えば、同期する相手、送信すべき部分集合、および受信すべきもの)を決定するsyncプロファイルを定義するステップ、および(3)異なるsyncプロファイルが実行されるスケジュールを定義する、または手動で実行するステップの3つのステップからなる。
(1)コミュニティフォルダ−マッピング
コミュニティフォルダマッピングは、個々のマシン上にXML構成ファイルとして格納される。それぞれのマッピングは、以下のスキーマを持つ。
/mappings/communityFolder
この要素は、このマッピングの対象となるコミュニティフォルダの名前を指定する。名前はフォルダの構文規則に従う。
/mappings/localFolder
この要素は、このマッピングの変換先のローカルフォルダの名前を指定する。名前はフォルダの構文規則に従う。フォルダは、マッピングが有効であるためにすでに存在していなければならない。このフォルダ内のアイテムは、このマッピングに従って同期対象とみなされる。
/mappings/transformations
この要素は、アイテムをコミュニティフォルダからローカルフォルダに、またその逆方向に変換する方法を定義する。存在しないか、または空の場合、変換は実行されない。特に、これは、IDがマッピングされないことを意味する。この構成は、主に、Folderのキャッシュを作成する際に使用される。
/mappings/transformations/mapIDs
この要素は、コミュニティIDを再利用するのではなく、新しく生成されたローカルIDがコミュニティフォルダからマッピングされたアイテムのすべてに割り当てられることを要求する。Sync Runtimeは、アイテムの変換、逆変換を行うIDマッピングを保持する。
/mappings/transformations/localRoot
この要素は、コミュニティフォルダ内のすべてのルートアイテムが指定されたルートの子にされることを要求する。
/mappings/runAs
この要素は、このマッピングに対する要求が処理される際の権限を制御する。存在しない場合、送信者が想定される。
/mappings/runAs/sender
この要素が存在すると、このマッピングへのメッセージの送信者は、偽装され、要求はその信用証明書に従って処理されなければならない。
(2)プロファイル
同期プロファイル(Sync Profile)は、同期をキックオフするために必要なパラメータ一式である。これは、SCAにより、同期処理を開始するためSync Runtimeに供給される。ストレージプラットフォーム同士の同期をとるための同期プロファイルは、以下の情報を含む。
・ Local Folder、変更の送り元および送り先として使用される。
・ 同期をとるRemote Folder名−このFolderは、上で定義された通りにマッピングを使用してリモートパートナからパブリッシュされなければならない。
・ Direction−同期処理サービスは、送信のみ、受信のみ、および送受信同期をサポートする。
・ Local Filter−リモートパートナに送信するローカル情報を選択する。ローカルフォルダに対するストレージプラットフォームクエリとして表される。
・ Remote Filter−リモートパートナから取り出すリモート情報を選択する−コミュニティフォルダに対するストレージプラットフォームクエリとして表される。
・ Transformations−ローカル形式のアイテムの変換方法を定義する。
・ ローカルセキュリティ−リモート終点から取り出された変更がリモート終点(偽装)の許可を得て適用するか、またはローカルで同期を開始したユーザの許可を得て適用するかを指定する。
・ 競合解決ポリシー−競合が拒絶されるか、ログに記録されるか、または自動的に解決されるかを指定する−後者の場合、使用する競合リゾルバとともにそれに対する構成パラメータを指定する。
同期処理サービスは、同期プロファイルの単純構築を可能にするランタイムCLRクラスを提供する。プロファイルは、さらに、格納を簡単に行えるようにXMLファイルとの間のシリアライズも行える(スケジュールと一緒であるのが多い)。しかし、すべてのプロファイルが格納されるストレージプラットフォーム内の標準的な場所はなく、SCAは、それを永続せずにその場でプロファイルを構築できるため願ってもないものである。同期を開始するためにローカルマッピングを用意する必要がないことに注意されたい。すべての同期情報は、プロファイル内に指定することができる。しかし、マッピングは、リモート側で開始された同期要求に応答するために必要である。
(3)スケジュール
一実施形態では、同期処理サービスは、それ専用のスケジューリングインフラストラクチャを用意しない。その代わりに、このタスクを実行するために他のコンポーネントに頼る−Microsoft Windows(登録商標)オペレーティングシステムに付属するWindows(登録商標)Schedulerを使用する。同期処理サービスは、SCAとして動作し、XMLファイルに保存されている同期プロファイルに基づいて同期をトリガするコマンドラインユーティリティを備える。このユーティリティを使用すると、スケジュールに従って、またはユーザがログオンまたはログオフするなどのイベントへの応答として同期処理を実行するようにWindows(登録商標)Schedulerを非常に簡単に構成できる。
d)競合回避処理(Conflict Handling)
同期処理サービスにおける競合回避処理は、(1)変更適用時に実行される、競合検出−このステップでは、変更が安全に適用可能か判別する、(2)自動競合解決およびログ記録−このステップでは(競合が検出された直後に実行される)、競合を解決できるか自動競合リゾルバに問い合わせがゆき、できなればオプションで競合をログに記録できる、および(3)競合検査および解決−このステップは、何らかの競合がログに記録されている場合に実行され、同期セッションの状況の外部で実行されるが、このときに、ログに記録された競合は解決され、ログから削除されるようにできる−の3つの段階に分けられる。
(1)競合検出
本発明の実施形態では、同期処理サービスは、知識ベースと制約ベースの2種類の競合を検出する。
(a)知識ベースの競合
知識ベースの競合は、2つのレプリカが同じChange Unitに対し独立の変更を加えたときに発生する。2つの変更は、それらが互いの変更を関知せずに行われる場合に独立して呼び出される−つまり、第1のバージョンは、第2のバージョンについての知識の対象とならず、またその逆もいえる。同期処理サービスは、上述のように、レプリカの知識に基づいてそのようなすべての競合を自動的に検出する。
競合を変更ユニットのバージョン履歴における分岐点と考えると役立つ場合がある。変更ユニットの存続期間中に競合が発生しない場合、そのバージョン履歴は単純連鎖−それぞれの変更は前の変更の後に発生する−である。知識ベースの競合の場合、2つの変更は並行して発生し、そのため、連鎖は分割され、バージョンツリーとなる。
(b)制約ベースの競合
一緒に適用された場合に独立の変更が完全性制約に違反する場合がある。例えば、2つのレプリカが同じディレクトリ内に同じ名前を持つファイルを作成しようとすると、そのような競合が発生するおそれがある。
制約ベースの競合は、2つの独立した変更を伴うが(知識ベースの競合とまったく同様に)、同じ変更ユニットには影響を及ぼさない。むしろ、異なる変更ユニットに影響を及ぼすが、制約がそれらの間に存在する。
同期処理サービスは、変更適用時に制約違反を検出し、制約ベースの競合の通知を自動的に発する。制約ベースの競合を解決するには、通常、制約に違反しないような方法で変更を修正するカスタムコードを必要とするが、同期処理サービスは、そのようなことを行うための汎用メカニズムを備えていない。
(2)競合処理(Conflict Processing)
競合が検出されると、同期処理サービスは、(1)変更を拒絶し、それを送信者に送り返すアクション、(2)競合を競合ログに記録するアクション、または(3)競合を自動的に解決する3つのアクションのうちの1つ(同期プロファイル内の同期イニシエータにより選択される)を実行することができる。
変更が拒絶された場合、同期処理サービスは、変更がレプリカに届かなかったかのように動作する。否定応答が発信者側に送り返される。この解決ポリシーは、主に、競合のログ記録が可能でないヘッドレスレプリカ(ファイルサーバなど)で使用することができる。その代わりに、そのようなレプリカは拒絶することにより競合を処理するように他のレプリカを強制する。
同期イニシエータは、同期プロファイルで競合解決を構成する。同期処理サービスは、以下のようにして単一プロファイル内の複数の競合リゾルバの組合せをサポートする−第1に、どれか1つが成功するまで次々に試みられる競合リゾルバのリストを指定し、第2に、競合リゾルバを競合のタイプに関連付ける、例えば、更新と更新との間の知識ベースの競合を1つのリゾルバに振り向け、他の競合をすべてログに振り向ける。
(a)自動競合解決
同期処理サービスは、多数の既定の競合リゾルバを備える。このリストは以下のものを含む。
・ local−wins:ローカルに格納されているデータとの競合がある場合に受け取った変更を破棄する。
・ remote−wins:受け取った変更との競合がある場合にローカルデータを破棄する。
・ last−writer−wins:変更のタイムスタンプに基づき変更ユニットに従ってlocal−winsまたはremote−winsのいずれかを選択する(同期処理サービスは、一般に、クロック値に依存しないことに注意されたい。この競合リゾルバはその規則に対する唯一の例外である)。
・ Deterministic:すべてのレプリカ上で同じであることを保証される方法で勝利者を選択するが、他の方法では意味がない−同期処理サービスの一実施形態では、この機能を実装するためにパートナIDの辞書式比較を使用する。
さらに、ISVは、独自の競合リゾルバを実装し、インストールすることができる。カスタム競合リゾルバは、構成パラメータを受け付けることができ、そのようなパラメータは、同期プロファイルのConflict ResolutionセクションにあるSCAにより指定されなければならない。
競合リゾルバが競合を処理すると、これは、(競合変更の代わりに)実行される必要のあるオペレーションのリストをランタイムに返す。その後、同期処理サービスは、競合ハンドラ側で考慮していた内容を含むようにリモート知識を適切に調整してから、それらのオペレーションを適用する。
解決を適用している間に他の競合が検出される可能性がある。このような場合、新しい競合は、元の処理が再開する前に解決されなければならない。
競合をアイテムのバージョン履歴内の分岐として考えた場合、競合解決は、結合−2つの分岐を組み合わせて1つのポイントを形成すること−であるとみなすことができる。したがって、競合解決は、バージョン履歴をDAGに変える。
(b)競合ログ作成(Conflict Logging)
非常に特殊な競合リゾルバとして、Conflict Loggerがある。同期処理サービスは、競合を型ConflictRecordのItemとしてログに記録する。これらの記録は、競合が生じているアイテムに再び関係する(アイテム自体が削除されていない限り)。それぞれの競合記録は、競合を引き起こした受け取った変更、競合のタイプ、更新−更新、更新−削除、削除−更新、挿入−挿入、または制約、および受け取った変更のバージョンとそれを送信するレプリカの知識を含む。ログに記録された競合は、後述のように、検査および解決のために使用できる。
(c)競合の検査および解決
同期処理サービスは、アプリケーション側で競合ログを調べ、その中の競合の解決を提案するためのAPIを備えている。このAPIにより、アプリケーションは、すべての競合、または与えられたItemに関係する競合を列挙することができる。これにより、さらに、そのようなアプリケーションは、ログに記録された競合を解決するために、(1)remote wins−ログに記録された変更を受け入れ、競合しているローカルの変更を上書きする、(2)local wins−ログに記録された変更の競合部分を無視する、および(3)suggest new change−アプリケーションが、オプションにより、競合を解決するマージを提案する場合、の3つの方法のうちの1つを使用することができる。アプリケーションにより競合が解決された後、同期処理サービスはそれらをログから削除する。
(d)レプリカの収束および競合解決の伝搬
複雑な同期シナリオでは、同じ競合が複数のレプリカで検出される場合がある。このような状況が生じた場合、以下のイベントが発生する。(1)競合が一方のレプリカで解決され、その解決が他方のレプリカに送られるようにすることができるか、または(2)競合が両方のレプリカ上で自動的に解決されるか、または(3)競合が両方のレプリカで手動で解決される(競合検査APIを通じて)。
必ず収束するように、同期処理サービスは、競合解決を他のレプリカに転送する。競合を解決する変更がレプリカに届くと、同期処理サービスは、この更新により解決されるログに含まれる競合記録を自動的に見つけ出し、それらを削除する。この意味で、一方のレプリカでの競合解決は他方のすべてのレプリカ上でのバインディングになる。
同じ競合について異なるレプリカにより異なる勝利者が選択された場合、同期処理サービスは競合解決をバインドする原理を適用し、2つの解決のうちの1つを選び、自動的に他方を獲得する。勝利者は、いつでも同じ結果が得られるように保証される決定論的方法で選ばれる(一実施形態ではレプリカID辞書式比較を使用する)。
同じ競合について異なるレプリカにより異なる「新しい変更」が提案された場合、同期処理サービスは、この新しい競合を特別な競合として取り扱い、Conflict Loggerを使用して、それが他のレプリカに伝搬しないようにする。そのような状況は、一般に、手動による競合解決において生じる。
2.非ストレージプラットフォームデータストアの同期処理
本発明のストレージプラットフォームの他の態様によれば、ストレージプラットフォームは、ISVが、ストレージプラットフォームとMicrosoft Exchange、AD、Hotmailなどの従来システムとを同期させるSync Adaptersを実装するためのアーキテクチャを備える。Sync Adaptersは、後述のように、同期処理サービスにより提供される多くのSync Serviceを利用する。
その名にもかかわらず、Sync Adaptersは、何らかのストレージプラットフォームアーキテクチャにプラグインとして実装する必要はない。そうしたければ、「sync adapter」は、単に、変更列挙およびアプリケーションなどのサービスを取得するために同期処理サービスランタイムインターフェースを利用するアプリケーションとすることもできる。
与えられたバックエンドとの同期を他から構成し、実行することを簡単にするために、Sync Adapter作成者は、上述のように同期プロファイルが与えられた場合に同期処理を実行する標準のSync Adapterインターフェースを公開するよう奨励される。このプロファイルで、構成情報をアダプタに伝えるが、アダプタは、その一部をランタイムサービス(例えば、同期をとるFolder)を制御するSync Runtimeに受け渡す。
a)同期処理サービス
同期処理サービスは、多数の同期処理サービスをアダプタ作成者に提供する。このセクションの残り部分では、ストレージプラットフォームが同期処理を実行しているマシンを「クライアント」と呼び、アダプタの通信先の非ストレージプラットフォームバックエンドを「サーバ」と呼ぶと都合がよい。
(1)Change Enumeration
Change Enumerationを使用すると、同期処理サービスにより保持されている変更追跡データに基づき、同期処理アダプタは、データストアFolderに対しこのパートナとの同期が最後に試みられた以降に発生した変更を簡単に列挙することができる。
変更は、「アンカー」−最後の同期に関する情報を表す隠蔽型構造−という概念に基づいて列挙される。アンカーは、前のセクションで説明されているように、ストレージプラットフォームの知識という形をとる。変更列挙サービスを使用する同期処理アダプタは、「ストアドアンカー」を使用するものと「サプライドアンカー」を使用するものという2つの広いカテゴリに分類される。
この区別は、最後の同期に関する情報が格納されている場所−クライアントか、それともサーバか−に基づく。アダプタはこの情報をクライアント上に格納するのが簡単である場合が多い−バックエンドは、この情報を簡単に格納できない場合が多い。その一方で、複数のクライアントが同じバックエンドと同期をとる場合、この情報をクライアント上に格納するのは非効率であり、場合によっては正しくない−一方のクライアントが他方のクライアントがすでにサーバにプッシュアップしている変更に気づかない。アダプタ側でサーバストアドアンカーを使用したい場合、そのアダプタは、変更列挙時にストレージプラットフォームへ送り返す必要がある。
ストレージプラットフォームがアンカー(ローカルストレージまたはリモートストレージのいずれかの)を保持するために、ストレージプラットフォームに対し、サーバ側で正常に適用された変更を認識させる必要がある。これらの変更およびこれらの変更のみをアンカーに含めることができる。変更列挙の際にSync Adaptersは、Acknowledgementインターフェースを使用して、正常に適用された変更を報告する。同期の終了時に、サプライドアンカーを使用するアダプタは、新しいアンカー(正常に適用された変更すべてを組み込んだ)を読み込み、それをバックエンドに送る必要がある。
多くの場合、Adaptersは、ストレージプラットフォームのデータストア内に挿入するアイテムとともにアダプタ特有のデータを格納する必要がある。このようなデータの一般的な例として、リモートIDおよびリモートバージョン(タイムスタンプ)がある。同期処理サービスは、このデータを格納するメカニズムを備えており、Change Enumerationは、返される変更とともにこの付加データを受け取るためのメカニズムを備える。これにより、ほとんどの場合に、アダプタ側がデータベースに対し再度クエリを実行する必要がなくなる。
(2)Change Application
Change Applicationを使用すると、Sync Adapters側でバックエンドから受け取った変更をローカルストレージプラットフォームに適用することができる。アダプタは、変更をストレージプラットフォームスキーマに変換することが期待される。
変更適用の主な機能は、競合を自動的に検出することである。ストレージプラットフォームとストレージプラットフォームとの同期の場合のように、競合は、お互いについての知識なしで2つの重なり合う変更が行われることと定義される。アダプタは、Change Applicationを使用する場合、どの競合検出が実行されるかについてアンカーを指定しなければならない。Change Applicationは、アダプタの知識の対象とならない重なり合うローカル変更が検出された場合に競合の通知を発する。Change Enumerationと同様に、アダプタは、ストアドアンカーまたはサプライドアンカーのいずれかを使用することができる。Change Applicationでは、アダプタ特有のメタデータの効率的格納をサポートする。このようなデータは、アダプタにより、適用される変更に付随させることができ、また同時処理サービスにより格納することも可能である。データは、次の変更列挙のときに返すことができるであろう。
(3)Conflict Resolution
上述のConflict Resolutionメカニズム(ログ記録および自動解決オプション)も、同期処理アダプタで利用できる。同期処理アダプタは、変更を適用する場合に競合解決のポリシーを指定することができる。指定した場合、競合は、指定された競合ハンドラに受け渡され、解決されるようにできる(可能ならば)。競合をログに記録することもできる。アダプタは、ローカル変更をバックエンドに適用しようと試みる際に競合を検出する可能性がある。このような場合、アダプタは、それでも、Sync Runtimeにその競合を受け渡し、ポリシーに従って解決することができる。さらに、同期処理アダプタは、同時処理サービスにより検出された競合が処理のため送り返されるように要求することもできる。これは、バックエンドが競合を格納または解決することができる場合に便利である。
b)アダプタの実装
いくつかの「アダプタ」が単に、ランタイムインターフェースを使用するアプリケーションである場合には、アダプタ側で標準アダプターインターフェースを実装することが奨励される。これらのインターフェースを使用することにより、Sync Controlling Applicationsは、与えられた同期プロファイルに従ってアダプタが同期処理を実行するよう要求し、進行中の同期処理をキャンセルし、進行中の同期に関する進行中報告(完了率)を受け取ることができる。
3.セキュリティ
同期処理サービスは、ストレージプラットフォームにより実装されたセキュリティモデルに導入するものをできるだけ少なくしようとする。同期処理のための新しい権利を定義するのではなく、既存の権利が使用される。特に、
・ データストアのItemを読み込める人は誰でも、そのアイテムへの変更を列挙することができ、
・ データストアのItemに書き込める人は誰でも、そのアイテムに変更を適用することができ、
・ データストアのItemを拡張できる人は誰でも、そのアイテムに同期メタデータを関連付けることができるということである。
同期処理サービスでは、セキュリティで保護された著作権情報を保持しない。ユーザUによりレプリカAで変更が加えられ、レプリカBに転送された場合、変更が元々Aで(またはUにより)行われたという事実は失われる。Bがこの変更をレプリカCに転送した場合、これは、Aの権限ではなくBの権限の下で実行される。このため、レプリカがアイテムに対し独自の変更を加えることについて信頼されていない場合、他者により加えられた変更を転送することはできないという制限が生じる。
同期処理サービスは、開始されると、Sync Controlling Applicationによって実行される。同期処理サービスは、SCAの識別を偽装し、その識別の下ですべてのオペレーション(ローカルとリモートの両方)を実行する。説明のため、ユーザUは、ローカル同期処理サービスに、ユーザUが読み取りアクセス権を持たないアイテムについてリモートストレージプラットフォームから変更を取り出させることはできないことを観察する。
4.管理容易性
レプリカの分散コミュニティの監視は複雑な問題である。同期処理サービスは、「スイープ」アルゴリズムを使用して、レプリカのステータスに関する情報を収集し分配することができる。スイープアルゴリズムの特性は、構成されたすべてのレプリカに関する情報は、最終的に回収されること、および失敗(非応答)レプリカが検出されることを保証する。
このコミュニティ規模の監視情報は、すべてのレプリカで利用可能になっている。監視ツールを、任意に選択されたレプリカで実行し、この監視情報を調べて、管理上の決定を下すことができる。構成変更は、影響を受けるレプリカにおいて直接行われなければならない。
H.従来のファイルシステムの相互運用性
上述のように、本発明のストレージプラットフォームは、少なくとも一部の実施形態では、コンピュータシステムのハードウェア/ソフトウェアインターフェースシステムのなくてはならない一部として具現化されることを意図されている。例えば、本発明のストレージプラットフォームは、Microsoft Windows(登録商標)ファミリのオペレーティングシステムなどのオペレーティングシステムの重要な一部として具現化されることができる。その適応力において、ストレージプラットフォームAPIは、アプリケーションプログラムがオペレーティングシステムとやり取りするために使用するオペレーティングシステムAPIの一部となる。そのため、ストレージプラットフォームは、アプリケーションプログラムがオペレーティングシステムに関する情報を格納するために使用する手段となり、したがって、ストレージプラットフォームのItemベースのデータモデルは、そのようなオペレーティングシステムの従来のファイルシステムの代替えとなる。例えば、Microsoft Windows(登録商標)ファミリのオペレーティングシステムで具現化されているように、ストレージプラットフォームでは、そのオペレーティングシステムで実装されているNTFSファイルシステムを置き換えることも可能である。今のところ、アプリケーションプログラムは、Windows(登録商標)ファミリのオペレーティングシステムにより公開されているWin32 APIを通じてNTFSファイルシステムのサービスにアクセスする。
しかし、NTFSファイルシステムを本発明のストレージプラットフォームで完全に置き換えるには、既存のWin32ベースのアプリケーションプログラムをコーディングし直す必要があること、またそのようなコーディングし直しは望ましくないことを理解したうえで、本発明のストレージプラットフォームでNTFSなどの既存のファイルシステムとの何らかの相互運用性を実現することが有益であろう。したがって、本発明の一実施形態では、ストレージプラットフォームにおいて、Win32プログラミングモデルに依存するアプリケーションプログラムはストレージプラットフォームのデータストアと従来のNTFSファイルシステムの両方の内容にアクセスすることができる。この目的のために、ストレージプラットフォームでは、簡単な相互運用性を高めるWin32の命名規則の上位集合となる命名規則を使用する。さらに、ストレージプラットフォームでは、Win32 APIを通じてストレージプラットフォームボリューム内に格納されているファイルおよびディレクトリのアクセスをサポートする。
1.相互運用性のためのモデル
本発明のこの態様によれば、上述の例示的な実施形態において、ストレージプラットフォームは、非ファイルアイテムおよびファイルアイテムを編成できる1つの名前空間を実装する。このモデルを使用すると、以下の利点が得られる。
1.データストア内のフォルダは、ファイルアイテムおよび非ファイルアイテムの両方を含むことができ、それにより、ファイルおよび図式化されたデータの単一の名前空間を提示できる。さらに、すべてのユーザデータに対する一様なセキュリティ、共有、および管理モデルも実現する。
2.ファイルおよび非ファイルアイテムは両方ともストレージプラットフォームAPIを使用してアクセス可能であり、このアプローチではファイルに対し特別な規則は何も適用されず、アプリケーション開発者がかかわるよりきれいなプログラミングモデルを提示する。
3.すべての名前空間オペレーションは、ストレージプラットフォームを通過し、したがって、同期的に取り扱われる。深いプロパティ格上げ(deep property promotion)(ファイルコンテンツから追い出される)はまだ非同期に発生するが、同期オペレーションではユーザおよびアプリケーションにとってかなり予測可能な環境が得られることに注意することが重要である。
このモデルの結果として、本発明の実施形態では、ストレージプラットフォームのデータストア内にマイグレートされないデータソースに対する検索機能を用意することができない。これは、取り外し可能媒体、リモートサーバ、およびローカルディスク上のファイルを含む。外部ファイルシステム内に常駐するアイテムについてストレージプラットフォーム内のプロキシアイテム(ショートカット+格上げされたメタデータ)を明らかにする同期アダプタが用意される。プロキシアイテムは、データソースの名前空間階層またはセキュリティに関してファイルを模倣しようとしない。
ファイルと非ファイルコンテンツとの間の名前空間およびプログラミングモデル上に実現される対称性により、時間の経過とともにアプリケーションがファイルシステムからコンテンツをストレージプラットフォームのデータストア内のより構造化されたアイテムにマイグレートするより優れたパスが得られる。ストレージプラットフォームのデータストアでネイティブファイルアイテム型を実現することにより、アプリケーションプログラムは、Win32を介してこのデータを操作できる一方でファイルデータをストレージプラットフォーム内に移行することができる。最終的に、アプリケーションプログラムは、ストレージプラットフォームAPIに完全に移行し、ファイルではなくストレージプラットフォームのItemに関してそれらのデータを構造化することが可能になるであろう。
2.データストアの機能
望むレベルの相互運用性を実現するために、一実施形態では、ストレージプラットフォームの以下のデータストア機能が実装される。
a)ボリュームではない
ストレージプラットフォームのデータストアは、独立したファイルシステムボリュームとして公開されない。ストレージプラットフォームでは、NTFS上で直接ホスティングされるFILESTREAMを利用する。そのため、ディスク上フォーマットに変更はなく、それにより、ストレージプラットフォームをボリュームレベルで新しいファイルシステムとして公開する必要がなくなる。
その代わりに、データストア(名前空間)がNTFSボリュームに対応する形で構築される。名前空間のこの部分を補助するデータベースおよびFILESTREAMは、ストレージプラットフォームのデータストアが関連付けられるNTFSボリューム上に配置される。システムボリュームに対応するデータストアも用意される。
b)ストア構造
ストアの構造は、実施例を見ると最もよくわかる。例えば、図16に例示されているような、HomeMachineという名前のマシンのシステムボリューム上のディレクトリツリーを考える。本発明のファイルシステム相互運用性機能により、c:\ドライブに対応して、例えば、「WinFSOnC」と呼ばれる、UNC共有を介してWin32 APIに公開されるストレージプラットフォームのデータストアがある。これにより、UNC名\\HomeMachine\WinFSOnCを介して関連付けられたデータストアにアクセスできるようになる。
この実施形態では、ファイルおよび/またはフォルダは、NTFSからストレージプラットフォームに明示的にマイグレートする必要がある。したがって、ユーザがストレージプラットフォームに備えられているすべての付加的検索/分類機能を利用するためにMy Documentsフォルダをストレージプラットフォームのデータストア内に移動したい場合、階層は、図17に示されているように見えるであろう。これらのフォルダは、この実施例では、実際に移動されることに注意することが重要である。他の注意すべき点として、名前空間はストレージプラットフォーム内に移動され、実際のストリームはFILESTREAMとリネームされ、適切なポインタがストレージプラットフォーム内で結び付けられることが挙げられる。
c)すべてのファイルがマイグレートされるわけではない
ユーザデータに対応する、またはストレージプラットフォームが備える検索および分類機能を必要とするファイルは、ストレージプラットフォームのデータストアにマイグレートすべき対象候補となる。アプリケーションプログラムとストレージプラットフォームとの互換性の問題を限定するために、本発明のストレージプラットフォームにマイグレートされるファイルの集合は、Microsft Windows(登録商標)オペレーティングシステムが使用されている状況では、Documents and Settingsディレクトリ内のMyDocumentsフォルダ、Internet Explorer(IE)Favorites、IE History、およびDesktop.iniファイル内のファイルに限定されるのが好ましい。Windows(登録商標)システムファイルのマイグレートは許されないことが好ましい。
d)NTFS名前空間でのストレージプラットフォームファイルへのアクセス
本明細書で説明されている実施形態では、ストレージプラットフォームにマイグレートされたファイルは、実線のファイルストリームがNTFSに格納されるとしても、NTFS名前空間を介してアクセスされないことが望ましい。こうすることで、多角的な実装から生じる考慮すべきロックおよびセキュリティの複雑な問題が回避される。
e)予期される名前空間/ドライブ文字
ストレージプラットフォーム内のファイルおよびフォルダへのアクセスは、\\<マシン名>\<WinfsShareName>の形式のUNC名を介して実行される。オペレーションにドライブ文字を必要とするアプリケーションのクラスについては、ドライブ文字をこのUNC名にマッピングすることができる。
I.ストレージプラットフォームAPI
上述のように、ストレージプラットフォームは、アプリケーションプログラム側で上述のストレージプラットフォームの機能および能力にアクセスし、データストアに格納されているアイテムにアクセスするために使用できるAPIを備える。このセクションでは、本発明のストレージプラットフォームのストレージプラットフォームAPIの一実施形態について説明する。
図19は、本発明の一実施形態による、ストレージプラットフォームAPIの基本アーキテクチャを例示する。ストレージプラットフォームAPIでは、SQLCIient1900を使用してローカルデータストア302とやり取りし、またSQLClient1900を使用してリモートデータストア(例えば、データストア338)とやり取りすることができる。ローカルストア302は、さらに、DQP(分散クエリプロセッサ)を使用するか、または上述のストレージプラットフォーム同期サービス(「Sync」)を通じて、リモートデータストア338ともやり取りできる。ストレージプラットフォームAPI322は、さらに、データストア通知用のブリッジAPIとして機能し、上述のように、アプリケーションのサブスクリプションを通知エンジン332に受け渡し、通知をアプリケーション(例えば、アプリケーション350a、350b、または350c)にルーティングする。一実施形態では、ストレージプラットフォームAPI 322は、さらに、Microsoft ExchangeおよびADでデータにアクセスできるように制限された「プロバイダ」アーキテクチャを定義することもできる。
1.概要
本発明のストレージプラットフォームAPIのこの実施形態のデータアクセスメカニズムでは、クエリ、ナビゲーション、アクション、イベントの4つの領域を取り扱う。
クエリ
一実施形態では、ストレージプラットフォームのデータストアは、リレーショナルデータベースエンジン314上に実装され、その結果、SQL言語の完全な表現力がストレージプラットフォームに内在する。より高い水準のクエリオブジェクトにより、ストアへのクエリを実行する簡素化されたモデルが実現されるが、ストレージの完全な表現力をカプセル化することはできない。
ナビゲーション
ストレージプラットフォームデータモデルは、基礎となるデータベース抽象化の上にリッチな拡張可能型システムを構築する。開発者にとっては、ストレージプラットフォームデータはクモの巣状に巡らされたアイテムである。ストレージプラットフォームAPIを使用することにより、フィルタ処理、関係、フォルダなどを介してアイテムからアイテムへのナビゲーションが可能になる。これは、基本SQLクエリよりも高い水準の抽象化であり、それと同時に、リッチなフィルタ処理およびナビゲーション機能をおなじみのCLRコーディングパターンとともに使用することができる。
アクション
ストレージプラットフォームAPIは、すべてのアイテムに対する共通アクション−Create、Delete、Update−を公開し、これらは、オブジェクト上のメソッドとして公開される。さらに、SendMail、CheckFreeBusyなどのドメイン固有のアクションもメソッドとして利用可能である。APIフレームワークでは、追加アクションを定義することにより値を加えるためにISVで使用できる適切に定義されたパターンを使用する。
イベント
ストレージプラットフォーム内のデータは、動的である。ストア内のデータが変更されたときにアプリケーションに反応させるために、このAPIではリッチイベンティング、サブスクリプション、および通知機能を開発者に公開する。
2.命名およびスコープ
名前空間と命名とを区別すると好都合である。名前空間という用語は、通常使用されている用法では、あるシステム内で使用可能なすべての名前の集合を指す。このシステムは、XMLスキーマ、プログラム、Web、すべてのftpサイト(およびそのコンテンツ)の集合などとすることが可能である。命名は、名前空間内の注目するすべてのエンティティに一意的な名前を割り当てるために使用されるプロセスまたはアルゴリズムである。したがって、命名は、名前空間内の与えられたユニットを明確に参照することが望ましいため重要である。したがって、本明細書で使用されているように用語「名前空間」は、ユニバース内のすべてのストレージプラットフォームのインスタンスで使用可能なすべての名前の集合を指す。アイテムは、ストレージプラットフォーム名前空間内の名前付きエンティティである。UNC命名規約を使用して、アイテム名の一意性を保証する。ユニバース内のすべてのストレージプラットフォームのデータストアの中のすべてのアイテムは、UNC名でアドレス指定することが可能である。
ストレージプラットフォーム名前空間内の最高の組織レベルは、1つのサービスであり、これは単なるストレージプラットフォームのインスタンスである。組織の次のレベルは、ボリュームである。ボリュームは、アイテムの最大の自律的コンテナである。それぞれのストレージプラットフォームのインスタンスは、1つまたは複数のボリュームを含む。ボリューム内にはアイテムがある。アイテムは、ストレージプラットフォーム内のデータアトムである。
現実世界のデータは、ほぼ常に、与えられたドメイン内で意味を持つ何らかのシステムに従って編成される。このようなすべてのデータ編成スキームの基礎にあるのが、われわれのデータのユニバースを複数の名前付きグループに分割するという概念である。上述のように、この概念は、Folderの概念によりストレージプラットフォーム内にモデル化される。Folderは、特別な型のItemであり、Containment FolderとVirtual Folderの2種類のFolderがある。
図18を参照すると、Containment Folderは他のItemとの保持Relationshipsを含むアイテムであり、ファイルシステムのフォルダの共通概念の等価物である。それぞれのItemは少なくとも1つの包含フォルダ内に「含まれる」。
Virtual Folderは、Itemのコレクションを編成するより動的な方法であり、Itemの集合が与えられた単なる名前である−この集合は、クエリにより明示的に列挙されるか、または指定される。Virtual Folderは、それ自体、Itemであり、Itemの集合との(非保持)Relationshipsを表すものと考えられる。
ときには、包含というより緊密な概念をモデル化する必要があり、例えば、電子メールメッセージ内に埋め込まれたWordドキュメントは、ある意味で、例えば、フォルダ内に格納されたファイルに比べて、コンテナに緊密にバインドされている。この概念は、Embedded Itemの概念により表される。Embedded Itemは、他のItemを参照する特別な種類の関係を持ち、参照される側のItemは、包含する側のItemのコンテクスト内でのみバインドまたは他の何らかの方法で操作されうる。
最後に、ストレージプラットフォームは、カテゴリの概念をItemおよびElementsの分類方法として実現する。ストレージプラットフォーム内のすべてのItemまたはElementは、1つまたは複数のカテゴリと関連付けることができる。カテゴリは、本質的に、Item/Elementにタグ付けされた単なる名前である。この名前は、検索で使用することができる。ストレージプラットフォームのデータモデルにより、カテゴリの階層を定義することができ、したがって、データをツリー形式で分類することができる。
アイテムの曖昧さのない名前は、3つ組み(<serviceName>,<volumeID>,<ItemID>)である。いくつかのアイテム(特に、FoldersおよびVirtual Folders)は、他のアイテムのコレクションである。これにより、アイテムを識別する代替え手段が得られる(<serviceName>,<volumeID>,<itemPath>)。
ストレージプラットフォーム名は、サービスコンテクストの概念を含み、サービスコンテクストは、ペア(<volumeName>,<path>)にマッピングされる名前である。これは、アイテムまたはアイテムの集合−例えば、フォルダ、仮想フォルダなど−を識別する。サービスコンテクストの概念を使用することにより、ストレージプラットフォーム名前空間内のアイテムに対するUNC名は、\\<serviceName>\<serviceContext>\<itemPath>となる。
ユーザは、サービスコンテクストの作成および削除を実行できる。また、それぞれのボリューム内のルートディレクトリは、事前定義されたコンテクストvolume−name$を持つ。
ItemContextは、指定されたパス内に存続するItemに返される結果を制限することによりクエリ(例えば、Findオペレーション)のスコープを設定する。
3.ストレージプラットフォームAPIコンポーネント
図20は、本発明のこの実施形態による、ストレージプラットフォームAPIの様々なコンポーネントの概略を表している。ストレージプラットフォームAPIは、(1)ストレージプラットフォーム要素およびアイテム型を表す、データクラス2002、(2)オブジェクト永続性を管理し、サポートクラス2006を提供する、ランタイムフレームワーク2004、および(3)ストレージプラットフォームスキーマからCLRクラスを生成するために使用される、ツール2008の各コンポーネントからなる。
本発明の一態様によれば、設計時に、スキーマ作成者は、ドメインメソッド2012のスキーマドキュメント2010およびコードをストレージプラットフォームAPI設計時ツール2008の集合にサブミットする。これらのツールは、クライアントサイドデータクラス2002およびストアスキーマ2014を生成し、そのスキーマに対応するクラス定義2016を格納する。「ドメイン」は、特定のスキーマを指し、例えば、Contactsスキーマ内のクラスに対するドメインメソッドなどを意味する。これらのデータクラス2002は、ストレージプラットフォームデータを操作するために、ストレージプラットフォームAPIランタイムフレームワーククラス2006に呼応して、アプリケーション開発者により実行時に使用される。
本発明のストレージプラットフォームAPIの様々な態様を例示することを目的として、例示的なContactsスキーマに基づき実施例を提示する。この例示的なスキーマの図式表現が図21Aおよび21Bに示されている。
4.データクラス
本発明の一態様によれば、ストレージプラットフォームのデータストア内のそれぞれのItem、Item Extension、およびElement型は、それぞれのRelationshipとともに、ストレージプラットフォームAPI内に対応するクラスを持つ。おおざっぱに言うと、その型のフィールドは、そのクラスのフィールドにマッピングされるということである。ストレージプラットフォーム内のそれぞれのアイテム、アイテム拡張、および要素は、ストレージプラットフォームAPI内の対応するクラスのオブジェクトとして使用することができる。開発者は、それらのオブジェクトに対するクエリ、作成、修正、または削除を行うことができる。
ストレージプラットフォームは、スキーマの初期集合を含む。それぞれのスキーマは、ItemおよびElement型の集合、およびRelationshipsの集合を定義する。以下は、これらのスキーマエンティティからデータクラスを生成するアルゴリズムの一実施形態である。
それぞれのスキーマSについて、
S内のそれぞれのItem Iについて、System.Storage.S.Iという名前のクラスが生成される。このクラスは以下のメンバを持つ。
・ 新しいアイテムの初期フォルダおよび名前を指定するために使用されるコンストラクタを含む、オーバーロードされたコンストラクタ。
・ I内のそれぞれのフィールドのプロパティ。フィールドが多値の場合、プロパティは、対応するElement型のコレクションになる。
・ フィルタとマッチする複数のアイテムを見つけるオーバーロードされた静的メソッド(例えば、「FindAll」という名前のメソッド)。
・ フィルタとマッチする単一のアイテムを見つけるオーバーロードされた静的メソッド(例えば、「FindOne」という名前のメソッド)。
・ idを与えられたアイテムを見つける静的メソッド(例えば、「FindByID」という名前のメソッド)。
・ ItemContextに関して名前を与えられたアイテムを見つける静的メソッド(例えば、「FindByName」という名前のメソッド)。
・ アイテムへの変更を保存するメソッド(例えば、「Update」という名前のメソッド)。
・ アイテムの新しいインスタンスを作成するオーバーロードされた静的なCreateメソッド。これらのメソッドを使用することにより、アイテムの初期フォルダを様々な方法で指定することができる。
S内のそれぞれのElement Eについて、System.Storage.S.Eという名前のクラスが生成される。このクラスは以下のメンバを持つ。
・ E内のそれぞれのフィールドのプロパティ。フィールドが多値の場合、プロパティは、対応するElement型のコレクションになる。
S内のそれぞれのElement Eについて、System.Storage.S.ECollectionという名前のクラスが生成される。このクラスは、強く型付けされているコレクションクラスについての一般的な.NET Frameworkガイドラインに従う。Relationshipベースの要素型について、このクラスは、さらに、以下のメンバも含む。
・ コレクションがソースロール内に出現するアイテムを暗黙のうちに含むフィルタにマッチする複数のItemオブジェクトを見つけるオーバーロードされたメソッド。これらのオーバーロードは、Item子型に基づいてフィルタ処理を行えるものを含む(例えば、「FindAllTargetItem」という名前のメソッド)。
・ コレクションがソースロール内に出現するアイテムを暗黙のうちに含むフィルタにマッチする単一のItemオブジェクトを見つけるオーバーロードされたメソッド。これらのオーバーロードは、Item子型に基づいてフィルタ処理を行えるものを含む(例えば、「FindOneTargetItem」という名前のメソッド)。
・ コレクションがソースロール内に出現するアイテムを暗黙のうちに含むフィルタにマッチするネストされた要素型のオブジェクトを見つけるオーバーロードされたメソッド(例えば、「FindAllRelationships」という名前のメソッド)。
・ コレクションがソースロール内に出現するアイテムを暗黙のうちに含むフィルタにマッチするネストされた要素型のオブジェクトを見つけるオーバーロードされたメソッド(例えば、「FindAlIRelationshipsForTarget」という名前のメソッド)。
・ コレクションがソースロール内に出現するアイテムを暗黙のうちに含むフィルタにマッチするネストされた要素型の単一オブジェクトを見つけるオーバーロードされたメソッド(例えば、「FindOneRelationship」という名前のメソッド)。
・ コレクションがソースロール内に出現するアイテムを暗黙のうちに含むフィルタにマッチするネストされた要素型の単一オブジェクトを見つけるオーバーロードされたメソッド(例えば、「FindOneRelationshipForTarget」という名前のメソッド)。
S内のRelationship Rについて、System.Storage.S.Rという名前のクラスが生成される。このクラスは、一方または両方の関係ロールで1つの終点フィールドを指定するかどうかに応じて、1つまたは2つのサブクラスを持つ。
クラスは、さらに、作成されたそれぞれのItem Extensionについてもこのようにして生成される。
データクラスは、System.Storage.<schemaName>名前空間内に存在するが、ただし、<schemaName>は、Contacts、Filesなどの対応するスキーマの名前である。例えば、Contactsスキーマに対応するすべてのクラスは、System.Storage.Contacts名前空間内にある。
例えば、図21Aおよび21Bを参照すると、Contactsスキーマにより、System.Storage.Contact名前空間に含まれる以下のクラスが得られることがわかる。
・ Item:Item、Folder、WellKnownFolder、LocalMachineDataFolder、UserDataFolder、Principal、Service、GroupService、PersonService、PresenceService、ContactService、ADService、Person、User、Group、Organization、HouseHold
・ Elements:NestedElementBase、NestedElement、IdentityKey、SecurityID、EAddress、ContactEAddress、TelephoneNumber、SMTPEAddress、InstantMessagingAddress、Template、Profile、FullName、FamilyEvent、BasicPresence、Windows(登録商標)Presence、Relationship、TemplateRelationship、LocationRelationship、FamilyEventLocationRelationship、HouseHoldLocationRelationship、RoleOccupancy、EmployeeData、GroupMemberShip、OrganizationLocationRelationship、HouseHoldMemberData、FamilyData、SpouseData、ChildData
さらに例えば、Contactsスキーマで定義されているような、Person型の詳細構造体は、以下のXMLで示されている。
Figure 0004394644
この型により、以下のクラスが得られる(パブリックメンバのみが示されている)。
Figure 0004394644
Figure 0004394644
さらに他の実施例では、Contactsスキーマで定義されているような、TelephoneNumber型の詳細構造体は、以下のXMLで示されている。
Figure 0004394644
この型により、以下のクラスが得られる(パブリックメンバのみが示されている)。
Figure 0004394644
与えられたスキーマから生じるクラスの階層は、直接、そのスキーマ内の型の階層を反映する。例えば、Contactsスキーマで定義されているItem型を考察する(図21Aおよび図21Bを参照)。ストレージプラットフォームAPIにおいてこれに対応するクラス階層は以下の通りであろう。
Figure 0004394644
さらに他のスキーマ、つまりシステム内のすべてのオーディオ/ビデオ媒体(リッピングされたオーディオファイル、オーディオCD、DVD、ホームビデオなど)を表すことができるスキーマにより、ユーザ/アプリケーションは様々な種類のオーディオ/ビデオ媒体の格納、編成、検索、および操作を行うことができる。この基本媒体ドキュメントスキーマは、任意の媒体を表せる十分な汎用性を持ち、この基本スキーマの拡張は、オーディオおよびビデオ媒体について別々にドメイン特有のプロパティを扱うように設計されている。このスキーマ、および他の多くのものは、Core Schemaの下で直接的または間接的に動作するように想定されている。
5.ランタイムフレームワーク
基本ストレージプラットフォームAPIプログラミングモデルはオブジェクト永続性である。アプリケーションプログラム(または「アプリケーション」)は、ストア上で検索を実行し、ストア内のデータを表すオブジェクトを取り出す。アプリケーションは、取り出されたオブジェクトを修正するか、または新しいオブジェクトを作成し、その後、その変更をストア内に伝搬させる。このプロセスは、ItemContextオブジェクトにより管理される。検索は、ItemSearcherオブジェクトを使用して実行され、検索結果は、FindResultオブジェクトを介してアクセス可能である。
a)ランタイムフレームワーククラス
ストレージプラットフォームAPIの発明の他の態様によれば、ランタイムフレームワークは、データクラスのオペレーションをサポートする多数のクラスを実装する。これらのフレームワーククラスは、データクラスに対するビヘイビアの共通の集合を定義し、データクラスとあわせて、ストレージプラットフォームAPIの基本プログラミングモデルを実現する。ランタイムフレームワーク内のクラスは、System.Storage名前空間に属す。この実施形態では、フレームワーククラスは、主要クラスとしてItemContext、ItemSearcher、およびFindResultを含む。他の小さなクラス、enum値、およびデリゲートも提供することができる。
(1)ItemContext
ItemContextオブジェクトは、(i)アプリケーションプログラムで検索したいアイテムドメインの集合を表し、(ii)ストレージプラットフォームから取り出されたデータの状態を表すそれぞれのオブジェクトの状態情報を保持し、(iii)ストレージプラットフォームとやり取りするときに使用されるトランザクションおよびストレージプラットフォームと相互運用可能なファイルシステムを管理する。
ItemContextは、オブジェクト永続性エンジンとして、以下のサービスを提供する。
1.ストアから読み込まれたデータを複数のオブジェクト内に逆シリアライズする。
2.オブジェクトIDを保持する(アイテムが与えられた場合にそのアイテムがクエリの結果に何回含まれていようと同じオブジェクトを使用してそのアイテムを表す)。
3.オブジェクト状態を追跡する。
ItemContextは、さらに、ストレージプラットフォームに固有の多数のサービスを実行する。
1.変更を永続するために必要なストレージプラットフォーム更新グラムオペレーションを生成し、実行する。
2.必要に応じて複数のデータストアへの接続を作成し、参照関係の継ぎ目のないナビゲーションを可能にし、複数ドメイン検索から取り出されたオブジェクトを修正し、保存するようにできる。
3.ファイルで裏付けされたアイテムは、そのアイテムを表す(複数の)オブジェクトへの変更が保存されるときに適切に更新されることを保証する。
4.複数のストレージプラットフォーム接続にまたがるトランザクション、およびファイルで裏付けされたアイテム内に格納されているデータおよびファイルストリームプロパティを更新するときには、トランザクションが行われるファイルシステムを管理する。
5.ストレージプラットフォームの関係の意味、ファイルで裏付けされたアイテム、およびストリーム型付けプロパティを考慮するアイテム作成、コピー、移動、および削除オペレーションを実行する。
付録Aに、一実施形態による、ItemContextクラスのソースコードリスティングを掲載する。
(2)ItemSearcher
ItemSearcherクラスは、単純な検索をサポートし、Itemオブジェクト全体、Itemオブジェクトのストリーム、またはItemから射影された値のストリームを返す。ItemSearcherは、これらすべてに共通のコア機能、つまりターゲット型およびそのターゲット型に適用されるパラメータ化されたフィルタの概念をカプセル化したものである。また、ItemSearcherを使用することにより、同じ検索が複数の型で実行される場合にサーチャーを、最適化として、プリコンパイルする、つまり準備しておくことができる。付録Bには、一実施形態による、ItemSearcherクラスおよび複数の密接に関係するクラスのソースコードリスティングを掲載する。
(a)ターゲット型
検索ターゲット型は、ItemSearcherを構築するときに設定される。ターゲット型は、データストアによりクエリ可能なエクステントにマッピングされる。特に、これは、スキーマ化されたビューとともにアイテム、関係、およびアイテム拡張型にマッピングされるCLR型である。
ItemContext.GetSearcherメソッドを使用してサーチャーを取り出す場合、サーチャーのターゲット型は、パラメータとして指定される。アイテム、関係、またはアイテム拡張型(Person.GetSearcher)に対し静的なGetSearcherメソッドが呼び出される場合、ターゲット型は、そのアイテム、関係、またはアイテム拡張型である。
ItemSearcherで与えられる検索式(例えば、「search filter and through find」オプションまたは射影定義)は、常に、その検索ターゲット型に関係する。これらの式は、ターゲット型のプロパティ(ネストされた要素のプロパティを含む)を指定することができ、また他のところで説明されているような関係およびアイテム拡張への結合を指定することができる。
検索ターゲット型は、読み取り専用プロパティ(例えば、ItemSearcher.Typeプロパティ)を介して使用可能にされる。
(b)フィルタ
ItemSearcherは、検索で使用されるフィルタを定義するフィルタを指定するプロパティ(例えば、SearchExpressionオブジェクトのコレクションとして「Filters」という名前が付けられているプロパティ)を含む。このコレクション内のすべてのフィルタは、検索が実行されるときに、論理および演算子を使用して結合される。フィルタは、パラメータ参照を含むことができる。パラメータ値は、Parametersプロパティを通じて指定される。
(c)検索の準備
同じ検索が、場合によってはパラメータ変更のみで、繰り返し実行される状況では、検索をプリコンパイルする、つまり準備しておくことにより、パフォーマンスをある程度改善することが可能である。これは、ItemSearcher上のprepareメソッドの集合で実行される(例えば、たぶん「PrepareFind」という名前の1つまたは複数のItemを返すFindを準備するメソッド、およびたぶん「PrepareProject」という名前の射影を返すFindを準備するメソッド)。例えば、次のようである。
Figure 0004394644
(d)検索オプション
単純検索に適用することができるオプションは多数ある。これらは、例えば、FindOptionsオブジェクトで指定し、Findメソッドに渡すことができる。例えば、次のようである。
Figure 0004394644
都合のよいことに、並べ替えオプションも、Findメソッドに直接渡すことができる。
Figure 0004394644
DelayLoadオプションは、検索結果が取り出されるときに大きなバイナリプロパティの値がロードされるか、または参照されるまでロードが遅らされるかを決定する。MaxResultsオプションは、返される結果の最大数を決定する。これは、SQLクエリでTOPを指定することに相当する。並べ替えとともに使用するのが最も多い。
一連のSortOptionオブジェクトを指定することができる(例えば、FindOptions.SortOptionsプロパティを使用する)。検索結果は、第1のSortOptionオブジェクトにより指定された通りに並べ替えられ、その後、第2のSortOptionオブジェクトにより指定された通りに並べ替えられ、というように続く。SortOptionでは、並べ替えに使用されるプロパティを示す検索式を指定する。この式は、以下のうちの1つを指定する。
1.検索ターゲット型のスカラープロパティ、
2.単一値プロパティをトラバースすることにより検索ターゲット型から到達可能なネストされた要素内のスカラープロパティ、または
3.有効な引数を持つ集計関数の結果(例えば、多値プロパティまたは関係をトラバースすることにより検索ターゲット型から到達可能なネストされた要素内のスカラープロパティに適用されるMax)。
例えば、検索ターゲット型がSystem.Storage.Contact.Personであると仮定すると、
1.「Birthdate」−有効、birthdateはPerson型のスカラープロパティである。
2.「PersonalNames.Surname」−無効、PersonalNamesは多値プロパティであり、集計関数は使用されていない。
3.「Count(PersonalNames)」−有効、PersonalNamesのカウント。
4.「Case(Contact.MemberOfHousehold).Household.HouseholdEAddresses.StartDate」−無効、集計関数なしで関係および多値プロパティを使用する。
5.「Max(Cast(Contact.MemberOfHousehold).Household.HouseholdEAddresses.StartDate)」−有効、一番最近の家庭の電子メールアドレス開始日。
(3)アイテム結果ストリーム(「FindResult」)
ItemSearcherは(例えば、FindAllメソッドを通じて)、検索(例えば、「FindResult」オブジェクト)により返されるオブジェクトにアクセスするために使用することができるオブジェクトを返す。付録Cには、一実施形態による、FindResultクラスおよび複数の密接に関係するクラスのソースコードリスティングを掲載する。
FindResultオブジェクトから結果を得るには、IObjectReader(およびIAsyncObjectReader)により定義されたリーダーパターンを使用することと、IEnumerableおよびIEnumeratorにより定義されたような列挙子パターンを使用することの2つ異なる方法がある。列挙子パターンは、CLRでは標準であり、C#のforeachのような言語構文をサポートする。例えば、次のようである。
Figure 0004394644
リーダーパターンがサポートされているのは、これにより、場合によってはデータコピーをなくすことで結果の処理効率を高めることができるからである。例えば、次のようである。
Figure 0004394644
さらに、リーダーパターンは、非同期オペレーションをサポートする。
Figure 0004394644
この実施形態では、必要なくなったらFindResultを閉じなければならない。これは、Closeメソッドを呼び出すか、またはステートメントを使用するC#などの言語構文を使用することにより実行できる。例えば、次のようである。
Figure 0004394644
b)動作中のランタイムフレームワーク
図22は、動作中のランタイムフレームワークを例示している。ランタイムフレームワークは以下のように動作する。
1.アプリケーション350a、350b、または350cは、ストレージプラットフォーム内のアイテムにバインドする。
2.フレームワーク2004は、バインドされたアイテムに対応するItemContextオブジェクト2202を作成し、アプリケーションに返す。
3.アプリケーションは、このItemContext上でFindをサブミットして、Itemのコレクションを取得し、返されるコレクションは、概念上オブジェクトグラフ2204となる(関係により)。
4.アプリケーションは、データを変更、削除、および挿入する。
5.アプリケーションは、Update()メソッドを呼び出して変更を保存する。
c)共通プログラミングパターン
この節では、ストレージプラットフォームAPIフレームワーククラスを使用してデータストア内のアイテムを操作する方法の様々な実施例を取りあげる。
(1)ItemContextオブジェクトを開く、閉じる
アプリケーションは、例えば、静的なItemContext.Openを呼び出し、ItemContextに関連付けられるアイテムドメインを識別する1つまたは複数のパスを供給することにより、データストアを対話操作するために使用するItemContextオブジェクトを取得する。アイテムドメインは、ItemContextを使用して実行される検索をスコープに設定し、そのドメインアイテムおよびそのアイテムに含まれるアイテムのみが検索対象になるようにする。実施例は、以下の通りである。
ローカルコンピュータ上のDefaultStoreストレージプラットフォーム共有を使用してItemContextを開く
Figure 0004394644
与えられたストレージプラットフォーム共有を使用してItemContextを開く
Figure 0004394644
ストレージプラットフォーム共有の下のアイテムを使用してItemContextを開く
Figure 0004394644
複数のアイテムドメインを使用してItemContextを開く
Figure 0004394644
ItemContextは、必要なくなったら、閉じなければならない。
ItemContextを明示的に閉じる
Figure 0004394644
ItemContextを使用してusingステートメントを閉じる
Figure 0004394644
(2)オブジェクトの検索
本発明の他の態様によれば、ストレージプラットフォームAPIは、アプリケーションプログラマが基礎のデータベースエンジンのクエリ言語の詳細を気にせずに、データストア内のアイテムの様々なプロパティに基づいて、クエリを形成するために使用できるようにする簡略化されたクエリモデルを備える。
アプリケーションは、ItemContext.GetSearcherメソッドによって返されるItemSearcherオブジェクトを使用してItemContextが開かれたときに指定されたドメイン間で検索を実行することができる。検索結果にアクセスするには、FindResultオブジェクトを使用する。以下の実施例では以下の宣言を仮定する。
Figure 0004394644
基本検索パターンは、GetSearcherメソッドを呼び出すことによりItemContextから取り出されたItemSearcherオブジェクトを使用することを伴う。
与えられた型のすべてのアイテムを検索する
Figure 0004394644
フィルタ条件を満たす与えられた型のアイテムを検索する
Figure 0004394644
フィルタ文字列内でパラメータを使用する
Figure 0004394644
与えられた型を持ち、フィルタ条件を満たす関係を検索する
Figure 0004394644
与えられた型を持ち、フィルタ条件を満たす関係を持つアイテムを検索する
Figure 0004394644
与えられた型を持ち、フィルタ条件を満たすアイテム拡張を検索する
Figure 0004394644
与えられた型を持ち、フィルタ条件を満たすアイテム拡張を持つアイテムを検索する
Figure 0004394644
(a)検索オプション
検索を実行する際に、並べ替え、遅延ロード、および結果の数の制限を含む、様々なオプションを指定することができる。
検索結果を並べ替える
Figure 0004394644
結果カウントを制限する
Figure 0004394644
(b)FindOneおよびFindOnly
ときには第1の結果のみを取り出すことが有用な場合があり、特に並べ替え条件を指定する場合である。さらに、ある種の検索は、ただ1つのオブジェクト返すことが予期され、オブジェクトをまったく返さないことは予期されない。
1つのオブジェクトを検索する
Figure 0004394644
常に存在することが予期される単一オブジェクトを検索する
Figure 0004394644
(c)ItemContextのショートカットを検索する
単純検索の実行をできる限り簡単にするItemContext上のショートカットメソッドも多数ある。
ItemContext.FindAllショートカットを使用して検索する
Figure 0004394644
ItemContext.FindOneショートカットを使用して検索する
Figure 0004394644
(d)IDまたはパスで検索する
さらに、アイテム、関係、およびアイテム拡張は、その(複数の)idを与えることにより取り出すことができる。アイテムは、さらに、パスによっても取り出せる。
(複数の)idを与えてアイテム、関係、およびアイテム拡張を取得する
Figure 0004394644
パスを与えてアイテムを取得する
Figure 0004394644
(e)GetSearcherパターン
他のオブジェクトのコンテクストで、または特定のパラメータとともに、検索を実行するヘルパメソッドを用意することが望ましい場所がストレージプラットフォームAPI内に多数ある。GetSearcherパターンを使用することで、これらのシナリオが可能になる。APIには多数のGetSearcherメソッドが用意されている。それぞれ、与えられた検索を実行するように事前に構成されたItemSearcherを返す。例えば、次のようである。
Figure 0004394644
検索を実行する前に追加フィルタを付加することができる。
Figure 0004394644
結果をどのような形で望むかを選択することができる。
Figure 0004394644
(3)ストアの更新
オブジェクトは、検索により取り出された後、必要に応じてアプリケーションにより修正することができる。新しいオブジェクトも作成し、既存のオブジェクトに関連付けることもできる。アプリケーションは、論理グループを形成するすべての変更を加えた後に、ItemContext.Updateを呼び出して、ストアへの変更を永続的にする。本発明のストレージプラットフォームAPIのさらに他の態様によれば、このAPIは、アプリケーションプログラムによりアイテムに加えられた変更を集めてから、それらをデータストアが実装されているデータベースエンジン(または何らかの種類のストレージエンジン)により要求される正しい更新に編成する。これにより、アプリケーションプログラマは、データストア更新の複雑な部分をAPIに任せつつ、メモリ中のアイテムに変更を加えることができる。
単一アイテムへの変更を保存する
Figure 0004394644
複数アイテムへの変更を保存する
Figure 0004394644
新しいアイテムを作成する
Figure 0004394644
関係(および可能ならターゲットアイテム)を削除する
Figure 0004394644
アイテム拡張を追加する
Figure 0004394644
アイテム拡張を削除する
Figure 0004394644
6.セキュリティ
上の節II.E(セキュリティ)を参照すると、ストレージプラットフォームAPIのこの実施形態では、ストア内のアイテムに関連付けられているセキュリティポリシーの取り出しおよび修正を行うためにItem Context上で使用可能なメソッドが5つある。これらは以下の通りである。
1.GetItemSecurity、
2.SetItemSecurity、
3.GetPathSecurity、
4.SetPathSecurity、
5.GetEffectiveItemSecurity。
GetItemSecurityおよびSetItemSecurityは、アイテムに関連付けられた明示的なACLを取り出し、修正するメカニズムを備える。このACLは、アイテムへの存在するパスとは無関係であり、このアイテムをターゲットとして持つ保持関係とは無関係に動作する。このため、管理者は、そうしたい場合にアイテムへの存在するパスとは無関係にアイテムセキュリティについて推論することができる。
GetPathSecurityおよびSetPathSecurityは、他のフォルダからの保持関係があるため、アイテム上に存在するACLを取り出し、修正するメカニズムを備える。このACLは、考察対象のパスにそってそのアイテムへの様々な祖先のACLから、そのパスについて用意されている場合に明示的なACLとともに構成される。このACLと前の場合のACLとの違いは、このACLは、明示的なアイテムACLがアイテムに対する保持関係とは無関係でありながら対応する保持関係が存在している限りにおいて動作する点である。
SetItemSecurityおよびSetPathSecurityでアイテム上に設定できるACLは、継承可能な、オブジェクト特有のACEに制約される。これらは、継承としてマークされているACEを含むことはできない。
GetEffectiveItemSecurityは、様々なパスベースのACLだけでなく、アイテム上の明示的なACLをも取り出す。これは、与えられたアイテムに影響を及ぼす許可ポリシーを反映する。
7.関係のサポート
上述のように、ストレージプラットフォームのデータモデルは、アイテムを互いに関係付けられる「関係」を定義する。スキーマのデータクラスが生成されるときに、関係の型毎に以下のクラスが生成される。
1.関係自体を表すクラス。このクラスは、Relationshipクラスから派生され、その関係型に特有のメンバを含む。
2.強く型付けされた「仮想」コレクションクラス。このクラスは、VirtualRelationshipCollectionから派生され、これにより、関係インスタンスの作成および削除を実行することができる。
この節では、ストレージプラットフォームAPI内の関係のサポートについて説明する。
a)基本関係型
ストレージプラットフォームAPIは、関係APIの基礎を形成するSystem.Storage名前空間内に多数の型を提供する。これらは以下の通りである。
1.Relationship−すべての関係クラスの基本型
2.VirtualRelationshipCollection−すべての関係コレクションの基本型
3.ItemReference、ItemIdReference、ItemPathReference−アイテム参照型を表し、それらの型の間の関係は図11に例示されている。
(1)関係クラス
以下は、関係クラスの基本クラスである。
public abstract class Relationship : StoreObject
{
//既定値で作成する。
protected Relationship (ItemIDReference targetItemReference);
//関係コレクションに追加されたことを関係に通知する。オブジェクトは、コレクションに問い合わせを行い、ソースアイテム、アイテムコンテクストなどを決定する。
internal AddedToCollection (VirtualRelationshipCollection collection);
//関係のid。
public RelationshipId RelationshipId {get;}
//ソースアイテムのid。
public ItemId SourceItemId {get;}
//ソースアイテムを取得する。
public Item SourceItem {get;}
//ターゲットアイテムへの参照。
public ItemIdReference TargetItemReference {get;}
//ターゲットアイテムを取得する(TargetItemReference.GetItem()を呼び出す)。
public Item TargetItem {get;}
//ItemContextがすでにターゲットアイテムのドメインとの接続を持っているか判定する(TargetItemReference.IsDomainConnectedを呼び出す)。
public bool IsTargetDomainConnected {get;}
//名前空間内のターゲットアイテムの名前。名前は、すべてのソースアイテムの保持関係にわたって一意的でなければならない。
public OptionalValue<string> Name {get; set;}
//これは保持関係または参照関係かを決定する。
public OptionalValue<bool> IsOwned {get; set;}
(2)ItemReferenceクラス
以下は、アイテム参照型の基本クラスである。
public abstract class ItemReference : NestedElement
{
//既定値で作成する。
protected ItemReference();
//参照されているアイテムを返す。
public virtual Item GetItem ();
//参照されたアイテムのドメインへの接続が確立されたかどうかを判定する。
public virtual bool IsDomainConnected ();
}
ItemReferenceオブジェクトは、アイテム参照自体が置かれているストアと異なるストア内に存在するアイテムを識別することができる。それぞれの派生型は、リモートストアへの参照の構築および使用方法を指定する。派生クラスにおけるGetItemおよびIsDomainConnectedの実装では、ItemContextの複数ドメインサポートを使用して、必要なドメインからアイテムをロードし、ドメインとの接続がすでに確立されているかどうかを判定する。
(3)ItemIdReferenceクラス
以下は、ItemIdRefrenceクラス−ターゲットアイテムを識別するためにアイテムidを使用するItem参照−である。
public class ItemIdReference : ItemReference
{
//既定値で新しいItemIdReferenceを構築する。
public ItemIdReference ();
//指定されたアイテムへの新しいItemIdReferenceを構築する。Itemに関連付けられているドメインは、ロケータとして使用される。
public ItemIdReference (Item item);
//NULLロケータと与えられたターゲットアイテムidを使用して新しいItemIdReferenceを構築する。
public ItemIdReference (Itemld itemId);
//与えられたロケータとアイテムid値を使用して新しいItemIdReferenceを構築する。
public ItemIdReference (string locator, ItemId itemId);
//ターゲットアイテムのid。
public ItemId ItemId {get; set;}
//ドメイン内にターゲットアイテムを含むそのWinFSアイテムを識別するパス。NULLの場合、そのアイテムを含むドメインは知られていない。
public OptionalValue<string> Locator {get; set;}
//参照されたアイテムのドメインへの接続が確立されたかどうかを判定する。
public override bool IsDomainConnected();
//参照されているアイテムを取り出す。
public override Item Getitem ();
}
GetItemおよびIsDomainConnectedでは、ItemContextの複数ドメインサポートを使用して、必要なドメインからアイテムをロードし、ドメインとの接続がすでに確立されているかどうかを判定する。この機能は、まだ実装されていない。
(4)ItemPathReferenceクラス
ItemPathReferenceクラスは、パスを使用してターゲットアイテムを識別するアイテム参照である。このクラスに対するコードは以下の通りである。
public class ItemPathReference : ItemReference
{
//既定値でアイテムパス参照を構築する。
public ItemPathReference ();
//ロケータなしで、与えられたパスを付けて、アイテムパス参照を構築する。
public ItemPathReference (string path);
//与えられたロケータおよびパスを付けて、アイテムパス参照を構築する。
public ItemPathReference (string locator, string path);
//ドメイン内にターゲットアイテムを含むそのWinFSアイテムを識別するパス。
public OptionalValue<string> Locator {get; set;}
//ロケータにより指定されたアイテムドメインに関するターゲットアイテムのパス。
public string Path {get; set;}
//参照されたアイテムのドメインへの接続が確立されたかどうかを判定する。
public override bool IsDomainConnected();
//参照されているアイテムを取り出す。
public override Item GetItem();
}
GetItemおよびIsDomainConnectedでは、ItemContextの複数ドメインサポートを使用して、必要なドメインからアイテムをロードし、ドメインとの接続がすでに確立されているかどうかを判定する。
(5)RelationshipId構造体
RelationshipId構造体は、関係id GUIDをカプセル化する。
public class RelationshipId
{
//新しい関係id GUIDを生成する。
public static RelationshipId NewRelationshipId ();
//新しい関係id GUIDで初期化する。
public RelationshipId();
//指定されたGUIDで初期化する。
public RelationshipId (Guid id);
//GUIDの文字列表現で初期化する。
public RelationshipId (string id);
//関係id GUIDの文字列表現を返す。
public override string ToString ();
//System.GuidインスタンスをRelationshipIdインスタンスに変換する。
public static implicit operator RelationshipId (Guid guid);
//RelationshipIdインスタンスをSystem.Guidインスタンスに変換する。
public static implicit operator Guid (RelationshipId relationshipId);
}
この値型は、パラメータおよびプロパティが関係idとして強く型付けできるようにguidをラップする。関係idがNULL可能な場合には、OptionalValue<RelationshipId>を使用しなければならない。System.Guid.Emptyにより与えられるような空値は公開されない。RelationshipIdは、空の値では構築できない。既定のコンストラクタを使用してRelationshipIdを作成する場合、新しいGUIDが作成される。
(6)VirtualRelationshipCollectionクラス
VirtualRelationshipCollectionクラスは、データストアからのオブジェクト、それに加えて、コレクションに追加された新しいオブジェクトを含むが、ただし、ストアから削除されたオブジェクトを含まない、関係オブジェクトのコレクションを実装する。与えられたソースアイテムidを持つ指定された関係型のオブジェクトは、コレクションに含まれる。
これは、それぞれの関係型について生成される関係コレクションクラスの基本クラスである。そのクラスは、与えられたアイテムの関係にアクセスし、その関係を操作しやすくするため、ソースアイテム型においてプロパティの型として使用することができる。
VirtualRelationshipCollectionの内容を列挙するには、潜在的に多数の関係オブジェクトをストアからロードする必要がある。アプリケーションでは、コレクションの内容を列挙する前に関係をいくつロードできるかを決定するためにCountプロパティを使用すべきである。コレクションへのオブジェクトの追加およびコレクションからのオブジェクトの削除では、関係をストアからロードする必要がない。
効率を高めるため、VirtualRelationshipCollectionオブジェクトを使用してアイテムの関係すべてを列挙する代わりに特定の基準条件を満たす関係をアプリケーション側で検索することが好ましい。関係オブジェクトをコレクションに追加すると、ItemContext.Updateが呼び出されたときに表現されている関係がストア内に作成される。関係オブジェクトをコレクションから削除すると、ItemContext.Updateが呼び出されたときに表現されている関係がストア内で削除される。仮想コレクションは、そのアイテム上のItem.Relationshipsコレクションまたは他の関係コレクションを通じて関係オブジェクトが追加/削除されるかどうかに関係なくオブジェクトの正しい集合を含む。
以下のコードは、VirtualRelationshipCollectionクラスを定義する。
public abstract class VirtualRelationshipCollection : ICollection
{
//コレクションは、itemIdにより識別されたアイテムにより所有される指定された型の関係を含む。
protected VirtualRelationshipCollection (ItemContext itemContext, ItemId itemId, Type relationshipType);
//列挙子は、状態Insertedを持つオブジェクトに加えて状態Deletedを持つオブジェクトを除くストアからに取り出されたすべてのオブジェクトを返す。
public IEnumerator GetEnumerator ();
//列挙子により返されるであろう関係オブジェクトの数のカウントを返す。このカウントは、ストアからすべてのオブジェクトを取り出さなくても計算される。
public int Count {get;}
//常にfalseを返す。
public bool ICollection.lsSynchronized () {get;}
//常にこのオブジェクトを返す。
public object ICollection.SyncRoot {get;}
//ストア内で必要なオブジェクトを検索する。
public void Refresh ();
//指定された関係をコレクションに追加する。オブジェクトは、状態ConstructedまたはRemovedを持たなければならない。状態がConstructedであれば、状態はAddedに変更される。状態がRemovedであれば、状態は適宜RetrievedまたはModifiedに変更される。この関係のソースアイテムidは、コレクションが構築されたときに与えられたソースアイテムidと同じでなければならない。
protected void Add (Relationship relationship);
//指定された関係をコレクションから削除する。オブジェクトの状態は、Added、Retrieved、またはModifiedでなければならない。オブジェクトの状態がAddedの場合、これは、Constructedに設定される。オブジェクトの状態がRetrievedまたはModifiedの場合、これはRemovedに設定される。この関係のソースアイテムidは、コレクションが構築されたときに与えられたソースアイテムidと同じでなければならない。
protected void Remove (Relationship relationship);
//コレクションから削除されたオブジェクト。
public ICollection RemovedRelationships {get;}
//コレクションに追加されたオブジェクト。
public ICollection AddedRelationships {get;}
//ストアから取り出されたオブジェクト。このコレクションは、VirtualRelationshipCollectionが列挙されるか、Refreshが呼び出されるまで空である(このプロパティの値を取得してもコレクションは書き込まれない)。
public ICollection StoredRelationships {get;}
//非同期メソッド。
public IAsyncResult BeginGetCount(IAsyncCallback callback, object state);
public int EndGetCount(IAsyncResult asyncResult);
public IAsyncResult BeginRefresh(IAsyncCallback callback, object state);
public void EndRefresh(IAsyncResult asyncResult);
}
b)生成された関係型
ストレージプラットフォームスキーマのクラスを生成する場合、関係宣言毎に1つのクラスが生成される。関係自体を表すクラスに加えて、関係コレクションクラスも、それぞれの関係について生成される。これらのクラスは、関係のソースまたはターゲットアイテムクラス内のプロパティの型として使用される。
この節では、多数の「プロトタイプ」クラスを使用して生成されるクラスを説明する。つまり、指定された関係宣言が与えられた場合に、生成されるクラスについて説明する。プロトタイプクラスで使用されるクラス、型、および終点名は、その関係についてスキーマで指定された名前のプレースホルダであり、文字通りに解釈すべきではないことに注意されたい。
(1)生成された関係型
この節では、それぞれの関係型について生成されるクラスを説明する。例えば、次のようである。
Figure 0004394644
この関係定義が与えられると、RelationshipPrototypeおよびRelationshipPrototypeCollectionクラスが生成される。RelationshipPrototypeクラスは、関係自体を表す。RelationshipPrototypeCollectionクラスでは、ソース終点として指定されたアイテムを持つRelationshipPrototypeインスタンスにアクセスできる。
(2)RelationshipPrototypeクラス
これは、「HoldingRelationshipPrototype」という名前の保持関係に対するプロトタイプ関係クラスであり、ソース終点は「Head」という名前を持ち、「Foo」アイテム型を指定し、ターゲット終点は「Tail」という名前を持ち、「Bar」アイテム型を指定する。これは以下のように定義される。
Figure 0004394644
(3)RelationshipPrototypeCollectionクラス
これは、指定されたアイテムにより所有されるRelationshipPrototype関係インスタンスのコレクションを保持する、RelationshipPrototypeクラスで生成された、プロトタイプクラスである。これは以下のように定義される。
Figure 0004394644
c)Itemクラス内の関係サポート
Itemクラスは、そのアイテムが関係のソースである関係にアクセスできるようにするRelationshipsプロパティを含む。Relationshipsプロパティは、型RelationshipCollectionを持つ。
(1)Itemクラス
以下のコードは、Itemクラスの関係コンテクストプロパティを示している。
Figure 0004394644
(2)RelationshipCollectionクラス
このクラスを使用すると、与えられたアイテムが関係のソースである関係インスタンスにアクセスできる。これは以下のように定義される。
Figure 0004394644
d)検索式の中の関係サポート
検索式の中で、関係と関係づけられているアイテムとの間の結合のトラバースを指定することが可能である。
(1)アイテムから関係へのトラバース
検索式の現在のコンテクストがアイテムの集合である場合、アイテムがソースであるアイテムと関係インスタンスとの間の結合は、Item.Relationshipsプロパティを使用して実行できる。特定の型の関係への結合は、検索式Cast演算子を使用して指定することができる。
強く型付けされた関係コレクション(例えば、Folder.MemberRelationships)も、検索式の中で使用することができる。関係型への型変換は暗黙のうちに行われる。
関係の集合が確立された後、その関係のプロパティは、述語の中で使用するか、または射影のターゲットとして使用することができる。射影のターゲットを指定するために使用される場合、関係の集合が返される。例えば、以下のステートメントでは、関係のStartDateプロパティが「1/1/2000」以上の値を持っていた組織に関係するすべての人物を見つける。
Figure 0004394644
Person型が型EmployeeSideEmployerEmployeeRelationships(EmployeeEmployer関係型について生成されるような)のプロパティEmployerContextを持っていた場合、これは以下のように書けるであろう。
Figure 0004394644
(2)関係からアイテムへのトラバース
検索式の現在のコンテクストが関係の集合である場合、関係から関係のいずれかの終点への結合は、終点の名前を指定することによりトラバースすることができる。関係アイテムの集合が確立された後、それらのアイテムのプロパティは、述語の中で使用するか、または射影のターゲットとして使用することができる。射影のターゲットを指定するために使用される場合、アイテムの集合が返される。例えば、以下のステートメントは、従業員のラストネームが「Smith」であるすべてのEmployeeOfOrganization関係(組織に関係なく)を見つける。
Figure 0004394644
検索式Cast演算子を使用して、終点アイテムの型をフィルタ処理することができる。例えば、メンバが姓「Smith」を持つPersonアイテムであるすべてのMemberOfFolder関係インスタンスを見つけるために以下のようにする。
Figure 0004394644
(3)関係トラバースの組合せ
アイテムから関係へ、関係からアイテムへトラバースする前の2つのパターンを組み合わせて、いくらでも複雑なトラバースを得ることができる。例えば、姓が「Smith」である従業員が含まれるすべての組織を見つけるには、以下のようにする。
Figure 0004394644
以下の実施例では、「New York」エリア内に居住する世帯の一員を表すすべてのPersonアイテムを見つける(TODO:これは、サポートされなくなっている...代替え)。
Figure 0004394644
e)関係サポートの使用例
以下は、関係を操作するためのストレージプラットフォームAPI内の関係サポートの使用例を示す。以下の実施例では、以下の宣言を仮定する。
Figure 0004394644
(1)関係の検索
ソースまたはターゲット関係を検索することが可能である。フィルタを使用することにより、指定された型を持ちプロパティ値を与えた関係を選択することができる。また、フィルタを使用することにより、関係ベースの関係するアイテム型またはプロパティ値を選択することができる。例えば、以下の検索を実行できる。
与えられたアイテムがソースであるすべての関係
Figure 0004394644
与えられたアイテムが「A%」とマッチする名前を持つソースであるすべての関係
Figure 0004394644
与えられたアイテムがソースであるすべてのFolderMember関係
Figure 0004394644
与えられたアイテムがソースであり、名前が「A%」のような名前であるすべてのFolderMember関係
Figure 0004394644
ターゲットアイテムがPersonであるすべてのFolderMember関係
Figure 0004394644
ターゲットアイテムが姓「Smith」を持つPersonであるすべてのFolderMember関係
Figure 0004394644
上に示されているGetSearcher APIに加えて、それぞれの関係クラスでは、静的なFindAll、FindOne、およびFindOnly APIをサポートする。さらに、関係型は、ItemContext.GetSearcher、ItemContext.FindAll、ItemContext.FindOne、またはItemContext.FindOnlyを呼び出すときに指定できる。
(2)関係からソースおよびターゲットアイテムへのナビゲート
検索を通じて関係オブジェクトが取り出された後、ターゲットまたはソースアイテムに「ナビゲート」することが可能である。基本関係クラスは、Itemオブジェクトを返すSourceItemおよびTargetItemプロパティを備える。生成された関係クラスは、等価な強く型付けられた、名前付きプロパティ(例えば、FolderMember.FolderItemおよびFolderMember.MemberItem)を備える。例えば、次のようである。
名前「Foo」を持つ関係に対するソースおよびターゲットアイテムにナビゲートする
Figure 0004394644
ターゲットアイテムにナビゲートする
Figure 0004394644
関係が見つかったドメイン内にターゲットアイテムがない場合でもターゲットアイテムへのナビゲートは機能する。このような場合、ストレージプラットフォームAPIは、必要に応じてターゲットドメインへの接続を開く。アプリケーションは、ターゲットアイテムを取り出す前に接続が必要かどうかを判定することができる。
未接続ドメイン内のターゲットアイテムをチェックする
Figure 0004394644
(3)ソースアイテムから関係へのナビゲート
アイテムオブジェクトが与えられると、明示的検索を実行せずに、そのアイテムがソースである関係にナビゲートすることが可能である。これは、Folder.MemberRelationshipsなどのItem.Relationshipsコレクションプロパティまたは強く型付けされたコレクションプロパティを使用して実行される。関係から、ターゲットアイテムにナビゲートすることが可能である。このようなナビゲーションは、ターゲットアイテムがターゲットアイテムと同じストア内にない場合を含む、ターゲットアイテムがソースアイテムのItemContextに関連付けられたアイテムドメイン内にない場合でも、機能する。例えば、次のようである。
ソースアイテムからターゲットアイテムへの関係にナビゲートする
Figure 0004394644
FolderアイテムからターゲットアイテムへのFoldermember関係にナビゲートする
Figure 0004394644
アイテムは、多数の関係を持つことができ、したがって、アプリケーションでは、関係コレクションを列挙する場合に注意する必要がある。一般に、検索は、コレクション全体を列挙するのではなく、注目する特定の関係を識別するために使用すべきである。さらに、関係に対するコレクションベースのプログラミングモデルを持つことは、十分価値あることであり、多数の関係が十分に希なアイテムがあり、開発者による誤用のリスクは正当化される。アプリケーションは、コレクション内の関係の個数をチェックし、必要ならば異なるプログラミングモデルを使用することができる。例えば、次のようである。
関係コレクションのサイズをチェックする
Figure 0004394644
アプリケーションがコレクションを列挙しようとしない限り、それぞれの関係を表すオブジェクトが実際には初期値として埋め込まれないという意味で上述の関係コレクションは、「仮想的」である。コレクションが列挙される場合、結果はストア内にあるものに加えて、アプリケーションによって追加されたが、まだ保存されていないものを反映するが、アプリケーションによって削除されたが保存されていない関係については反映しない。
(4)関係(およびアイテム)の作成
新しい関係は、関係オブジェクトを作成し、それをソースアイテム内の関係に追加し、ItemContextを更新することにより作成される。新しいアイテムを作成するには、保持または埋め込み関係を作成しなければならない。例えば、次のようである。
新しいアイテムを既存のフォルダに追加する
Figure 0004394644
既存のアイテムを既存のフォルダに追加する
Figure 0004394644
既存のアイテムを新しいフォルダに追加する
Figure 0004394644
新しいアイテムを新しいフォルダに追加する
Figure 0004394644
(5)関係(およびアイテム)の削除
保持関係を削除する
Figure 0004394644
8.ストレージプラットフォームAPIの「拡張」
上述のように、すべてのストレージプラットフォームスキーマの結果、クラスの集合が得られる。これらのクラスは、Find*などの標準的なメソッドを備え、さらに、フィールド値を取得および設定するプロパティも用意する。これらのクラスおよび関連付けられたメソッドは、ストレージプラットフォームAPIの基礎を形成する。
a)ドメインビヘイビア
これらの標準的メソッドに加えて、すべてのスキーマは、それに対するドメイン特有のメソッドの集合を持つ。これらをドメインビヘイビアと呼ぶ。例えば、Contactsスキーマ内のドメインビヘイビアの一例として以下のようなものがある。
・ 電子メールアドレスは有効か?
・ フォルダが与えられた場合、そのフォルダのすべてのメンバのコレクションを取得する。
・ アイテムIDが与えられた場合、このアイテムを表すオブジェクトを取得する。
・ Personが与えられた場合、そのオンラインステータスを取得する。
・ 新しい連絡先または一時的連絡先を作成するヘルパ機能。
・ その他。
「標準的」ビヘイビア(Find*など)とドメインビヘイビアとを区別しているが、これらはプログラマには単にメソッドとして現れることに注意することが重要である。これらのメソッドの間の区別は、ドメインビヘイビアはハードコーディングされるが、標準的ビヘイビアは、ストレージプラットフォームAPI設計時ツールによりスキーマファイルから自動的に生成されるという事実にある。
その性質上、それらのドメインビヘイビアは手作りでなければならない。このため、C#の初期バージョンでは、クラスの実装全体を1つのファイル内に収める必要があるという実用上の問題が生じる。したがって、このことにより、ドメインビヘイビアを追加するために、自動生成されたクラスファイルは強制的に、編集されなければならない。自ずから、これは問題になりうる。
部分クラスと呼ばれる機能は、そのような問題のために、C#に導入された。基本的に、部分クラスを使用することにより、クラス実装は複数のファイルにまたがることができる。部分クラスは、キーワードpartialが宣言の前に付くことを除き、正規のクラスと同じである。
Figure 0004394644
そこで、Personに対するドメインビヘイビアは、このように異なるファイルに入れることができる。
Figure 0004394644
b)付加価値ビヘイビア
ドメインビヘイビアを持つデータクラスは、アプリケーション開発者が足場とする基礎を形成する。しかし、データクラスがそのデータに関係する考えられるすべてのビヘイビアを公開することは可能でも、望ましいことでもない。ストレージプラットフォームでは、開発者はストレージプラットフォームAPIにより提供される基本機能を足場とすることができる。ここで基本パターンは、メソッドがストレージプラットフォームデータクラスのうちの1つまたは複数をパラメータとしてとるクラスを作成することである。例えば、Microsoft Outlook使用するか、またはMicrosoft Windows(登録商標)メッセンジャを使用して電子メールを送信するための付加価値クラスは以下の通りとすることができる。
Figure 0004394644
これらの付加価値クラスは、ストレージプラットフォームに登録することができる。登録データは、ストレージプラットフォームがすべてのインストールされているストレージプラットフォーム型について維持するスキーマメタデータに関連付けられる。このメタデータは、ストレージプラットフォームアイテムとして格納され、これに対しクエリを実行できる。
付加価値クラスの登録は、強力な機能であり、例えば、これにより、Shell explorer内のPersonオブジェクトを右クリックすると、許容されるアクションの集合を、Personについて登録されている付加価値クラスから派生させることが可能になる、というシナリオが得られる。
c)サービスプロバイダとしての付加価値ビヘイビア
本発明の実施形態では、ストレージプラットフォームAPIは、与えられた型について付加価値クラスを「サービス」として登録できるメカニズムを備える。これにより、アプリケーションは、与えられた型のサービスプロバイダ(=付加価値クラス)を設定、取得することができる。このメカニズムの使用を望む付加価値クラスは、よく知られているインターフェースを実装すべきであり、例えば、以下の通りである。
Figure 0004394644
すべてのストレージプラットフォームAPIデータクラスは、ICachedServiceProviderインターフェースを実装する。このインターフェースは、以下のようにSystem.IServiceProviderインターフェースを拡張する。
Figure 0004394644
このインターフェースを使用することで、アプリケーションは、サービスプロバイダインスタンスを設定する他に、特定の型のサービスプロバイダを要求することができる。
このインターフェースをサポートするために、ストレージプラットフォームデータクラスは、型をキーとするサービスプロバイダのハッシュテーブルを保持する。サービスプロバイダが要求されると、この実装は、最初に、ハッシュテーブル内を見て、指定された型のサービスプロバイダが設定されているかどうかを調べる。設定されていなければ、登録されているサービスプロバイダインフラストラクチャを使用して、指定された型のサービスプロバイダを識別する。その後、このプロバイダのインスタンスが作成され、ハッシュテーブルに追加され、返される。また、データクラス上の共有メソッドがサービスプロバイダを要求し、オペレーションをそのプロバイダに転送することも可能であることに注意されたい。例えば、これは、ユーザにより指定された電子メールシステムを使用するメールメッセージクラス上のSendメソッドを提供するために使用することも可能である。
9.デザインタイムフレームワーク
この節では、本発明の実施形態により、ストレージプラットフォームのSchemaがクライアント上のストレージプラットフォームAPIクラスおよびサーバ上のUDTクラスにどのように変わるかを説明する。図24の図は、関わっているコンポーネントを示している。
図24を参照すると、スキーマ内の型は、XMLファイルに含まれる(ボックス1)。このファイルは、さらに、スキーマに関連付けられたフィールドレベルおよびアイテムレベル制約も含む。ストレージプラットフォームClassジェネレータ(xfs2cs.exe−ボックス2)は、このファイルを取り、ストアUDTに対する部分クラス(ボックス5)およびクライアントクラスに対する部分クラス(ボックス3)を生成する。スキーマドメイン毎に、追加メソッドが存在し、これをドメインビヘイビアと呼ぶ。ストア(ボックス7)、クライアント(ボックス6)、および両方の場所(ボックス4)で意味のあるドメインビヘイビアがある。ボックス4、6、および7内のコードは、手書き(自動生成でない)である。ボックス3、4、および6内の部分クラスはあわせて、ストレージプラットフォームAPIドメインクラスの完全なクラス実装を形成する。ボックス3、4、および6は、コンパイルされ(ボックス8)、ストレージプラットフォームAPIクラス−ボックス11を形成する(実際には、ストレージプラットフォームAPIは、すべての初期スキーマドメインから得られるボックス3、4、および6をコンパイルした結果である)。ドメインクラスに加えて、さらに、付加価値ビヘイビアを実装する追加クラスも存在する。これらのクラスは、1つまたは複数のスキーマドメイン内で1つまたは複数のクラスを使用する。これは、ボックス10により表される。ボックス4、5、および7内の部分クラスはあわせて、サーバUDTクラスの完全なクラス実装を形成する。ボックス4、5、および7は、コンパイルされ(ボックス9)、サーバサイドUDT アセンブリ−ボックス12を形成する(実際には、サーバサイドUDTアセンブリは、すべての初期スキーマドメインから得られるボックス4、5、および7をコンパイラプラス(compiler−plus−ing)した結果である)。DDLコマンドジェネレータモジュール(ボックス13)は、UDTアセンブリ(ボックス12)、およびSchemaファイル(ボックス1)を取り、データストア上に格納する。このプロセスは、とりわけ、それぞれのスキーマ内の型に対するテーブルおよびビューの生成を伴う。
10.クエリ形式主義(Formalism)
基本に帰着させた場合、アプリケーションのパターンは、ストレージプラットフォームAPIを使用した場合、ItemContextを開く、フィルタ条件付きでFindを使用し、所望のオブジェクトを取り出す、オブジェクトに演算を実行する、および変更をストアに送り返す、というものである。この節は、フィルタ文字列に入るものの構文に関する。
ストレージプラットフォームデータオブジェクトを見つけるときに提供されるフィルタ文字列は、オブジェクトのプロパティが、返されるために満たさなければならない条件を記述する。ストレージプラットフォームAPIで使用される構文は、型変換および関係トラバースをサポートする。
a)フィルタの基本事項
フィルタ文字列は、空であり、指定された型のすべてのオブジェクトが返されることを示すか、またはそれぞれの返されるオブジェクトが満たさなければならない論理式である。この式は、オブジェクトプロパティを参照する。ストレージプラットフォームAPIランタイムは、どのようにこれらのプロパティ名がストレージプラットフォームの型フィールド名にマッピングされ、最終的に、ストレージプラットフォームストアにより保持されるSQLビューにマッピングされるかについて関知している。
以下の実施例を考察する。
Figure 0004394644
ネストされたオブジェクトのプロパティもフィルタ内で使用できる。例えば、次のようである。
Figure 0004394644
コレクションについては、角括弧内の条件を使用してメンバのフィルタ処理を行うことが可能である。例えば、次のようである。
Figure 0004394644
以下の実施例は、12/31/1999以降に生まれたすべての人々のリストを作成する。
Figure 0004394644
1行目で、ローカルコンピュータのストレージプラットフォーム共有上の「Work Contacts」にアクセスする新しいItemContextオブジェクトを作成する。3行目と4行目で、式「Birthdate>‘12/31/1999’」により指定されているように、Birthdateプロパティが12/31/1999よりも最近の日付を指定するPersonオブジェクトのコレクションを取得する。このFindAllオペレーションの実行は、図23に示されている。
b)型変換(Type Casts)
プロパティに格納されている値の型がプロパティ宣言型から派生されることはよくあることである。例えば、Person内のPersonalEAddressesプロパティは、EMailAddressおよびTelephoneNumberなどのEAddressから派生された型のコレクションを含む。電話市外局番に基づいてフィルタ処理するには、EAddress型からTelephoneNumber型に型変換する必要がある。
Figure 0004394644
c)フィルタ構文
以下では、一実施形態による、ストレージプラットフォームAPIによりサポートされているフィルタ構文を説明する。
Figure 0004394644
11.リモーティング
a)APIにおけるローカル/リモート透過性
ストレージプラットフォームのデータアクセスは、ローカルストレージプラットフォームインスタンスをターゲットとしている。ローカルインスタンスは、クエリ(またはその一部)がリモートデータを参照している場合にルータとして使用される。そのため、APIレイヤは、ローカル/リモート透過性を備え、ローカルデータアクセスとリモートデータアクセスとの間でAPIの構造的な違いはない。これは、純粋に、要求されたスコープの機能である。
ストレージプラットフォームのデータストアは、さらに、分散クエリを実装するので、ローカルストレージプラットフォームのインスタンスに接続し、一方がローカルストア上にあり、他方がリモートストア上にある異なるボリュームからのアイテムを含むクエリを実行することが可能である。ストアは、結果を合併し、それはアプリケーションに提示する。ストレージプラットフォームAPI(したがって、アプリケーション開発者)の観点からは、任意のリモートアクセスは完全に継ぎ目なく、透過的である。
ストレージプラットフォームAPIを使用することにより、アプリケーション側で、与えられたItemContextオブジェクト(ItemContext.Openメソッドにより返されるような)がIsRemoteプロパティ−これは、ItemContextオブジェクト上のプロパティである−を使用してローカルまたはリモート接続を表すかどうかを決定することができる。とりわけ、アプリケーションは、パフォーマンス、信頼性などに対するユーザの期待を設定しやすくするために視覚的フィードバックを与えたい場合がある。
b)リモーティングのストレージプラットフォーム実装
ストレージプラットフォームのデータストアは、HTTP上で実行される特別なOLEDBプロバイダを使用して互いに対話する(既定のOLEDBプロバイダはTDSを使用する)。一実施形態では、分散クエリは、リレーショナルデータベースエンジンの既定のOPENROWSET機能を適用される。特別なユーザ定義関数(UDF)、DoRemoteQuery(server,queryText)が用意され、実際のリモーティングを実行する。
c)非ストレージプラットフォームストアへのアクセス
本発明のストレージプラットフォームの一実施形態では、ストアがストレージプラットフォームのデータアクセスに加わることを許す汎用プロバイダアーキテクチャはない。しかし、Microsoft ExchangeおよびMicrosoft Active Directory(AD)の特定の場合に対する制限されたプロバイダアーキテクチャが提供される。これは、開発者が、ちょうどストレージプラットフォーム内にはあるように、ストレージプラットフォームAPIを使用し、ADおよびExchange内のデータにアクセスできることを意味するが、アクセスできるデータは、ストレージプラットフォームのスキーマ化された型に制限されることを意味する。したがって、アドレス帳(=ストレージプラットフォームのPerson型のコレクション)は、ADでサポートされ、メール、カレンダー、および連絡先は、Exchange用にサポートされる。
d)DFSとの関係
ストレージプラットフォームのプロパティプロモータ(property promoter)は、過去のマウントポイントを格上げしない。名前空間がマウントポイントを通じてアクセスするのに十分リッチであるとしても、クエリはそれらを通過しない。ストレージプラットフォームボリュームは、DFSツリー内の葉ノードとして現れることができる。
e)GXA/Indigoとの関係
開発者は、ストレージプラットフォームAPIを使用して、データストアの上に「GXA head」を公開することができる。概念的には、これは、他のWebサービスを作成するのと異ならない。ストレージプラットフォームAPIは、GXAを使用してストレージプラットフォームデータストアと対話しない。上述のように、APIは、TDSを使用してローカルストアと対話し、どのリモーティングも、同期サービスを使用してローカルストアにより処理される。
12.制約条件
ストレージプラットフォームデータモデルでは、型に対する値制約条件を持つことができる。それらの制約条件は、ストア上で自動的に評価され、このプロセスは、ユーザにとって透過的である。制約条件は、サーバ側でチェックされることに注意されたい。このことに注意すると、ときには、サーバへの往復やり取りのオーバーヘッドを被ることなく、入力データが制約条件を満たすことを確認できる融通性を開発者に対し与えることが望ましい。これは、本質的に、エンドユーザがオブジェクトに埋めるために使用されるデータを入力する対話的アプリケーションで有用である。ストレージプラットフォームAPIはこの機能を実現している。
スキーマを表す適切なデータベースオブジェクトを生成するためにストレージプラットフォームにより使用される、ストレージプラットフォームSchemaは、XMLファイルで指定されることに注意されたい。これは、クラスを自動生成するためにストレージプラットフォームAPIの設計時フレームワークによっても使用される。
Contactsスキーマを生成するために使用されるXMLファイルの部分リスティングを以下に示す。
Figure 0004394644
上記のXML内のCheckタグは、Person型に対する制約を指定する。複数のチェックタグがありうる。上記の制約条件は、一般にストア内でチェックされる。制約条件がさらにアプリケーションにより明示的にチェックできることを指定するために、上記XMLは以下のように修正される。
Figure 0004394644
trueに設定される<Check>要素上の新しい「InApplication」属性に注意されたい。これにより、ストレージプラットフォームAPIは、Validate()と呼ばれるPersonクラス上のインスタンスメソッドを通じてAPIにおける制約を明らかにする。アプリケーションは、オブジェクト上でこのメソッドを呼び出して、データが有効であることを確認し、サーバとの間の潜在的に無用なやり取りをなくすことができる。これは、バリデーションの結果を示すブール値を返す。値制約条件は、クライアントが<object>.Validate()メソッドを呼び出すかどうかに関係なくそのままサーバに適用されることに注意されたい。以下にValidateの使用例を示す。
Figure 0004394644
ストレージプラットフォームストアへのアクセスパスは複数存在する−ストレージプラットフォームAPI、ADO.NET、ODBC、OLEDB、およびADOである。このため、信頼できる制約条件チェックであるかどうかの疑問が生じる−つまり、例えばODBCから書かれたデータに、ストレージプラットフォームAPIから書かれたデータと同じデータ完全性制約条件が適用されることをどのように保証できるのか。すべての制約条件はストア側でチェックされるため、制約条件は信頼できるものとなる。ストアに達するためにどのようなAPIパスを使用するかに関係なく、ストアへの書き込みはすべて、ストアでの制約条件チェックを通じてフィルタ処理される。
13.共有
ストレージプラットフォームの共有は、
Figure 0004394644
の形式であり、ただし、<DNS Name>はマシンのDNS名、<Context Service>は、そのマシン上の包含フォルダ、仮想フォルダ、またはボリューム内のアイテムである。例えば、マシン「Johns_Desktop」は、Johns_Informationというボリュームを持ち、このボリューム内には、Contacts_Categoriesというフォルダが存在し、このフォルダは、Workというフォルダを含み、これには、Johnの仕事用連絡先
Figure 0004394644
が入っている。これは、「WorkContacts」として共有することができる。この共有の定義では、\\Johns_Desktop\WorkContacts\JaneSmithは、有効なストレージプラットフォーム名であり、PersonアイテムJaneSmithを識別する。
a)共有の表現
共有アイテム型は、共有名、および共有ターゲット(これは、非保持リンクであってよい)のプロパティを持つ。例えば、上述の共有の名前は、WorkContactsであり、ターゲットは、ボリュームJohns_Information上のContacts_Categories\Workである。以下に、Share型のスキーマ断片を示す。
Figure 0004394644
b)共有の管理
共有はアイテムであるため、共有は他のアイテムとまったく同様に管理できる。共有は、作成、削除、および修正が可能である。共有は、さらに、他のストレージプラットフォームアイテムと同じようにしてセキュリティ設定される。
c)共有のアクセス
アプリケーションは、ItemContext.Open()メソッド呼び出しで共有名(例えば、\\Johns_Desktop\WorkContacts)をストレージプラットフォームAPIに渡すことによりリモートストレージプラットフォーム共有にアクセスする。ItemContext.Openは、ItemContextオブジェクトインスタンスを返す。その後、ストレージプラットフォームAPIは、ローカルストレージプラットフォームサービスと対話する(リモートストレージプラットフォーム共有へのアクセスは、ローカルストレージプラットフォームを介して行われることに注意されたい)。次に、ローカルストレージプラットフォームサービスは、与えられた共有名(例えば、WorkContacts)を使用してリモートストレージプラットフォームサービス(例えば、マシンJohns_Desktop上の)と対話する。その後、リモートストレージプラットフォームサービスは、WorkContactsをContacts_Categories\Workに翻訳して、それを開く。その後、クエリおよびその他のオペレーションが他のスコープとまったく同様に実行される。
d)発見可能性
一実施形態では、アプリケーションプログラムは、以下のようにして、与えられた<DNS Name>上で使用可能な共有を発見することができる。第1の方法により、ストレージプラットフォームAPIはDNS名(例えば、Johns_Desktop)をItemContext.Open()メソッドのスコープパラメータとして受け付ける。ストレージプラットフォームAPIは、次に、このDNS名を接続文字列の一部として使用しストレージプラットフォームストアに接続する。この接続では、アプリケーションが唯一できることは、ItemContext.FindAll(typeof(Share))を呼び出すことである。その後、ストレージプラットフォームサービスは、接続されているすべてのボリューム上のすべての共有を合併し、共有のコレクションを返す。第2の方法により、ローカルマシン上で、管理者はFindAll(typeof(Share))により特定のボリューム上の、またはFindAll(typeof(Share),“Target(ShareDestination).Id=folderId”)により特定のフォルダ上の共有を容易に発見することができる。
14.Findの意味
Find*メソッド(ItemContextオブジェクトで呼び出されようと、個々のアイテム上で呼び出されようと関係なく)は、一般に、与えられたコンテクスト内のItem(埋め込まれたアイテムを含む)に適用される。ネストされた要素は、Findを持たない−包含Itemと無関係に検索することはできない。これは、ネストされた要素が包含アイテムからその「アイデンティティ」を派生させる、ストレージプラットフォームデータモデルで望ましい意味と一致する。この概念をより明確にするために、以下に、有効なfindオペレーションと無効なfindオペレーションの実施例を示す。
a)市外局番206を持つシステム内のすべての電話番号を表示する?
無効、findはアイテムを参照せずに電話番号−要素−に対し実行されるため。
b)市外局番206を持つすべてのPersons内のすべての電話番号を表示する?
無効、Person(=アイテム)が参照されるとしても、検索条件はそのアイテムを含まない。
c)市外局番206を持つすべてのMurali(=1人)のすべての電話番号を表示する?
有効、Itemに対し検索条件があるため(「Murali」という名前のPerson)。
この規則の例外は、Base.Relationship型から直接的または間接的に派生されるネストされた要素型についてのものである。これらの型は、関係クラスを通じて個別にクエリを実行できる。このようなクエリをサポートできるのは、ストレージプラットフォーム実装では、アイテムUDT内に埋め込む代わりに、「マスタリンクテーブル」を使用してRelationship要素を格納するからである。
15.ストレージプラットフォームContacts API
この節では、ストレージプラットフォームContacts APIの概要を述べる。Contacts APIの背後にあるスキーマは、図21Aおよび21Bに示されている。
a)System.Storage.Contactの概要
ストレージプラットフォームAPIは、Contactsスキーマ内のアイテムおよび要素を取り扱うための名前空間を含む。この名前空間は、System.Storage.Contactと呼ばれる。
このスキーマは、例えば、以下のクラスを持つ。
・ Item:UserDataFolder、User、Person、ADService、Service、Group、Organization、Principal、Location
・ Elements:Profile、PostalAddress、EmailAddress、TelephoneNumber、RealTimeAddress、EAddress、FullName、BasicPresence、GroupMembership、RoleOccupancy
b)ドメインビヘイビア
以下に、Contactsスキーマのドメインビヘイビアのリストを示す。十分に高いレベルから見た場合、ドメインビヘイビアは、以下の適切に認識可能なカテゴリに分類される。
・ 静的ヘルパ、例えば、新しい個人連絡先を作成するためのPerson.CreatePersonalContact()、
・ インスタンスヘルパ、例えば、ユーザ(Userクラスのインスタンス)を自動ログインのマークが付けられているすべてのプロファイルにログインさせるuser.AutoLoginToAllProfiles()、
・ カテゴリGUIDs、例えば、Category.Home、Category.Workなど、
・ 派生プロパティ、例えば、emailAddress.Address()−与えられたemailAddress(=EmailAddressクラスのインスタンス)のユーザ名およびドメインフィールドを組み合わせた文字列を返す、派生コレクション、例えば、person.PersonalEmailAddresses−Personクラスのインスタンスが与えられた場合、その個人電子メールアドレスを取得する。
以下の表は、ドメインビヘイビアを持つContacts内のクラス毎に、それらのメソッドおよびそれらが属すカテゴリのリストをまとめたものである。
Figure 0004394644
16.ストレージプラットフォームFile API
この節では、本発明の一態様による、ストレージプラットフォームFile APIの概要を説明する。
a)序論
(1)ストレージプラットフォーム内でのNTFSボリュームの反映
ストレージプラットフォームは、既存のNTFSボリューム内の内容の上にインデックス作成を行う手段を備える。これは、NTFS内のそれぞれのファイルストリームまたはディレクトリからプロパティを抽出(「格上げ」)し、それらのプロパティをストレージプラットフォーム内にItemとして格納することにより実行される。
ストレージプラットフォームFileスキーマは、格上げされたファイルシステムエンティティを格納するために2つのアイテム型−FileおよびDirectory−を定義する。Directory型は、Folder型の子型であり、他のDirectoryアイテムまたはFileアイテムを含む包含フォルダである。
Directoryアイテムは、DirectoryおよびFileアイテムを含むことができるが、他のどのような型のアイテムも含むことができない。ストレージプラットフォームに関する限り、DirectoryおよびFileアイテムは、データアクセスAPIのどれからも読み取り専用である。File System Promotion Manager(FSPM)サービスは、変更されたプロパティをストレージプラットフォーム内に非同期に格上げする。FileおよびDirectoryアイテムのプロパティは、Win32 APIにより変更できる。ストレージプラットフォームAPIは、Fileアイテムに関連付けられたストリームを含む、それらのアイテムのプロパティを読む込むために使用することができる。
(2)ストレージプラットフォーム名前空間内でのファイルおよびディレクトリの作成
NTFSボリュームがストレージプラットフォームボリュームに格上げされると、その中のすべてのファイルおよびディレクトリは、そのボリュームの特定の一部となる。この領域は、ストレージプラットフォームの観点から読み取り専用であり、FSPMは新しいディレクトリおよびファイルを作成し、および/または既存のアイテムのプロパティを変更することができる。
このボリュームの名前空間の残り部分は、通常範囲のストレージプラットフォームアイテム型−Principal、Organization、Document、Folderなど−を含むことができる。ストレージプラットフォームでは、さらに、ストレージプラットフォーム名前空間の一部に複数のFileおよびDirectoryを作成することができる。これらの「ネイティブ」のFileおよびDirectoryは、NTFSファイルシステム側に対応するものを持たず、ストレージプラットフォーム内に丸ごと格納される。さらに、プロパティへの変更は即座に現れる。
しかし、プログラミングモデルは同じままである、つまり、ストレージプラットフォームデータアクセスAPIに関する限り、読み取り専用であるということである。「ネイティブ」のFileおよびDirectoryは、Win32 APIを使用して更新されなければならない。これにより、開発者のメンタルモデルが簡素化され、以下のようになる。
1.名前空間内のどこでもストレージプラットフォームアイテム型を作成できる(もちろん、パーミッションにより禁止されていない限り)。
2.ストレージプラットフォームアイテム型は、ストレージプラットフォームAPIを使用して読み込むことができる。
3.すべてのストレージプラットフォームアイテム型は、FileおよびDirectoryを除いて、ストレージプラットフォームAPIを使用して書き込むことが可能である。
4.名前空間内のどこにあるかに関係なくFileおよびDirectoryアイテムに書き込みを行うために、Win32 APIを使用する。
5.「格上げされた」名前空間内のFile/Directoryへの変更は、ストレージプラットフォーム内に即座に現れないことがあるが、「格上げされない」名前空間内では、変更は、ストレージプラットフォーム内に即座に反映される。
b)Fileスキーマ
図25は、File APIが基づくスキーマを例示している。
c)System.Storage.Filesの概要
ストレージプラットフォームAPIは、ファイルオブジェクトを取り扱うための名前空間を含む。この名前空間は、System.Storage.Filesと呼ばれる。System.Storage.Filesのクラスのデータメンバは、ストレージプラットフォームストアに格納されている情報を直接反映し、この情報は、ファイルシステムオブジェクトから「格上げ」されるか、またはWin32 APIを使用してネイティブな形で作成することができる。System.Storage.Files名前空間は、FileItemおよびDirectoryItemの2つのクラスを持つ。これらのクラスおよびそのメソッドのメンバは、図25のスキーマ図を見ると容易に推測できる。FileItemおよびDirectoryItemは、ストレージプラットフォームAPIからは読み取り専用である。それらを修正するためには、Win32 APIを使用するか、またはSystem.IOのクラスを使用する必要がある。
d)コード例
この節では、System.Storage.Files内でのクラスの使用を例示する3つのコード例を取りあげる。
(1)ファイルを開き書き込む
この実施例は、「従来」のファイル操作の仕方を示している。
Figure 0004394644
3行目では、FindByPathメソッドを使用してファイルを開く。7行目は、格上げされたプロパティIsReadOnlyを使用して、ファイルが書き込み可能かどうかをチェックすることを示している。書き込み可能であれば、9行目で、FileItemオブジェクト上でOpenWrite()を使用して、ファイルストリームを取得する。
(2)クエリの使用
ストレージプラットフォームストアは、ファイルシステムから格上げされたプロパティを保持するので、ファイルに対しリッチなクエリを容易に実行することが可能である。この実施例では、過去3日以内に修正されたすべてのファイルの一覧が表示される。
Figure 0004394644
以下に、クエリのもう1つの使用例を示す−これは、ある型(=拡張)のすべての書き込み可能なファイルを見つける。
Figure 0004394644
e)ドメインビヘイビア
一実施形態では、ファイルクラスは、標準のプロパティおよびメソッドに加えて、さらに、ドメインビヘイビア(手書きコーディングのプロパティおよびメソッド)を持つ。これらのビヘイビアは、一般に、対応するSystem.IOクラス内のメソッドに基づく。
J.まとめ
これまでに例示したように、本発明は、データの編成、検索、および共有のためのストレージプラットフォームを対象とする。本発明のストレージプラットフォームは、既存のファイルシステムおよびデータベースシステムを超えてデータストレージの概念を拡張し、広げるものであり、リレーショナル(表形式)データ、XML、およびItemと呼ばれる新しいデータ形態などの、構造化、非構造化、または半構造化データを含むすべての型のデータ用のストアとなるように設計されている。本発明のストレージプラットフォームでは、共通のストレージ基盤および図式化されたデータを通じて、より効率的なアプリケーション開発を消費者、知識労働者、および企業向けに行うことができる。これは、データモデルに固有の機能を利用可能にするだけでなく、既存のファイルシステムおよびデータベースアクセス方法も包含し、拡張する機能豊富な拡張可能アプリケーションプログラミングインターフェースを備える。本発明の広範な概念から逸脱することなく、上述の実施形態に対し変更を加えられることは理解される。したがって、本発明は、開示されている特定の実施形態に限定されず、付属の請求項の定義に従って本発明の趣旨および範囲内にあるすべての修正形態を対象とすることを意図されている。
上述の内容から明らかなように、本発明の様々なシステム、方法、および態様の全部または一部は、プログラムコード(つまり、命令)の形で具現化できる。このプログラムコードは、限定はしないが、フロッピー(登録商標)ディスケット、CD−ROM、CD−RW、DVD−ROM、DVD−RAM、磁気テープ、フラッシュメモリ、ハードディスクドライブ、またはその他のマシン可読記憶媒体を含む、磁気、電気、または光記憶媒体などのコンピュータ可読媒体上に格納することができ、プログラムコードがコンピュータまたはサーバなどのマシン内にロードされ実行されると、マシンは本発明を実践するための装置となる。本発明は、さらに、電気配線またはケーブル配線、光ファイバの使用、インターネットまたはイントラネットを含むネットワークなどの何らかの伝送媒体で、または他の形態の伝送を介して、伝送されるプログラムコードの形態で具現化されることも可能であり、プログラムコードがコンピュータなどのマシンにより受信され、読み込まれ、実行されると、マシンは本発明を実施するための装置となる。汎用プロセッサ上に実装された場合、プログラムコードはプロセッサとの組合せで、特定のロジック回路と類似の動作をする独自の装置を実現する。
付録A
Figure 0004394644
ItemContext作成および管理メンバ
//アプリケーションは、ItemContextオブジェクトを直接作成できず、またItemContextからクラスを派生させることもできない。
interal ItemContext();
//指定されたパス、またはパスが指定されていない場合には、ローカルコンピュータ上の既定のストアを検索するために使用できるItemContextを作成する。
public static ItemContext Open();
public static ItemContext Open(string path);
public static ItemContext Open(params string[] paths);
//ItemContextが作成された場合に指定されたパスを返す。
public string[] GetOpenPaths();
//このItemContextのコピーを作成する。コピーは、独立のトランザクション、キャッシュ、および更新状態を持つ。キャッシュは、最初は空になる。クローン作成されたItemContextを使用することは、同じ(複数の)アイテムドメインを使用して新しいItemContextを開くことよりも効率的であると予想される。
public ItemContext Clone();
//ItemContextを閉じる。閉じられた後にItemContextを使用しようとすると、ObjectDisposedExceptionが発生する。
public void Close();
void IDisposable.Dispose();
//ItemContextが開かれたときに指定されたドメインがリモートコンピュータに解決する場合にTrue。
public bool IsRemote {get;}
//要求されたサービス型を供給することができるオブジェクトを返す。要求されたサービスを提供できない場合にはNULLを返す。IServiceProviderパターンを使用すると、通常は使用されない、また使用すれば開発者を混乱させる可能性のあるAPIをItemContextクラスから取り除くことができる。ItemContextは、サービスIItemSerialization、IStoreObjectCacheを提供することができる。
public object GetService(Type serviceType);
関係するメンバを更新する
//修正されたすべてのオブジェクトおよびMarkForCreateまたはMarkForDeleteに渡されるすべてのオブジェクトにより表される変更を保存する。更新競合が検出された場合にはUpdateCollisionExceptionをスローすることがある。
public void Update();
//指定されたオブジェクトにより表される変更を保存する。オブジェクトは、修正されたか、またはMarkForCreateまたはMarkForDeleteに渡されていなければならないが、そうでなければArgument−Exceptionがスローされる。更新競合が検出された場合にはUpdateCollisionExceptionをスローすることがある。
public void Update(object objectToUpdate);
public void Update(IEnumerable objectsToUpdate);
//ストアからの指定されたオブジェクトの内容をリフレッシュする。オブジェクトが修正されている場合、変更は上書きされ、オブジェクトはもはや修正されたとみなされない。アイテム、アイテム拡張、または関係オブジェクト以外のものが指定されている場合、ArgumentExceptionをスローする。
public void Refresh(object objectToRefresh);
public void Refresh(IEnumerable objectsToRefresh);
//修正されたオブジェクトが取り出されたときから、それを保存しようとしたときまでの間にストア内でデータが変更されたことを更新で検出した場合に発生する。イベントハンドラが登録されていないない場合、更新は例外をスローする。イベントハンドラが登録されている場合、例外をスローし、更新を中断することができ、それにより、修正されたオブジェクトはストア内のデータを上書きするか、またはストアおよびオブジェクト内で加えられた変更をマージする。
public event ChangeCollisionEventHandler UpdateCollision;
//更新処理中の様々な時点において発生し、更新進捗情報を供給する。
public event UpdateProgressEventhandler UpdateProgress;
//Updateの非同期バージョン
public IAsyncResult BeginUpdate(IAsyncCallback callback, object state);
public IAsyncResult BeginUpdate(object objectToUpdate, IAsyncCallback callback, object state);
public IAsyncResult BeginUpdate(IEnumerable objectsToUpdate, IAsyncCallback callback, object state);
public void EndUpdate(IAsyncResult result);
//Refreshの非同期バージョン
public IAsyncResult BeginRefresh(object objectToRefresh, IAsyncCallback callback, object state);
public IAsyncResult BeginRefresh(IEnumerable objectsToRefresh, IAsyncCallback callback, object state);
public void EndRefresh(IAsyncResult result);
関係メンバのトランザクション処理
//指定された孤立レベルを持つトランザクションを開始する。既定の孤立レベルはReadCommitedである。すべての場合において、分散トランザクションが開始されるが、それは、変更ストリーム型付きアイテムプロパティを包含しなければならない場合があるからである。
public Transaction BeginTransaction();
public Transaction BeginTransaction(System.Data.IsolationLevel isolationLevel);
関係メンバを検索する
//指定された型のオブジェクトについてこのアイテムコンテクスト内で検索するItemSearcherを作成する。アイテム、関係、またはアイテム拡張以外の型が指定されている場合、ArgumentExceptionをスローする。
public ItemSearcher GetSearcher(Type type);
//idを与えられているアイテムを見つける。
public Item FindItemById(ItemId itemId);
//パスを与えられているアイテムを見つける。パスは絶対パスでも相対パスでもよい。相対パスであれば、ItemContextが開かれたときに複数のアイテムドメインが指定されている場合、NotSupportedExceptionがスローされる。そのようなアイテムが存在しない場合には、NULLを返す。アイテムを取り出すために\\machine\shareへの接続をドメインの一部として作成する。アイテムは、そのドメインに関連付けられる。
public Item FindItemByPath(string path);
//パスを与えられているアイテムを見つける。パスは、指定されたアイテムドメインに相対的である。アイテムを取り出すために指定されたドメインへの接続を作成する。アイテムは、そのドメインに関連付けられる。そのようなアイテムが存在しない場合には、NULLを返す。
public Item FindItemByPath (string domain, string path);
//パスを与えられているアイテムの集合を見つける。パスは、ItemContextが開かれたときに指定されたアイテムドメインに相対的である。そのようなアイテムが存在しない場合には、空を返す。
public FindResult FindAllItemsByPath(string path);
//idを与えられている関係を見つける。
public Relatioinship FindRelationshipById(ItemId itemID, RelationshipId relationshipId);
//idを与えられているアイテム拡張を見つける。
public ItemExtension FindItemExtensionById(ItemId itemId, ItemExtensionId itemExtensionId);
//与えられたフィルタ条件をオプションにより満たす指定された型のすべてのアイテム、関係、またはアイテム拡張を見つける。これら以外の型が指定されていれば、ArgumentExceptionをスローする。
public FindResult FindAll(Type type);
public FindResult FindAll(Type type, string filter);
//与えられたフィルタ条件を満たす指定された型の任意のアイテム、関係、またはアイテム拡張を見つける。これら以外の型が指定されていれば、ArgumentExceptionをスローする。そのようなオブジェクトが見つからない場合、NULLを返す。
public object FindOne(Type type, string filter);
//与えられたフィルタ条件を満たす指定された型のアイテム、関係、またはアイテム拡張を見つける。これら以外の型が指定されていれば、ArgumentExceptionをスローする。そのようなオブジェクトが見つからない場合、ObjectNotFoundExceptionをスローする。複数のオブジェクトが見つからなかった場合、MultipleObjectsFoundExceptionをスローする。
public object FindOnly(Type type, string filter);
//与えられたフィルタ条件を満たす指定された型のアイテム、関係、またはアイテム拡張が存在する場合、trueを返す。これら以外の型が指定されていれば、ArgumentExceptionをスローする。
public bool Exists(Type type, string filter);
//検索により返されるオブジェクトがItemContextにより保持されるオブジェクト識別マップにどのように関係するかを指定する。
public SearchCollisionMode SearchCollisionMode {get; set;}
//ResultMappingについてPreserveModifiedObjectsが指定されている場合に発生する。このイベントにより、アプリケーションは、検索により取り出されたデータとともに修正されたオブジェクトを選択的に更新することができる。
public event ChangeCollisionEventHandler SearchCollision;
//他のItemContextからのオブジェクトをこのアイテムコンテクストに組み込む。同じアイテム、関係、アイテム拡張を表すオブジェクトがすでに存在しているわけではない場合、このItemContextの識別マップ、オブジェクトのクローンが作成され、マップに追加される。オブジェクトが存在する場合、これは、SearchCollisionModeと一致する方法で指定されたオブジェクトの状態および内容とともに更新される。
public Item IncorporateItem(Item item);
public Relationship IncorporateRelationship(Relationship relationship);
public ItemExtension IncorporateItemExtension(ItemExtension itemExtension);
}
//ItemContext.UpdateCollisionおよびItemSearcher.SearchCollisionイベントのハンドラ。
public delegate void ChangeCollisionEventHandler(object source, ChangeCollisionEventArgs args);
//ChangeCollisionEventHandlerデリゲートの引数。
public class ChangeCollisionEventArgs : EventArgs
{
//修正されたアイテム、アイテム拡張、または関係オブジェクト。
public object ModifiedObject {get;}
//ストアからのプロパティ。
public IDictionary StoredProperties {get;}
}
//ItemContext.UpdateProgressのハンドラ。
public delegate void UpdateProgressEventHandler(ItemContext itemContext, UpdateProgressEventArgs args);
//UpdateProgressEventHandlerデリゲートの引数。
public class ChangeCollisionEventArgs : EventArgs
{
//現在の更新オペレーション。
public UpdateOperation CurrentOperation {get;}
//現在更新中のオブジェクト。
public object CurrentObject {get;}
}
//検索により返されるオブジェクトがItemContextにより保持されるオブジェクト識別マップにどのように関係するかを指定する。
public enum SearchCollisionMode
{
//新しいオブジェクトを作成し、返さなければならないことを示す。識別マップ内の同じアイテム、アイテム拡張、または関係を表すオブジェクトは無視される。このオプションが指定されている場合、SearchCollisionイベントは発生しない。
DoNotMapSearchResults,
//識別マップからのオブジェクトを返さなければならないことを示す。オブジェクトの内容がアプリケーションにより修正された場合、修正されたオブジェクトの内容は保存される。オブジェクトが修正されていなかった場合、その内容は検索により返されたデータとともに更新される。Applicationは、SearchCollisionイベントに対するハンドラを用意し、必要に応じてオブジェクトを選択的に更新することができる。
PreserveModifiedObjects,
//識別マップからのオブジェクトを返さなければならないことを示す。オブジェクトの内容は、そのオブジェクトがアプリケーションにより修正されていたとしても、検索により返されたデータとともに更新される。このオプションが指定されている場合、SearchCollisionイベントは発生しない。
OverwriteModifiedObjects
}
//現在の更新オペレーション。
public enum UpdateOperation
{
//Updateが最初に呼び出されたときに与えられる。CurrentObjectはnullとなる。
OverallUpdateStarting,
//更新が成功した後、Updateが戻る直前に与えられる。CurrentObjectはNULLとなる。
OverallUpdateCompletedSucessfully,
//Updateが例外をスローする直前に与えられる。CurrentObjectは、例外オブジェクトとなる。
OverallUpdateCompletedUnsuccessfully,
//オブジェクトの更新が開始したときに与えられる。CurrentObjectは、更新に使用されるオブジェクトを参照する。
ObjectUpdateStarting,
//新しい接続が必要な場合に与えられる。CurrentObjectは、ItemContext.Openに渡されるようなアイテムドメインを識別するパスを含む文字列となる。関係のLocationフィールドから開くか、または取り出す。
OpeningConnection
}
}
付録B
namespace System.Storage
{
//アイテムコンテクスト内の特定の型について検索を実行する。
public class ItemSearcher
{
コンストラクタ
Figure 0004394644
プロパティ
//マッチするオブジェクトを識別するために使用されるフィルタ。
public SearchExpressionCollection Filters {get;}
//検索されるドメインを指定するItemContext。
public ItemContext ItemContext {get; set;}
//検索パラメータコレクション。
public ParameterCollection Parameters {get;}
//サーチャーが動作する型。単純検索では、これは、返されるオブジェクトの型である。
public Type TargetType {get; set;}
検索メソッド
//Filtersにより指定された条件を満たすTargetTypeのオブジェクトを見つける。そのようなオブジェクトが存在しない場合には、空のFindResultを返す。
public FindResult FindAll();
public FindResult FindAll(FindOptions findOptions);
public FindResult FindAll(params SortOption[] sortOptions);
//Filtersにより指定された条件を満たすTargetTypeの1つのオブジェクトを見つける。
//そのようなオブジェクトが存在しない場合、NULLを返す。
public object FindOne();
public object FindOne(FindOptions findOptions);
public object FindOne(params SortOption[] sortOptions);
//Filtersにより指定された条件を満たすTargetTypeのオブジェクトを見つける。
//そのようなオブジェクトが見つからない場合、ObjectNotFoundExceptionをスローする。複数のオブジェクトが見つからなかった場合、MultipleObjectsFoundExceptionをスローする。
public object FindOnly();
public object FindOnly(FindOptions findOptions);
//Filtersにより指定された条件を満たすTargetTypeのオブジェクトが存在するかどうかを判別する。
public bool Exists();
//同じ検索を繰り返し効率よく実行するために使用することができるオブジェクトを作成する。
public PreparedFind PrepareFind();
Figure 0004394644
Figure 0004394644
Figure 0004394644
Figure 0004394644
付録C
namespace System.Storage
{
public abstract class FindResult : IAsyncObjectReader
{
public FindResult ();
//FindResultを結果の中の次の位置に移動する。
public bool Read ();
public IAsyncResult BeginRead(AsyncCallback callback, object state);
public bool EndRead(IAsyncResult asyncResult);
//現在のオブジェクト。
public object Current {get;}
//FindResultがオブジェクトを含むかどうかを返す。
public bool HasResults {get;}
//FindResultが閉じられているかどうかを返す。
public bool IsClosed {get;}
//このFindResult内のアイテムの型を返す。
public Type ObjectType {get;}
//FindResultを閉じる。
public void Close();
void IDisposable.Dispose();
//現在位置から始まる、FindResult上の列挙子を返す。FindResult上の列挙子を進めることで、すべての列挙子が進むだけでなく、FindResult自体も進む。
IEnumerator IEnumerable.GetEnumerator();
public FindResultEnumerator GetEnumerator();
}
public abstract class FindResultEnumerator : IEnumerator, IDisposable
{
public abstract object Current {get;}
public abstract bool MoveNext();
public abstract void Reset();
public abstract void Close();
void IDisposable.Dispose();
}
}
namespace System
{
//オブジェクト上で繰り返すための共通インターフェース
public interface IObjectReader : IEnumerable, IDisposable
Figure 0004394644
本発明の複数の態様が組み込まれうるコンピュータシステムを表すブロック図である。 3つのコンポーネントグループであるハードウェアコンポーネント、ハードウェア/ソフトウェアインターフェースシステムコンポーネント、およびアプリケーションプログラムコンポーネントに分割されたコンピュータシステムを例示するブロック図である。 ファイルベースのオペレーティングシステムにおけるディレクトリ内の複数のフォルダにグループ化されているファイルの従来のツリーベースの階層構造を例示する図である。 本発明によるストレージプラットフォームを例示するブロック図である。 本発明の様々な実施形態におけるItem、Item Folders、およびCategories間の構造的関係を例示する図である。 Itemの構造を例示するブロック図である。 図5AのItemの複合プロパティ型を例示するブロック図である。 複合型がさらに記述されている(明示的にリストされている)「Location」Itemを例示するブロック図である。 Base SchemaにあるItemの子型としてItemを例示する図である。 継承型が明示的にリストされている(イミディエイトプロパティの他に)図6Aの子型Itemを例示するブロック図である。 2つの最上位レベルのクラス型を含むBase Schema、ItemおよびPropertyBase、およびそれから派生した追加Base Schema型を例示するブロック図である。 Core Schema内のItemを例示するブロック図である。 Core Schema内のプロパティ型を例示するブロック図である。 Item Folder、そのメンバItem、およびItem FolderとそのメンバItemとの間の相互接続のRelationshipsを例示するブロック図である。 Category(またも、Item自体である)、そのメンバItem、およびCategoryとそのメンバItemとの間の相互接続のRelationshipsを例示するブロック図である。 本発明による、ストレージプラットフォームのデータモデルの参照型階層を例示する図である。 本発明の一実施形態により、関係を分類する方法を例示する図である。 本発明の一実施形態により、通知メカニズムを例示する図である。 2つのトランザクションが両方とも新しいレコードを同じB−Tree内に挿入する実施例を示す図である。 本発明の一実施形態により、データ変更検出プロセスを例示する図である。 例示的なディレクトリツリーを示す図である。 本発明の一態様によりディレクトリベースのファイルシステムの既存のフォルダがストレージプラットフォームのデータストアに移動される実施例を示す図である。 本発明の一態様によるContainment Foldersの概念を示す図である。 ストレージプラットフォームAPIの基本アーキテクチャを例示する図である。 ストレージプラットフォームAPIスタックの様々なコンポーネントを表す概略図である。 例示的なContactsスキーマ(ItemとElements)の関係図である。 例示的なContactsスキーマ(ItemとElements)の関係図である。 本発明の一態様によるストレージプラットフォームAPIのランタイムフレームワークを示す図である。 本発明の一実施形態による、FindAllオペレーションの実行を例示する図である。 本発明の一態様により、ストレージプラットフォームのSchemaからストレージプラットフォームAPIクラスを生成するプロセスを例示する図である。 本発明の他の態様による、File APIが基づくスキーマを例示する図である。 本発明の一実施形態により、データセキュリティの目的に使用されるアクセスマスク形式を例示する図である。 本発明の一態様の一実施形態による、既存のセキュリティ領域から切り出される新しいまったく同じように保護されているセキュリティ領域を示す図である。 本発明の一態様の一実施形態による、Item検索ビューの概念を例示する図である。 本発明の一実施形態による、例示的なItem階層を例示する図である。

Claims (16)

  1. ストレージプラットフォームを提供するためのコンピュータシステムであって、
    既存のファイルシステムを含むデータベースエンジンと、
    データを格納するために前記データベースエンジン上に実装されデータストアであって、当該データストア内のデータは、型がスキーマで記述されている、データストアと、
    異なる型のアイテム、要素、および関係を定義するスキーマの集合と、
    アプリケーションプログラムが、前記ストレージプラットフォームのサービスおよび機能にアクセスすること、および前記データストア内の型がスキーマで記述されているデータにアクセスすることを可能にする、アプリケーションプログラミングインターフェースと
    を備え、
    前記データストア内のデータは、アイテム、要素、および関係について定義され、各アイテムは、前記データストア内に格納されるデータの基本ユニットであり、1つまたは複数の要素を含み、各要素は、1つまたは複数のフィールドを含む型のインスタンスであり、関係は、少なくとも2つのアイテムの間のリンクであり、
    前記アプリケーションプログラミングインターフェースは、前記スキーマの集合で定義された前記異なる型のアイテム、要素、および関係のそれぞれに対するクラスを含むことによって、アプリケーションが、前記データストア内の前記型がスキーマで記述されているデータにアクセスすることを可能にし、
    前記データストアは、アプリケーションプログラムによる前記データに対する変更を示す通知を受け取り、変更を追跡するための機能を備えたことを特徴とするコンピュータシステム。
  2. データは、既存の型のアイテムの拡張であるアイテム拡張として前記データストアに格納され、前記アプリケーションプログラミングインターフェースは、それぞれの異なるアイテム拡張に対するクラスを含むことを特徴とする請求項に記載のコンピュータシステム
  3. アイテム、要素、および関係のそれぞれの型に対する前記クラスは、アイテム、要素、および関係のそれぞれの型を定義する前記スキーマの集合に基づき自動的に生成されることを特徴とする請求項に記載のコンピュータシステム
  4. アイテム、要素、および関係のそれぞれの型に対する前記クラスは、データクラスの集合を定義し、前記アプリケーションプログラミングインターフェースは、前記データクラスに対するビヘイビアの共通集合を定義するクラスの第2の集合をさらに含むことを特徴とする請求項に記載のコンピュータシステム
  5. クラスの前記第2の集合は、ストレージプラットフォームスコープを表し、前記データストアに対するクエリのコンテクストを提供する第1のクラス、および前記データストアに対するクエリの結果を表す第2のクラスを含むことを特徴とする請求項に記載のコンピュータシステム
  6. 前記データストア内の前記異なる型のアイテム、要素、および関係は、ユーザ定義型として前記データベースエンジン内に実装されることを特徴とする請求項に記載のコンピュータシステム
  7. 前記アプリケーションプログラミングインターフェースは、前記データストア内の前記アイテムに含まれる1つまたは複数の要素に基づいて、クエリを形成するためのクエリモデルを提供することを特徴とする請求項に記載のコンピュータシステム
  8. 前記データストア内の複数のアイテムは、Item Folder、および前記Item Folderのメンバである少なくとも1つの他のアイテムを含むことができることを特徴とする請求項に記載のコンピュータシステム
  9. 前記データストア内の複数のアイテムは、Category、および前記Categoryのメンバである少なくとも1つの他のアイテムを含むことができることを特徴とする請求項に記載のコンピュータシステム
  10. 2つのアイテムの間の関係は、当該コンピュータシステムと当該コンピューティングシステム上で実行される任意のアプリケーションとの間のインターフェースとして機能するハードウェア/ソフトウェアインターフェースシステムによって、自動的に確立されることを特徴とする請求項に記載のコンピュータシステム
  11. 関係は、要素を含むことを特徴とする請求項に記載のコンピュータシステム
  12. スキーマの前記集合は、ストレージプラットフォームが所定の、予測可能な方法でCore Itemの前記集合を理解し、直接処理する際に使用するCore Itemの集合を定義するCore Schemaを含むことを特徴とする請求項に記載のコンピュータシステム
  13. Core Itemの前記集合内で定義されたアイテムのそれぞれの型は、単一の共通基本アイテムから派生することを特徴とする請求項12に記載のコンピュータシステム
  14. 前記単一の共通基本アイテムは、基本スキーマ内の基礎的なアイテムであることを特徴とする請求項13に記載のコンピュータシステム
  15. 前記データベースエンジンは、リレーショナルデータベースエンジンを含むことを特徴とする請求項1に記載のコンピュータシステム
  16. 前記リレーショナルデータベースエンジンは、オブジェクトリレーショナル拡張を有するリレーショナルデータベースエンジンを含むことを特徴とする請求項15に記載のコンピュータシステム
JP2005509111A 2003-08-21 2003-08-21 データの編成、検索、および共有のためのストレージプラットフォーム Expired - Fee Related JP4394644B2 (ja)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/US2003/027419 WO2005029314A1 (en) 2003-08-21 2003-08-21 Storage platform for organizing, searching, and sharing data

Publications (2)

Publication Number Publication Date
JP2007521537A JP2007521537A (ja) 2007-08-02
JP4394644B2 true JP4394644B2 (ja) 2010-01-06

Family

ID=34374773

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2005509111A Expired - Fee Related JP4394644B2 (ja) 2003-08-21 2003-08-21 データの編成、検索、および共有のためのストレージプラットフォーム

Country Status (4)

Country Link
EP (1) EP1656610A4 (ja)
JP (1) JP4394644B2 (ja)
AU (1) AU2003270058A1 (ja)
WO (1) WO2005029314A1 (ja)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7702802B2 (en) 2004-12-03 2010-04-20 Microsoft Corporation Sharing framework for resource sharing
CN100445997C (zh) * 2005-12-30 2008-12-24 英业达股份有限公司 数据同步方法与系统
US9143563B2 (en) * 2011-11-11 2015-09-22 Rockwell Automation Technologies, Inc. Integrated and scalable architecture for accessing and delivering data
WO2020037608A1 (zh) * 2018-08-23 2020-02-27 西门子股份公司 人工智能计算设备、控制方法及装置、工程师站及工业自动化系统
US20210004743A1 (en) * 2019-07-03 2021-01-07 Gustavo Zarrate-Cardenas Methods and systems for facilitating exploration of data to evaluate activities and behavioral patterns for making decisions
CN111104456A (zh) * 2019-10-12 2020-05-05 深圳壹账通智能科技有限公司 数据持久化存储方法、装置、计算机设备及存储介质
US11940960B2 (en) 2022-04-21 2024-03-26 Folder Front, LLC Intelligent folder-based data organization system

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5136712A (en) * 1989-06-29 1992-08-04 Digital Equipment Corporation Temporary object handling system and method in an object based computer operating system
US6078925A (en) * 1995-05-01 2000-06-20 International Business Machines Corporation Computer program product for database relational extenders
US6519597B1 (en) * 1998-10-08 2003-02-11 International Business Machines Corporation Method and apparatus for indexing structured documents with rich data types
US6338056B1 (en) * 1998-12-14 2002-01-08 International Business Machines Corporation Relational database extender that supports user-defined index types and user-defined search
US6199195B1 (en) * 1999-07-08 2001-03-06 Science Application International Corporation Automatically generated objects within extensible object frameworks and links to enterprise resources
AU2001271802A1 (en) 2000-07-03 2002-01-14 Oculus Technologies Corporation Access control for a decentralized or emergent model on a computer network
US6999956B2 (en) * 2000-11-16 2006-02-14 Ward Mullins Dynamic object-driven database manipulation and mapping system
US6697818B2 (en) * 2001-06-14 2004-02-24 International Business Machines Corporation Methods and apparatus for constructing and implementing a universal extension module for processing objects in a database

Also Published As

Publication number Publication date
WO2005029314A1 (en) 2005-03-31
EP1656610A4 (en) 2008-06-11
JP2007521537A (ja) 2007-08-02
EP1656610A1 (en) 2006-05-17
AU2003270058A1 (en) 2005-04-11

Similar Documents

Publication Publication Date Title
JP4394643B2 (ja) アイテムベースのストレージプラットフォームにおけるデータモデリングのためのシステムおよび方法
US7555497B2 (en) Systems and methods for separating units of information manageable by a hardware/software interface system from their physical organization
US7428546B2 (en) Systems and methods for data modeling in an item-based storage platform
US7483915B2 (en) Systems and method for representing relationships between units of information manageable by a hardware/software interface system
US8131739B2 (en) Systems and methods for interfacing application programs with an item-based storage platform
US7739316B2 (en) Systems and methods for the implementation of base schema for organizing units of information manageable by a hardware/software interface system
US7349913B2 (en) Storage platform for organizing, searching, and sharing data
US7529811B2 (en) Systems and methods for the implementation of a core schema for providing a top-level structure for organizing units of information manageable by a hardware/software interface system
AU2003259961B2 (en) Systems and methods for interfacing application programs with an item-based storage platform
JP4583377B2 (ja) ハードウェア/ソフトウェアインターフェースシステムにより管理可能な情報のユニットに対する関係および階層の同期サービスを実現するシステムおよび方法
JP4583376B2 (ja) ハードウェア/ソフトウェアインタフェースシステムにより管理可能な情報のユニットに対する同期処理サービスを実現するシステムおよび方法
US20050055354A1 (en) Systems and methods for representing units of information manageable by a hardware/software interface system but independent of physical representation
JP4583375B2 (ja) 同期スキーマの実装のためのシステム
JP4580390B2 (ja) ハードウェア/ソフトウェアインターフェイスシステムによって管理可能な情報単位の拡張および継承のためのシステムおよび方法
JP4394644B2 (ja) データの編成、検索、および共有のためのストレージプラットフォーム
RU2371757C2 (ru) Системы и способы моделирования данных в основанной на предметах платформе хранения
RU2412461C2 (ru) Системы и способы сопряжения прикладных программ с платформой хранения на основе статей
ZA200600644B (en) Systems and methods for interfacing application programs with an item-based storage platform

Legal Events

Date Code Title Description
A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20090522

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20090824

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20090915

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20091015

R150 Certificate of patent or registration of utility model

Ref document number: 4394644

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20121023

Year of fee payment: 3

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20131023

Year of fee payment: 4

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313113

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

LAPS Cancellation because of no payment of annual fees