次に、本イノベーションについて図面を参照しながら説明するが、図面では全体を通じて同じ要素を表すために同じ参照番号が使用される。以下の説明では、完全に理解するために説明の目的で多くの特定の細部が示される。しかしながら、本イノベーションがこれら特定の細部なしで実施可能であることは明白であろう。その他の場合、説明を容易にするためによく知られた構造およびデバイスがブロック図の形で示される。
本明細書で使用される場合、「構成要素」および「システム」という用語は、ハードウェア、ハードウェアとソフトウェアの組合せ、またはソフトウェア実行中の、コンピュータ関係のエンティティを表す。例えば構成要素は、プロセッサ上で実行中のプロセス、プロセッサ、ハードディスクドライブ、複数ストレージドライブ(光および/または磁気ストレージ媒体)、オブジェクト、実行可能プログラム(executable)、実行スレッド、プログラム、および/またはコンピュータとすることが可能であるが、これらに限定されるものではない。例を挙げると、サーバ上で実行中のアプリケーションとサーバの両方を構成要素とすることができる。1つまたは複数の構成要素がプロセスおよび/または実行スレッド内に常駐可能であり、さらに構成要素を1つのコンピュータ上にローカライズすること、ならびに/あるいは2つまたはそれ以上のコンピュータ間で分散することが可能である。
ユーザに情報を表示するある種の方法が示され、スクリーンショットとしてある種の図面に関して説明されるが、当業者であれば様々な他の代替形態が使用可能であることを理解されよう。本明細書では「画面(screen)」、「ウェブページ」、および「ページ」という用語は、一般に相互に交換可能なものとして使用される。ページまたは画面は表示記述として、グラフィカルユーザインターフェースとして、あるいは画面上に情報を表示する他の方法(例えばパーソナルコンピュータ、PDA、携帯電話、または他の好適なデバイス)によって格納および/または伝送され、ページ上に表示されることになるレイアウトおよび情報またはコンテンツは、メモリ、データベース、または他のストレージ機構に格納される。
初めに図面を参照すると、図1は、本発明に従った共通データモデル(CDM)アーキテクチャ100を示す図である。CDM 100は、複数の異種のアプリケーションにまたがって均一なアイデンティティを有するデータエンティティを提供する、エンティティ構成要素104を含む。リレーションシップ構成要素102は、2つまたはそれ以上のデータエンティティ間の関係を定義する。
CDM 100は、複数のアプリケーション特有のデータモデルに共通のデータモデルである。例えばこれは、PIM(個人情報管理)のエンドユーザアプリケーションデータと業務別(LOB)データの、両方をサポートすることができる。同様に、SDMタイプ(Windows(登録商標)System Definition Model)アプリケーションは、CDM 100のトップにそのモデルを指定することができる。CDM 100は、アプリケーション間での改良された相互運用性を可能にする。
CDMの要素に入れることが可能なデータモデル化および持続性の概念がかなりの数に上ることにより、データを記述するために共通語彙を使用し、オブジェクトリレーショナルな持続性フレームワークなどの、すべてのアプリケーションに利益を与えることが可能な共通サービスセットが可能になる。CDM 100の間接的な目標は、アプリケーションがそれら自体の持続性インフラストラクチャを定義しなくてもよくなること、および異なるデータストアをまたがったより高水準なアプリケーションの相互運用性を可能にすることである。他の目標には、リレーショナル概念の包含、データに関するリッチオブジェクト抽象化の定義、リッチセマンティクスのモデル化(例えばリレーションシップ)、アプリケーションとCDMとの間での不一致の最小化、CLR(共通言語ランタイム)タイプシステムとの整合、中間層およびクライアントアプリケーションの開発を可能にする動作のサポート、ならびに論理的概念が含まれる。モデル化の概念は、データストアとは無関係なセマンティクスをキャプチャする。
本イノベーションのCDMは、少なくとも以下の新規な態様を提供する。
・ エンティティタイプ、インラインタイプ、エンティティテーブル、テーブルセット、およびリレーションシップで構成されるタイプシステム
・ エンティティタイプとインラインタイプとの区別
・ エンティティタイプはアイデンティティおよびキーの概念を含む(SQLの場合のようにテーブルで定義するのではない)
○ エンティティプロパティの組合せからなるキーの明示的宣言
・ エンティティ間での異なる形のリレーションシップ(アソシエーション)
○ エンティティアソシエーションの他のアソシエーションタイプとの構成可能性
○ 共通値アソシエーション
○ 条件付アソシエーション(より複雑な結合タイプリレーションシップを提供する)
・ エンティティで指定された属性(プロパティ記述)と、リレーションシップで指定されたもの(エンティティを関係付けるためのそれらのプロパティの使用方法)とのくくり出し(factoring)
・ ネストされたテーブル(構成)
・ 拡張子
○ タイプ特有
○ インスタンスまたはクラスベース
○ 他の拡張子から派生する機能
○ ストレージテーブルを指定する機能
・ 拡張可能列挙
・ リレーションシップ用のナビゲーションプロパティの宣言
・ 特定テーブルにのみ適用するためのアソシエーションのスコーピング
・ エンティティテーブルおよびリレーションシップのテーブルセットへのグループ化
・ エンティティ定義、アソシエーション、またはテーブルセットで使用されることになるテーブルを指定する機能
・ 各タイプ定義の属性セット
・ 匿名タイプとしての射影(projection)の表現
○ 匿名タイプのインラインを定義する機能
・ タイプ制約の指定
次に、任意の代数が動作する際に介するCDMタイプシステムをテキスト記述する。インデントは、インデントされたタイプが「アウトデントされた」タイプの一種であることを示し、例えばアレイタイプはインラインタイプである。
タイプ−−すべてのタイプの抽象ベース
エンティティタイプ−−インライン指定された(Inline named)タイプのプロパティを備えた参照可能タイプ(一意のアイデンティティを有する)
インラインタイプ−−アイデンティティを有さない
コレクションタイプ
アレイタイプ−−インラインタイプインスタンスのバッグ
エンティティテーブルタイプ−−エンティティのセット
スカラタイプ
エンティティ参照タイプ−−エンティティへの参照
テーブル参照タイプ−−更新代数に必要であり、プロパティのタイプとして使用すべきではない
単純タイプ−−int、string、Xml、FileStreamなどの他のメンバのない基本的なタイプ
列挙タイプ
アレイタイプ−−インラインタイプインスタンスのバッグ。これはRowSet<I>である
複合タイプ
構造化タイプ−−ユーザ定義プロパティを有するタイプ。インラインタイプのプロパティ
匿名タイプ−−名前なし。使用ごとに再定義される。インラインタイプのプロパティを有する
行セットタイプ−−インラインまたはエンティティタイプインスタンスのバッグ
エンティティテーブルタイプ−−エンティティタイプインスタンスのセット。これはサイト(インスタンスが格納される場所)である
リレーショナルテーブルタイプ−−匿名タイプインスタンスのバッグ。これはサイトである
図2は、革新的な態様に従ってCDMを提供する方法を示す図である。説明をわかりやすくするために、例えば流れ図の形で本明細書に示される1つまたは複数の方法は、一連の動作として図示および説明されるが、本イノベーションは、これに従った動作の一部が本明細書で図示および説明されるものとは異なる順序でおよび/または他の動作と同時に発生する場合があるため、動作の順序によって制限されるものでないことを理解されよう。例えば当業者であれば、代わりに、ある方法を状態図などの一連の相互に関係する状態またはイベントとして表せることを理解されよう。さらに、イノベーションに従って方法をインプリメントするために、図示されたすべての動作を必要とはしない場合もある。
200では、スキーマ定義をスコーピングするためのネームスペースを定義するスキーマが提供される。202では、プロパティと方法をグループ化するためのエンティティタイプが定義される。204では、そのプロパティがテーブルであるテーブルセットエンティティが定義される。206では、リレーションシップを使用してエンティティ間のセマンティック接続が表現される(例えば、アソシエーション、構成など)。
エンティティは、実世界の物体をモデル化する。エンティティは、CDMにおいてそのアイデンティティ(キー)を使用して一意に識別可能なデータオブジェクトである。エンティティは、そのアイデンティティを使用して共有(参照)可能な最小単位である。エンティティは構造(例えばプロパティ)および動作(例えば方法)を有する。様々なタイプのエンティティの例の中には、注文、顧客、連絡先、ドキュメントなどがある。エンティティは、SQL99におけるタイプ別行、またはODBMSにおけるオブジェクトと同様である。エンティティはエンティティタイプのインスタンスとして定義される。単なる例として、エンティティ定義用の構文を以下に示す。
あらゆるエンティティは、エンティティキー値で構成された一意のアイデンティティを有する。このアイデンティティは、エンティティへの参照を形成するための基礎である。エンティティキーとは、エンティティの1つまたは複数のプロパティのセットである。あらゆる非抽象エンティティタイプ定義は、キープロパティを指定するか、または基本エンティティタイプからキー指定を継承しなければならない。キープロパティの値は、ユーザ定義またはシステム生成とすることができる。
エンティティの識別子は、エンティティのキーとエンティティが含むかまたは親エンティティの識別子とで形成される。親エンティティとは、(子)エンティティが格納されるテーブルを含むエンティティのことである。エンティティのキーは、そのテーブル内で一意であることのみが必要であり、他のテーブルは同じエンティティキー値を備えたエンティティを含むことができる。したがってエンティティ識別子は、そのキー値とその親の識別子を組み合わせることによって、一意となる。場合によっては、キーは、グローバル一意識別子(GUID)を使用するなどして、ストア全般にわたって一意とすることができる。CDMは、識別子が要素(例えば、EntitySet)内で一意であることのみを必要とする。
アイデンティティとはエンティティを完全に識別するものであり、エンティティインスタンスを戻すためにデリファレンス(de−reference)することができる。参照はアイデンティティを使用する。エンティティが与えられれば、その参照値を取得することができる。2つのエンティティの識別子が同じである場合かつその場合に限り、その2つのエンティティは同じである。CDMにおける参照タイプの構文は「Ref(<entity_type>)」であり、プロパティは「参照(ref)」タイプとすることが可能であって、こうしたプロパティは参照プロパティと呼ばれる。参照値は持続可能であり、エンティティへの永続参照である。参照値をコピーしても、参照先のエンティティはコピーされない。参照値は、例えばRefおよびDeref演算子を介して、照会言語内でのナビゲーションを提供することもできる。
参照は、エンティティの共用を可能にする。例えば、注文エンティティは顧客参照プロパティを有することができる。同じ顧客に関するすべての注文が、顧客参照プロパティに関して同じ値を有することになる。参照の構造は、インプリメンテーション定義される。参照およびキーは、APIではタイプとして公開することができる。参照インプリメンテーションは、キー値と、場合によってはエンティティが見つかるテーブルとを含む、参照するエンティティの識別子情報を含む。これは、個々のキー値(有効な結合を可能にする)として、または単一の不透明値として、参照を格納する。機能が、キー値またはエンティティを含むテーブルを取得するための参照の構造を公表する場合がある。
CDMは、エンティティとリレーションシップという主要な概念からなる。エンティティとは、単一のアイデンティティを備えた緊密に関係するデータのセットである。リレーションシップとは、2つまたはそれ以上のエンティティを関係付けるメカニズムである。図3は、リレーションシップ構成要素102およびその形式を示す図である。リレーションシップは、2つまたはそれ以上のエンティティがどのように関係しているかを示す。リレーションシップ300は、以下のいずれかの形式を取る。
アソシエーション302は、2つまたはそれ以上のエンティティの間でのリレーションシップ300の最も一般的な形である。エンドと呼ばれるエンティティは、明示的なソース−ターゲット(外部−1次キーのような)リレーションシップを介して、または照会を介して、互いに関係付けられる。リレーションシップでは、それぞれのエンドが他方のエンドから独立したままである。一方のエンドが削除された場合に他方のエンドが削除されるようにすること、または一方のエンドが存在する限りは他方のエンドが削除されないようにすることが可能である。
構成304とは、子エンティティが概念上は親エンティティの不可欠部分(integral part)であるように、1つの(または複数の)子エンティティに関係付けられる親エンティティである。子エンティティは、厳密に1つの親の中に存在するため、親エンティティが削除された場合は必ず削除されなければならない。さらにそのアイデンティティは、その構成内の他の子エンティティの間で一意でありさえすればよい。
アソシエーションエンティティ306は、2つまたはそれ以上のエンティティであるエンドが、それ自体がプロパティを有することが可能な、別のエンティティであるアソシエーションエンティティ上でのリレーションシップによって互いにリンクされている場合に定義される。各エンドは、概念上は互いに独立したままである。
図4は、エンティティ構成要素100、ならびにそのメンバおよびメンバタイプを示す図である。エンティティ構成要素100は、エンティティメンバからなるエンティティ400を利用する。以下の種類のメンバがサポートされる。プロパティ402は、特定タイプのインスタンスに対してストレージを割り振る。ナビゲーションプロパティ404は、アソシエーションによって関連付けられたエンティティを横切る照会を簡略化する。算出(Calculated)プロパティは、格納値に対する算出値を表す。メソッド408は、実行可能なオペレーションを表す。
エンティティメンバは、メンバタイプを有する、および/またはタイプ別パラメータを取る。エンティティのメンバを記述する場合は、インラインタイプ412およびテーブルタイプ414という種類のタイプが使用可能である。インラインタイプとは、そのデータがエンティティ上でインラインに格納されるタイプである。インラインタイプは、エンティティタイプと同様にメンバで構成される。インラインタイプは、エンティティタイプとは異なり、それらが常駐するエンティティによって課せられるものを超えるアイデンティティは持たない。インラインタイプは直接宣言することが可能であり、いくつかの他の種類のタイプをデータモデル内に包含する。インラインタイプには以下が含まれる。
単純インラインタイプ416は、共通データモデルに見られる内部構造を持たないインラインタイプである。CLR値タイプは、共通データモデルにおける単純なタイプである。列挙タイプ418は名前付き値のセットである。列挙タイプ418は、競合の恐れなしに複数の開発者によって独立におよび同時に拡張可能な単純なタイプである。エンティティ参照タイプ420は、単一エンティティへの永続参照であり、場合によってはそのエンティティが常駐するテーブルへの参照を含む。エンティティ参照は、2つのエンティティを関係付けるためにアソシエーションと共に使用される。テーブル参照タイプ422はテーブルへの永続参照である。アレイタイプ424は、アレイ以外のインラインタイプのインスタンスの順序付きコレクションである。
テーブルタイプ414は、指定されたエンティティタイプのインスタンスの非順序付きコレクションである。テーブルは2つのエンティティを関係付けるために構成と共に使用される。上記でリストアップされたすべてのタイプが被包含タイプであり、すなわちエンティティはこれらのタイプの値を含むことができる。
エンティティのタイプは、エンティティのメンバを記述するものである。エンティティタイプは基本エンティティタイプから派生することが可能であり、この場合、派生エンティティタイプは基本タイプのすべてのメンバならびに派生タイプに関して記述されたメンバを含む。エンティティタイプは、競合の恐れなしに複数の開発者によって独立におよび同時に拡張可能である。こうしたエンティティ拡張タイプは、タイプ継承には依存しない。エンティティおよびエンティティ拡張タイプは、被包含タイプではない。
テーブルセットとは、テーブル値プロパティを有するエンティティタイプのインスタンスのことである。テーブルセットを宣言すると、そのタイプの単一の名前が付いたインスタンスおよびそれが含むそれぞれのテーブルが作成される。データベースを作成する場合にデータを格納するための場所が作成されるのと同様に、テーブルセットはデータを格納するための場所を作成する。
次に図5を参照すると、本発明のコアデータモデルの特徴を示すためのLOBアプリケーションウィンドウが示されている。販売注文(Sales Order)エントリには、注文番号(Order Number)、顧客番号(Customer Number)、顧客名(Customer Name)、ならびに、商品番号(Item Number)、内容(Description)、数量(Quantity)、および他の関連情報などの注文ライン情報などのデータが示される。
図6は、図5のLOBアプリケーションウィンドウ上でエンティティ間の構造リレーションシップがどのように反映されるかを示す図である。前述のように、CDMの2つのコア概念はエンティティおよびリレーションシップである。エンティティとは、プロパティとエンティティを一意に識別するアイデンティティデータとを備えたオブジェクトのことである。リレーションシップとは、エンティティを関係付ける方法のことである。図6では、Order(注文)およびCustomer(顧客)が、アソシエーションによって関係付けられた2つのエンティティである。ここで、Orderエンティティは1つのCustomerエンティティ(「1」)にのみ関連付けられる。直感的に、顧客をゼロまたはそれ以上の注文(「*」)に関連付けることができる。エンティティはプロパティを有し、互いから継承することができる。アソシエーションは、参照(例えば、Order.Customer)として、プロパティ間の結合として、エンティティとしてなど、様々な方法でインプリメントされる。
アソシエーションは、いくつかの異なる方法でインプリメントすることができる。その1つの方法が、参照(ポインタに類似)を使用することである。図6の前述の例では、OrderからCustomerへのポインタである1つの参照が存在する。これは、注文に関係付けられた1人の顧客が存在可能であるという点で、制約をインプリメントするのに便利である。1つのインプリメントでは、参照プロパティはその中に1つの参照しか有することができない。
他の方法は、プロパティに関して記述されたリレーションシップである、従来のアソシエーションを使用することである。ある場合には2つのプロパティが一緒に関係付けられ、ある場合にはプロパティのセットが相互に関連付けられる。共通値リレーションシップとは、2つのエンティティが同じ値を有する場合、それらは関係している、というリレーションシップである。その一例が、著者名(プロパティ)を有するドキュメント(エンティティ)と、連絡先名プロパティを有する連絡先と呼ばれる別のエンティティである。ドキュメントエンティティの著者名プロパティと、連絡先エンティティの連絡先名プロパティとの間に、リレーションシップをセットアップすることができる。これらのプロパティ値が同じである場合、これら2つのエンティティの間にはリレーションシップが存在する。これは、「この表現が真の場合、これらのエンティティは関係している」と言える、何らかの任意の表現を作成するように一般化することができる。例えば、第1のエンティティが第1の長方形プロパティを有し、第2のエンティティが第2の長方形プロパティを有する場合、第2のエンティティ長方形が第1のエンティティ長方形を完全に封入していれば、第1のエンティティと第2のエンティティは関係しているというように、リレーションシップを定義することができる。
第3の方法は、接続するためにエンティティが使用される、アソシエーションエンティティである。これを使用して、アソシエーション上にプロパティを持つことができる。
図7は、図5のLOBアプリケーションウィンドウ上に課された、本発明に従ったエンティティの構成を示す図である。構成とは、1つの物が他の物を含むが、単なるリレーションシップではない、包含である。例えば、OrderはOrderLineエンティティのセットを有するかまたは含む。親アイデンティティと子アイデンティティとがまとまって、子の完全なアイデンティティを構成する。構成は、親エンティティ上のエンティティテーブルプロパティによって表される。この、構成を表すためのテーブル概念のCDM内での再使用可能性が有利である。構成(黒いダイヤ形で示される)は、2つのエンティティを親および子として関連付ける。各Orderは、多くの(「*」)OrderLine(注文ライン)エンティティ(またはその派生物)のテーブルを有する。子は親の中に存続し、親を削除すれば子も削除しなければならないため、親は子の存続時間を制御することになる。子エンティティは、同じ構成内の他の子の間でのみ一意であればよい。
図8は、本発明に従って、エンティティリレーションシップ、集合テーブル(aggregate table)およびそのアドレッシング、ならびに制約を採用する、CDM概念を使用する例示的なLOBモデルを示す図である。矢印の付いた線はアソシエーション(例えば参照プロパティ)を表し、黒いダイヤ形は構成(テーブルプロパティ)を示し、テーブルセットはデータベースに類似する。テーブルセットは、アプリケーションデータツリーのルートである。テーブルセットはテーブルセットタイプのインスタンスである。テーブルセットタイプは、テーブル値プロパティのみを有する。すなわち、テーブルセットタイプは構成にのみ関与する。テーブルセットタイプとは、一種のエンティティタイプのことである。アプリケーションは、「テーブルセット」と呼ばれるテーブルセットタイプのインスタンスを定義する(例えば、タイプ「NorthwindData」の「Northwind」を定義する)ことによって、データを作成する。テーブルセットは、サービス内、および最終的にはデータベース内にインストールされる、データのセットも記述する。これは自己完結型(self−contained)であり、構成可能なデータ単位である。
エンティティ(例えばSalesData)が定義された場合、これを多くの異なるエンティティに関係付けることができる。例えばある会社は、注文のセットをその内部に、および顧客のセットをその内部に有する。これは、2つの異なる構成を示す。Orderはその内部に注文ラインを有することになり、その結果、ツリーの形成が開始される。ツリーのトップは、テーブルセットエンティティと呼ばれる特別なエンティティである。テーブルセットとは、いくつかのエンティティタイプの単一のインスタンスのことである。(この構造は、データベースのSQL概念に類似している。)テーブルセットは、データ宣言の手段を提供する。図では、他のエンティティとは異なるため、(網掛けボックスではなく)白で示されている。LOBの例では、1つまたは複数の会社、アドレス、顧客、および注文を備えたSalesDataテーブルセット(または「データベース」)を示す。例えばCustomerエンティティは、例えば、住宅ビジネスを表す会社または商業ビジネスを表す会社のいずれかの、一度に1つの会社の一部であることが可能である。図8のLOBモデルにおけるエンティティリレーションシップの概念を示すために、親エンティティであるCompanyは、2つの子エンティティOrderおよびCustomerを有する。CDMは論理上、Companyエンティティ内で互いに結合されていない子テーブルを構築する。OrderエンティティからAddressエンティティへのラインが、子へのアソシエーションである。
CDMにおける構成の一態様は、会社が注文を設定した場合、その注文セットが他の会社の注文セットとは切り離されるというものである。例えば小売店からの注文が、エンジニアリングからの注文と交差または重複することは決してない。構成は、これらのセットが別々であり、重複せず、共有しないことを意味する。前述のように、アソシエーションは矢印の付いた線によって表される。したがって、ある注文が顧客を参照することが可能であり、同じ顧客を参照する他の注文(図示せず)を生成することができる。ここで、Orderはその直近の同等者(Customer)を参照する必要はないが、被包含のAddressエンティティを直接参照することができる。複数の注文が、BillingAddressとラベル表示されたAddressを参照することができる。概念上、注文はそのアドレスにいる人物宛に請求されることになる。しかしながら、注文の各OrderLineは、各ラインから参照された別々の出荷先アドレスに出荷することができる。それらのアドレスはそれぞれ、注文ラインの親である注文によって参照される同じ顧客からのものである。したがって、参照は顧客に属するアドレス全体にわたって延在する。
CDMの他の態様は、制約を導入することができる。OrderからCustomer、OrderからAddress、およびOrderLineからAddressの、3つのアソシエーションラインを考えてみる。注文またはそのラインによって参照される顧客アドレスが、注文の顧客に属さなければならないという必要はない。アドレスに、他の顧客のアドレスを参照させることが可能である。しかしながらCDMには、アドレスが該当する顧客のものであることを保証するために適用可能な制約が存在する。これが、アソシエーションの「スコーピング」と呼ばれるものである。OrderエンティティとCustomerエンティティとの間のアソシエーションに関しては、制約とは、Orderが同じCompany内のCustomerのみを参照できることである。すなわち、これらは「共通の祖先(ancestor)」を有するのである。
OrderエンティティとAddressエンティティとの間のアソシエーションに関しては、制約とは、Orderが集合テーブル/SalesData/Company/Customer/Address内のAddressのみを参照できることである。集合テーブルは、制約内のアドレスおよびプロパティパスによる照会である。ここで、SalesDataテーブルセットタイプは、「Companies」という名前のテーブルプロパティ800を有する。各Customerエンティティは、それ自体のAddressエンティティのテーブルを有する。それらテーブルの集合(事実上はそれらの共用体(union))は、Addressエンティティで、Table Name:/SalesData/Companies/Customers/Addressesによってアドレス指定される。
図9は、CDMに従ったエンティティキーおよび識別子の使用を示す図である。キーとは、特定のテーブル内で一意に識別するエンティティ上の1つまたは複数のプロパティのことであり、ここでもテーブルは構成リレーションシップによって形成される。例えば、顧客に関するキーとして社会保障プロパティを定義することができる。このキーは、例えば、テーブル内で2人の顧客が同じ社会保障番号を持つことがないことを保証する。エンティティのアイデンティティの第2の部分は、エンティティが存在するテーブルである。2人の顧客に同じ名前を付けたい場合、キーを(ここで説明するように)名前以外の何らかのプロパティとして定義すること、またはそれぞれの顧客を異なるテーブルに入れることで、名前の衝突を避けることができる。エンティティテーブルは、テーブルプロパティとテーブルのプロパティ名とを含むエンティティの識別子を提供することによって識別される。したがって、これは再帰的定義である。
図9では、Aの2つのテーブル(B上のATableおよびC上のATable)が存在する。Aについて見ると、その識別子はAIDからなり(<<key>>AID)、これはどのテーブル内にあるかも示す。1つの可能性として、これはATableプロパティ内の特定のBエンティティ内にある。他の可能性として、これはATableプロパティ内の特定のCエンティティ内にある。実際の例は、典型的にはシーケンス番号である注文ラインのキーである。プロパティ名は、キーとしてマーク付けされたシーケンス番号である。同じシーケンス番号を持つ多くの異なる注文が存在する可能性がある。したがってシーケンス番号は、すべての注文にわたってではなく、その注文内でのみ一意であればよい。
前述のように、CDMによって提供される他の態様は、テーブルの集合である。例えば、1つの注文に関する注文ラインのテーブルは、別の注文に関する別の注文ラインのテーブルとは切り離される。しかしながら、注文にかかわりなく、ある商品がいくつ注文されたかを知りたい場合がある。したがって、注文にかかわりなく、すべての注文ラインを通じて注文されたウィジェットの数を調べる必要がある。集合テーブルは、これを実行する際の手段である。すなわち、多くの異なる注文または他のエンティティタイプにわたるすべての注文ラインを調べることができる。
次に、開示されたイノベーションのCDMについてより詳細に説明する。SQL99では、キーは行タイプ定義ではなくテーブルに関して定義されるのに対して、このCDMでは、キーはタイプに関して定義される。エンティティタイプ定義からキー定義を切り離すことは自由自在(または拡張可能)であるように見えるかもしれないが、実際にはタイプの再使用可能性および移植性を制限するものである。キーがテーブルに関して定義される場合、タイプ特有の動作は様々なテーブルにわたって働くことができない。すなわち、エンティティタイプに関して作成された何らかのビジネス論理(すなわち、顧客、注文を作成し、それらを関係付けること)が、そのエンティティタイプの様々なストアにわたって働くという保証はなく、それによってタイプの再使用可能性は弱まる。SQL99では、クライアント/中間層アプリケーションプログラミング環境にどのようにタイプをマッピングするかを指定しないので、これは問題ではない。SQL99ではエンティティタイプに関するアイデンティティがないため、エンティティタイプをマッピングするのではなく、タイプテーブルをプログラミング言語オブジェクト(クラス)にマッピングさせる。加えて、アイデンティティをテーブルに関連付けることでは、一時エンティティをサポートすることには対処しない。再使用可能なタイプおよび層にとらわれない(tier−agnostic)タイプの動作をサポートするために、アイデンティティがエンティティタイプに関連付けられる。
エンティティの持続性。エンティティは、エンティティタイプの構築者(新規)方法を呼び出すことによって作成可能であり、エンティティはそれらをテーブルに追加することによって持続する。CDMでは、エンティティテーブルはエンティティのタイプ別集まりである。エンティティテーブルはSQL99のタイプ別テーブルに類似しているが、論理的である。すなわち、エンティティテーブルは1つまたは複数の物理SQLテーブルにマッピングすることができる。エンティティタイプのテーブルは、タイプのエンティティテーブルと呼ばれる。
エンティティの存続時間は、それがメンバであるテーブルの持続時間に依存する。テーブルが削除された場合、その中のエンティティも削除される。エンティティは、明示的に削除することもできる。
エンティティテーブルは、構成を定義すること、またはエンティティタイプ内にプロパティを指定することによって定義される。論理的には、テーブルのインスタンスは、エンティティタイプのインスタンスが作成された場合に作成され、エンティティインスタンスが削除された場合に削除される(ただし、物理SQLテーブルは一般に、タイプを定義するスキーマがインストールされた場合に作成され、スキーマがアンインストールされるまで存在する)。
こうした特性は、親エンティティタイプと子エンティティタイプ(この場合は、それぞれOrderおよびOrderLine)との間の構成リレーションシップを定義する。
所与のエンプティタイプのインスタンスを格納するために、任意数のテーブルを作成することができる。各テーブルは完全に独立している(キーは単一のテーブルの範囲内でのみ一意であるなど)。照会可能な所与のタイプのすべてのインスタンスにグローバルな「範囲」はない。
<EntityType>要素にTable属性を含めることによって、エンティティタイプを単一のテーブルに拘束することができる。これは、エンティティが他のエンティティタイプのテーブルの存在に依存する動作を含むことになる場合に有用である。例えば、OrderタイプはCustomerテーブルの存在に依存する(およびその逆も同様)可能性があり、これは、以下の例でTable属性を含めることによって反映される。
エンティティにテーブルの制約を課すことにより、そのタイプの複数のテーブルを有することを防ぐ。より拘束性の少ない方法は、リレーションシップの章のアソシエーションの項で説明するように、アソシエーションに制約を課すことである。
テーブルセット。テーブルセットタイプとは、エンティティタイプの制限付きの形である。テーブルセットタイプは、参照およびテーブル値プロパティ、算出プロパティ、および/またはメソッドのみを有することができる。例えば以下のとおりである。
テーブルセットとは、テーブルセットタイプのインスタンスのことである。各テーブルセットインスタンスは、所与のストア内で一意の名前を有する。テーブルセットインスタンスは、スキーマ内で宣言するか、またはストアが提供するオペレーションを使用して動的に作成することができる。スキーマからのテーブルセットインスタンス宣言の一例を以下に示す。
テーブルセット名ならびにテーブルプロパティ名は、照会のFROM節で使用することができる。例えば以下のとおりである。
テーブルセットタイプは、デフォルトのテーブルセットインスタンスを宣言することができる。例えば以下のとおりである。
あらかじめ定義されたテーブルセットを新規のテーブルセットに集合させることも可能である。これは、2つの別々のアプリケーションからのデータを単一のアプリケーションに組み込む場合に有用である。上記の例のSalesDataエンティティタイプは抽象であることに留意されたい。これは、非抽象エンティティタイプがキープロパティを指定しなければならないためであり、テーブルセットに使用されるエンティティタイプでは単純なタイプのプロパティは許可されない。あらかじめ定義されたテーブルセットを新規のテーブルセットに集合させることが可能である。
エンティティタイプ対インラインタイプ。インラインタイプは非エンティティタイプである。インラインタイプは構造タイプと同様であり、単なる値である。これらはいかなるアイデンティティも有さず、たとえ同一の値を有する場合であっても、各インラインインスタンスは異なる。CDMでは、インラインタイプはエンティティプロパティのタイプとしてのみ使用可能である。インラインタイプ値は、その一部であるエンティティとインラインで格納される。インラインタイプインスタンスはそれ自体のアイデンティティを持たないため、参照不可能である。これは、インラインタイプインスタンスを保持するエンティティプロパティを介して参照することができる。以下に、インラインタイプ定義の一例を示す。
エンティティタイプとインラインタイプはどちらも強力にタイプ付けされ、同様の構造を有するが、明確な持続性、共有、および操作セマンティクスを有する。インラインタイプインスタンスはそれだけでは存続せず、構造的にはエンティティタイプの一部である。インラインタイプインスタンスは共有不可能であり、各インスタンスの使用は排他的である。インラインタイプインスタンスは、コピー、移動、削除、バックアップ、復元などのほとんどの操作のターゲットではない。
上記のセマンティクスの相違により、アプリケーションが適切にプログラミングできるように、様々なインラインタイプおよびエンティティタイプの概念を提供することが重要である。SQL99では、インラインタイプおよびエンティティタイプの概念は明示的にモデル化されない。SQL99では、「ユーザ定義タイプ」が存在するだけである。あるタイプが列のタイプとして使用されるとインラインタイプのように動作し、これがテーブルの定義に使用されるとエンティティタイプ(行タイプ)として働く。キーはテーブルに関して定義されるため、タイプ付けされたテーブルの行のみがアイデンティティを有する。タイプはキーを持たないため、SQLでは、タイプインスタンスに関して推論する場合、キーを持ったタイプインスタンスおよびキーを持たないインスタンスに関して話さなければならない。
CDMでは、エンティティタイプおよびインラインタイプは、別々の構文仕様を備えた別々の概念として明示的にモデル化される。
データの並行性。データの並行性は、楽観的または悲観的のいずれかで管理することができる。どちらの場合も並行性管理の単位は、楽観的並行性における競合の検出または悲観的並行性におけるロックの、いずれかに関するエンティティである。データモデルは、異なる競合検出スキームが使用可能であることを許可し、データモデルインプリメンテーションがそれらにその柔軟性を与えた場合、これをデータモデルインプリメンテーションおよび開発者のポリシー決定とみなす(例えば、更新されるプロパティが何も変更されていない場合、インプリメンテーションは競合を無視することができる)。
悲観的並行性の場合、そのネストされたテーブルを除外する完全なエンティティでロックがかけられる。したがって、エンティティがロックで読み取られる場合、他のユーザがそのエンティティをロックしていれば読み取りは失敗することになる。しかしながら、子エンティティのみがロックされている場合、親の読み取りは成功することになる。データモデルは、異なるロッキングスキームの使用を可能にし、データモデルインプリメンテーションがそれらにその柔軟性を与えた場合、これをデータモデルインプリメンテーションおよび開発者のポリシー決定とみなす。
リレーションシップ。リレーションシップとは、2つまたはそれ以上のエンティティを関係付けることである。例えば、連絡先はドキュメントを著作する、またはOrderはOrderLineを含む。リレーションシップはアソシエーションまたは構成とすることができる。アソシエーションはエンティティ間の「ピアツーピア」リレーションシップを記述し、構成は2つのエンティティ間の親/子のリレーションシップを記述する。
リレーションシップ自体はタイプのインスタンスとしてストアに格納されないが、関係するエンティティ上のデータによって具体化される。アソシエーションの特定の使用法の1つが、エンティティタイプであるアソシエーションエンティティをリレーションシップを具体化するエンティティとして指定するものであり、オプションで、リレーションシップの一部として追加のデータを格納することができる。各アソシエーションには名前があり、その名前がエンティティ間のセマンティックなリレーションシップを指定する。例えば、DocAuthorは、ドキュメントと連絡先の間のリレーションシップの名前であり、DocAuthorアソシエーションは連絡先をドキュメントの著者として関係付け、同様に、OrderCustomerは顧客を注文に関連付けるアソシエーションであり、注文が与えられると、アソシエーションをナビゲートしてその顧客を決定させることができる。
アソシエーションおよび構成の概念は、UMLアソシエーションおよび構成の概念と一貫していることに留意されたい。エンティティ−リレーションシップの図表作成およびUML用語(例えば、ロール(Role)、多重度(multiplicity)など)は、可能な限り多数保持される。
リレーションシップの概念は、リレーショナルモデル内で明示的にサポートされない。外部および1次キーならびに参照整合性は、制限された方法でリレーションシップを実施するためのツールを提供する。SQL99は、単一および複数のエンティティ値プロパティをサポートするためにRefおよびTableタイプのようにオブジェクト−リレーショナル拡張子を追加したが、リレーションシップは正式にモデル化されていない。
CDMでは、SQL99の参照およびテーブルプロパティと、UMLのアソシエーションおよび構成の概念とを組み合わせる。この方法により、リッチなリレーションシップおよびナビゲーションがSQLに与えられ、UMLを使用してモデル化されたアプリケーションに照会可能性が与えられる。
アソシエーション。アソシエーションは、エンティティ間でのピアツーピアのリレーションシップを表す。これらは、参照タイプのプロパティまたは非参照タイプのプロパティの使用に基づくものとすることができる。また、特定の役割を果たすアソシエーションエンティティを含むこともできる。次に、それぞれについて説明する。
参照タイプのプロパティを使用するアソシエーション。以下のスキーマ例について考えてみる。
アソシエーションには2つのエンドがあり、そのそれぞれが関係エンティティを表す。各エンドは以下の両方を提供する。
・ ロール:ロールは、エンティティタイプのインスタンスがそのエンドで果たす役割または機能を記述する名前を、エンドポイントに付ける。これは、アソシエーションの他方のエンドにあるエンティティによって使用される名前である。CDMでは、ロール名は明示的に指定されなければならないが、しばしばエンドのエンティティタイプの名前となる。
・ タイプ:タイプは、エンドのエンティティタイプの名前を指定する。例えば、OrderCustomerアソシエーションでは、ロールCustomerRoleのエンドのタイプは、Customerタイプである。OrderRoleのタイプはOrderエンティティタイプである。タイプはエンティティタイプでなければならない(インラインタイプは不可である)。
・ 多重度:多重度は、アソシエーションエンドの正当な濃度(cardinality)値の範囲を指定する。リレーションシップエンドの濃度は、そのエンドでのリレーションシップに関与するエンティティインスタンスの実際の数である。OrderCustomerアソシエーションの例では、Orderは厳密に1人のCustomerからのものであり、それぞれのOrderはCustomerによって発注されなければならない。したがって、多重度は「1」である。この制約は、CustomerRoleエンドでMultiplicity=「1」としてキャプチャされる。他方で、Customerはこれに関連する無数の注文を有することができる。OrderRoleエンドでのMultiplicity=「*」は、こうした濃度制約をキャプチャする。
通常の多重度値は「0..1」(ゼロまたは1)、「1」(厳密に1)、「*」(ゼロまたはそれ以上)、および「1..*」(1または複数)である。より一般的には、多重度値は値「n」(厳密にn)または値の範囲「n..m」(nおよびmを含めてnからmの間、nはmよりも少ないかまたは等しい)を指定することができる。通常、アソシエーションの両エンドの多重度は、まとめて1:1(1対1)、1:*(1対多数)、*:1(多数対1)、および*:*(多数対多数)と表される。前述のOrderCustomerアソシエーションの例では、同じ顧客(同じCustRefプロパティ値を有する)にゼロまたはそれ以上の注文が存在可能である。参照整合性制約のセマンティクス制限は、エンドに適切に多重度を設定することによってモデル化可能であることに留意されたい。多重度の下限が1の場合、従来のセマンティクス制限が課される。すなわち、あらゆる注文に顧客が存在しなければならない。したがって、顧客がいなければ注文は作成不可能であり、同様に、顧客が発注した場合は顧客を削除できない。
・ テーブル:タイプのインスタンスを見つけることができるテーブルに制約を与える。これは、ターゲットエンティティタイプの定義でテーブルが直接指定されない限り、参照ベースのアソシエーションのターゲットに必要である。前述の例では、これは、Order上のCustomerが、SalesData.BadCustomersではなくSalesData.Customersテーブルにのみ見つけることができることを示す。Table=””の指定は、参照が正しいタイプの任意のテーブルにあるエンティティを参照できることを示す。
・ OnDelete:OnDelete属性は、そのエンドのエンティティが削除された場合に何をすべきかを指定する。この例では、許可される値はCascade、SetNull、またはRestrictとなる。この例では、以下のとおりである。
□ Cascadeが指定されたため、Customerエンティティが削除されると、Orderエンティティも削除される。
□ 他方で、SetNullが指定された場合、Customerエンティティが削除されると、OrderエンティティのCustRefプロパティはNullに設定されることになる。プロパティはnull可能である。
□ Restrictが指定された場合、Orderエンティティがこれに関連付けられると、Customerエンティティは削除できない。
<Reference>要素は、これが参照ベースのアソシエーションであることを示す。この要素は、FromRoleがアソシエーションをインプリメントする参照プロパティを含む役割であること、ToRoleが参照のターゲットの役割であること、およびPropertyが参照プロパティの名前であること、という情報を指定する。
OrderCustomerアソシエーションでは、OrderRoleエンドのCustRefプロパティは、CustomerRoleエンティティの識別子に関係し、CustRefプロパティは外部キーと同様に働く。
非参照タイプのプロパティを使用するアソシエーション。前述のOrderCustomerアソシエーションは、顧客のアイデンティティの注文エンティティタイプと顧客エンティティタイプを関係付ける。一般に、エンドの任意のプロパティで2つのエンティティタイプを関係付けることが可能である。例えば以下の、Document.AuthorプロパティがContact.Nameに関係付けられたDocumentAuthorアソシエーションについて考えてみる。Contact.Nameは一意ではないため、このアソシエーションはドキュメントに関して複数の連絡先を戻すことができる。
この例とCustomer/Order例との間の相違点の1つが、<Reference>要素を指定する代わりに、<Condition>要素内に論理式が提供されることである。<Condition>は任意の複雑さの式を含むことが可能であるため、これは非常に柔軟な形のアソシエーションである。実際に、アプリケーションでの結合を照会およびプログラミングモデルの最上(first)クラス部分として追加することによって、再使用しやすくしている。
2つのプロパティ間で単純な等価のみが必要な場合、単純化された構文がサポートされる。このような場合、<Condition>要素の代わりに<CommonValue>要素を使用することができる。以下の例は、前の例と同じ意味を持つ(以下で説明するOnUpdate動作は除く)。
プロパティは明示的にリストされ、常に同じ値を有するため、1つの追加機能、OnUpdate属性が使用可能である。この属性の可能な値は、Cascade、SetNull、またはRestrictである。この例では、「Cascade」の属性値は、ContactRoleエンドのプロパティが更新された場合、この値が他方のエンドのプロパティに伝搬され、OnUpdate=「Restrict」の場合、他方のエンドに関連付けられたエンティティがあればこのプロパティは変更不可能であり、OnUpdate=「SetNull」の場合、このエンドのプロパティが更新されれば他方のエンドのプロパティはnullに設定される。
アソシエーションエンティティ。プロパティをリレーションシップに関連付けるのが一般的である。例えば、通常、組織と人物との間の雇用関係は、EmploymentPeriodなどのプロパティを伴う。OrganizationまたはPersonタイプのプロパティ部分は作成可能であるが、プロパティはリレーションシップなしでは何の意味もなさない。例えば、OrganizationのEmploymentPeriodプロパティは雇用された人物も存在していない限り無意味であり、同様に、このプロパティはPersonエンティティでは無意味である。
CDMでは、エンティティ(エンティティタイプインスタンス)のみが持続する。エンティティ(実際にはエンティティのテーブル)のみが照会可能である。アソシエーションおよび構成はメタデータとして格納される。したがって、アソシエーションのプロパティはエンティティに格納しなければならない。こうしたエンティティがアソシエーションエンティティである。これは、UMLでのアソシエーションクラスと同じ役割を果たす。アソシエーションエンティティタイプはリレーショナルシステムにおける中間(リンクまたは結合)テーブルと同様であり、エンティティへの参照(外部キー)によってリンクされている。アソシエーションエンティティのキーは、一般に、関係するエンティティへの参照を含む。例えば以下の例を考えてみる。
PSLinkは、製品と供給業者とをリンクしているエンティティタイプである。PSLinkは、2つの参照プロパティ、ProductRefとSupplierRefとを指定することによって、ProductタイプおよびSupplierタイプをそれぞれProductタイプおよびSupplierタイプに関係付ける。製品と供給業者とを関係付けることに加えて、リレーションシップに有意なプロパティ、PriceおよびQuantityを有する。
Product、Supplier、およびPSLinkの間で可能なアソシエーションは、PSLinkとProduct、PSLinkとSupplier、およびProductとSupplierの間である。これらのアソシエーションは、以下のように明示的に定義することができる。
上記の例では、PSLinkがアソシエーションエンティティであるという事実が明白でないため、アソシエーションの定義では使用できない。スキーマ設計者はすべての必要なアソシエーション定義を長々と定義しなければならない。しかしながらこれは、明示的アソシエーションエンティティの概念をアソシエーション定義の一部として導入することで避けられる。前述の例は、PSLinkをアソシエーションエンティティとして指定することで以下のように書き換えられる。
この例に関して、以下の面に留意されたい。
・ これは、アソシエーションエンティティが明示的に呼び出されない場合は推論不可能なタイプに関する情報を提供するものであるため、他の宣言の単なる短縮形ではない。
・ PSLinkの<EntityType>定義のAssociation属性は、このタイプをアソシエーションエンティティとして識別し、このタイプを使用するアソシエーションを識別する。
・ ProductRefおよびSupplierRefのプロパティ要素のRole属性は、これらのプロパティを使用するアソシエーション内の役割を識別する。
・ AssociationEntityの内部にネストされたEnd要素は、アソシエーションエンティティ自体の果たす役割に名前を与える。多くの場合、アソシエーションエンティティは多重アソシエーションの単なるエンドポイントであるが、その他の場合には、アソシエーションにおいて特別な機能を果たす。
・ <Reference>要素は、アソシエーションエンティティがProductおよびSupplierエンティティにどのように関連付けるかを記述する。これらはアソシエーション全体に従属するものであるため、ネストされる。
・ End要素のOnDelete属性は、どちらかのエンドが削除された場合、アソシエーションエンティティも、したがってリレーションシップも、削除されることを示す。しかしながら、一方のエンドを削除しても、他方のエンドを削除することにはならない(すなわち、供給業者を削除しても、供給される製品を削除することにはならない)。この属性の他の可能な値は、すべてのエンド(アソシエーションエンティティを含む)を削除することになるCascade、アソシエーションエンティティの参照プロパティをnullに設定することになるSetNull、または、PSLinkインスタンスが存在する限り削除が失敗することになるRestrictである。
アソシエーションエンティティは、非参照タイププロパティを使用するアソシエーションでも使用することができる。詳細については、本明細書で後述するアソシエーションの完全な説明を参照されたい。
アソシエーションのスコーピング。アソシエーションをスコーピングすることで、アソシエーションの両エンドのエンティティが同じエンティティインスタンスの子であることを指定する。アソシエーションは、両方のエンドを含むエンティティタイプの名前をScope属性に配置することによってスコーピングされる。エンドのTable属性は、そのタイプで始まらなくてはならない。CasがEngine、Wheels、およびDriveTrainを有する、以下の例について考えてみる。
EngineおよびWheelsはDriveTrainによって接続される。
上記の例は、DriveTrainが同じCarからのEngineおよびWheelsを接続することを示す。1つのCarからのEngineを別のCarからのWheelsに取り付けることは不当である。<End>要素上の任意のTable属性はスコーピングエンティティで始まらなければならない。<End>要素は、Scoped=「false」属性を追加することによって、スコーピングがこれに適用されないことを示すことができる。
構成。構成は、2つのエンティティ間の構成上のリレーションシップを定義するモデリング概念である。ここでもOrder例について考えてみると、LinesプロパティおよびOrderLinesリレーションシップは、OrderエンティティタイプとLineエンティティタイプとの間の構成を定義する。OrderタイプとLineタイプとの間には構造的なリレーションシップが存在し、ラインは注文の一部である(または注文内で構成される)。ラインエンティティは単一の注文エンティティに属し、ラインエンティティは排他的に注文の一部であり、注文およびそのラインが操作ユニットを形成する。
これに対して、上記の例でOrderおよびCustomerは独立したエンティティである。OrdersテーブルおよびCustomersテーブルは互いに独立している。OrderCustomerアソシエーションは、注文と顧客とを関係付ける。アソシエーションでOnDelete=Cascadeが指定されない限り、注文および顧客の持続時間は互いに独立している。OnDelete=Cascadeは、顧客が削除された場合、顧客に関連付けられた注文を削除する必要がある旨の動作上の制約を追加する。しかしながら、注文と顧客のエンティティタイプの間には構造的なリレーションシップは存在しない。例えば、顧客エンティティをフェッチしてもいずれの注文にもアクセスせず、その逆もまた同様である。加えて、Orderは他の、しかし同様のSupplierとのアソシエーションに関与することが可能であり、すなわちOrder上のSupplierRefプロパティおよびOrderSupplierアソシエーションが存在する。このアソシエーションは、OnDelete=「Cascade」も指定可能であり、これはOrderの持続時間が、注文を出した顧客または注文を供給する供給業者のいずれかによって制御されることを意味する。しかしながら、OrderおよびCustomerまたはOrderおよびSupplierは、コピー、移動、バックアップ、復元などの操作用の操作ユニットは構成しない。
構成がアソシエーション概念をさらに特殊化したものであることは確かであるが、これは、特に構造上および操作上の観点から見た基本的な概念である。OrderとLinesとの間のリレーションシップは、OrderとCustomerとの間のものとはかなり異なる。したがってCDMでは、構成は明確なトップレベルの概念である。
構成およびアソシエーションエンティティ。アソシエーションエンティティの1つの特定の使用法は、アソシエーションエンティティ自体を関連付けられたエンティティの1つに組み込むことである。以下の例について考えてみる。
ここでは、Linkエンティティタイプのネストされたテーブルを含むエンティティタイプ、Item(商品)が使用されている。Linkタイプそれ自体は、2つの関係するエンティティ(この場合は2つの商品)の間に位置するアソシエーションエンティティであり、リレーションシップ特有のプロパティを含む。構成がItemとLinkを関係付けることであるという事実が、モデル化されているリレーションシップが2つのItemの間にあるという事実を変えることはない。
ナビゲーション。モデリングリレーションシップの特典の1つが、リレーションシップ定義を使用して1つのエンティティから関係するエンティティへナビゲートする機能であることは明白である。こうしたナビゲーションは、CDMに対する照会を介して、またはエンティティタイプおよびリレーションシップの定義から生成されたAPIクラスを使用することによって、サポートすることができる。OrderCustomerの例で、注文エンティティが与えられた場合、CustRefプロパティおよびアソシエーション定義を使用してその顧客にナビゲートすることができる。アソシエーション定義は、顧客からその注文へのナビゲートにも使用することができる。アソシエーションメタデータを使用して、顧客から注文へとトラバースするために結合ベースの照会を生成することができる。同様に、DocumentAuthorアソシエーションを使用して、ドキュメントから連絡先へのナビゲーションを生成することが可能であり、その逆も同様である。
CDMでは、リレーションシップ定義を使用してアソシエーションベースのナビゲーションプロパティを事前に定義することが可能である。こうしたナビゲーションプロパティの一例を以下に示す。
Customerエンティティ内のNavigationProperty要素は、顧客から顧客に関連付けられた注文へのナビゲーションパスを指定する。このプロパティは、照会およびプログラミングモデルの中で、Orderエンティティへの参照の仮想上の(具体化されていない)および照会可能な読み取り専用の集まりとして表すことができる。
以下に、CDMスキーマ言語について説明する。すべてのエンティティ、リレーションシップ、およびテーブルセットの定義は、スキーマとの関連において生じる。スキーマは、スキーマ内に定義されたものの名前をスコーピングするネームスペースを定義する。<Schema>要素は、スキーマドキュメントのルート要素である。<Schema>要素は以下の属性を持つことができる。
・ Namespace(ネームスペース)−−必須。スキーマ用の一意のネームスペース。ネームスペースは、ネームスペース名に関するCLR規則に準拠する。加えて、CLRネームスペースに関して定義されたネームスペースの命名ガイドラインにも従うものとする。これらの規約に従うことによって、ネームスペース名を選択する場合に一意性が十分に保証される。
例えば以下のとおりである。
スキーマは、完全修飾タイプ名(namespace−name.type−name)を使用して異なるスキーマで定義されたタイプを参照することができる。例えば以下のとおりである。
スキーマは、外部スキーマに定義されたタイプ名をスコープに入れるために<Using>要素を含めることができる。<Using>要素は以下の属性を有することができる。
・ Namespace(ネームスペース)−−必須。コンテンツがスコープに入れられるスキーマのネームスペース。
・ Alias(別名)−−オプション。ネームスペースの代替として使用可能な名前。
例えば以下のとおりである。
命名規則。すべてのタイプ、リレーションシップ、およびテーブルセットの名前は、タイプ名に関するCLR規則に準拠しなければならない。名前は.NetFrameworkタイプ命名ガイドラインにも準拠するものとする。タイプおよびリレーションシップの名前は一意であるものとする。すなわち、タイプおよびリレーションシップが同じ完全修飾名を持つことは不可能であり、2つのタイプまたは2つのリレーションシップが同じ完全修飾名を持つことは不可能である。すべてのテーブルセット名は一意である(2つのテーブルセットが同じ完全修飾名を持つことは不可能である)ものとするが、テーブルセットがタイプまたはリレーションシップと同じ名前を持つことは可能である。
単純タイプ。単純タイプとは、データモデル内に可視の内部構造を持たない単一の値を表すものである。CLR値タイプは、CDMで単純タイプとして使用される。CLRのSystem、System.Storage、およびSystem.Data.SqlTypesネームスペースで定義されるいくつかの値タイプは、本来、データモデルで使用するためにサポートされる。これらのタイプは以下のとおりである。
要件セットを満たす任意の値タイプは、データモデル内で単純タイプとしても使用できるものとする。こうしたタイプが満たす必要のある条件は、照会内に格納して直接使用できるようにすること(UDTなど)、またはCLR属性を介してストレージおよび照会のマッピングを提供するために必要なメタデータを提供することである。
単純タイプの制約。以下で定義された制約要素のうちの1つを使用して、単純タイプの値を制約することが可能である。これらの要素を、単純タイプを参照する様々な要素内にネストすることができる(例えば、<EntityType>または<InlineType>要素内の<Property>要素)。
長さ。<Length>制約要素をSystem.String、System.Storage.ByCollection、およびSystem.Data.SqlTypes.Stringのタイプに適用して、値の長さを制約することができる。この要素は以下の属性を含むことができる。
・ Minimum−−値の最小長さ。デフォルト値はゼロである。
・ Maximum−−値の最大長さ。値「unbounded」は、指定された最大長さが存在しないことを示す。デフォルト値は「unbounded」である。
基本タイプに指定された制約に適合するためには、Minimumに指定された値が以前の値に等しいかまたはこれより大きくなければならず、Maximumに指定された値が以前の値に等しいかまたはこれより小さくなければならない。
10進数。<Decimal>制約要素をSystem.DecimalおよびSystem.SqlDecimalのタイプに適用して、受け入れ可能な値の精度およびスケールを制約することができる。この要素はPrecisionおよびScale属性を含むことができる。
デフォルト。<Default>制約要素を任意の単純タイプに適用して、プロパティに使用するデフォルト値を指定することができる。この要素は、以下の属性を有することができる。Value−−必須。プロパティのデフォルト値。この属性の値はプロパティタイプの値に変換可能でなければならない。<Default>要素は実際には制約を指定しないことに留意されたい。基本タイプで指定された値に任意の値を適合させることができる。
チェック。<Check>制約要素はブール照会式を含むことができる。有効にすべきプロパティ値について、この式が真であることを評価しなければならない。この式は、いかなる副次作用も有してはならない。チェック制約が基本タイプおよび派生タイプの両方に指定された場合、どちらの制約も妥当性が検査される。
列挙タイプ。列挙タイプは、一意の値を表す名前のセットを定義する。基礎となる値のタイプはCDMでは可視であり、格納された値それ自体は不可視である。顧客のストレージマッピングが使用される場合、基礎となるタイプはこのマッピングによって定義される。禁止的(proscriptive)ストレージの場合、基礎となるタイプは自動的に選択されるか、またはストレージ特有のヒントを介して提供することができる。列挙タイプは<EnumerationType>要素を使用して宣言される。この要素は以下の属性を有することができる。
・ Name−−必須。列挙タイプの名前。
・ Extensible−−オプション。値「true」は、<EnumerationExtension>要素を使用して列挙タイプが拡張可能であることを示す(以下を参照)。値「false」は、拡張が使用できないことを示す。デフォルト値は「false」である。
<EnumerationType>要素はゼロまたはそれ以上の<EnumerationMember>要素を含むことができる。これらの要素は以下の属性を有することができる。
・ Name−−必須。特定の列挙値を表すために使用される。この名前は宣言<EnumerationType>要素内で一意でなければならない。列挙メンバを参照する場合、この名前は常に列挙のタイプ名によって修飾される。
・ AliasesMember−−オプション。他の列挙メンバの名前を含む。この列挙メンバが命名されたメンバの別名であることを示す(どちらの名前も同じ値を表す)。
列挙の一例を以下に定義する。
「bit flag」スタイルの列挙は列挙タイプを使用して記述できないことに留意されたい。代わりに列挙タイプのアレイを使用することが必要である。
拡張可能な列挙。<EnumerationType>要素がExtensible=「true」を指定する場合、追加の値を使用して列挙を拡張することができる。列挙タイプのプロパティは、<EnumerationType>内またはそのタイプの任意の拡張内に指定された値のいずれかを含むことができる。
各拡張に定義された値は、基本列挙タイプおよびすべての他の拡張内に定義された値とは異なる。これにより、複数の開発者が競合の可能性なしに列挙タイプを独立に拡張することができる。
列挙拡張タイプは<EnumerationExtensionType>要素を使用して定義される。この要素は以下の属性を有することができる。
・ Name−−必須。列挙拡張タイプの名前。
・ ExtendsType−−必須。拡張される列挙タイプの名前。
<EnumerationExtensionType>要素は、ゼロまたはそれ以上の<EnumerationMember>要素を含むことができる。これらの要素は以下の属性を有することができる。
・ Name−−必須。特定の列挙値を表す際に使用される名前。この名前は宣言<EnumerationExtensionType>要素内で一意でなければならない。
しかしながらこの名前は、拡張された列挙タイプ内の名前と重複する場合がある。こうした場合、拡張内で定義された値と拡張された列挙内で定義された値とは依然として異なる。
列挙メンバを参照する場合、この名前は列挙拡張のタイプ名によって常に修飾される。
・ AliasesMember−−オプション。この拡張、同じ列挙タイプへの他の拡張、または拡張された列挙タイプそれ自体、のいずれかに、他の列挙メンバのフルネーム(enumeration−type−name.enumeration−member−name)を含む。この列挙メンバは命名されたメンバの別名であることを示す(例えば、どちらの名前も同じ値を表す)。
列挙の例を以下に定義する。
<!−−
列挙タイプCと拡張タイプDおよびEとの組合せは、タイプCのプロパティに格納可能な別個の値、C.P、C.Q、D.Q、D.S、E.T、およびE.Uを定義する。列挙メンバC.R、D.T、およびE.UはすべてC.Qの別名であるため、一意の値を表さない。
−−>
アレイタイプ。アレイタイプのインスタンスは、指定された単純、インライン、列挙、エンティティ参照、またはテーブル参照のタイプの複数のインスタンスを格納することができる(アレイのアレイは許可されない)。これらのインスタンスはアレイの要素である。要素の順序は保存され、アプリケーションによって明示的に維持することができる。アプリケーションは要素をアレイに挿入すること、および要素をアレイから削除することができる。アレイタイプは以下の構文を使用して指定される。
ここでelement−typeは要素のタイプの名前である。
アレイタイプの制約。以下で定義した制約要素のうちの1つを使用して、アレイタイプの値を制約することができる。これらの要素を、アレイタイプを参照する様々な要素の内部にネストすることができる(例えば、<EntityType>または<InlineType>要素内の<Property>要素)。
要素の制約。<ElementConstraint>制約要素を使用して、アレイ内の要素に制約を与えることができる。要素タイプに対して有効な制約要素は、<ElementConstraint>要素内部に指定することができる。
発生数(Occurs)。<Occurs>制約要素を使用して、アレイ内の要素の数を制約することができる。この要素は以下の属性を有することができる。
・ Minimum−−オプション。アレイ内のエントリの最小数を指定する。デフォルト値はゼロ。
・ Maximum−−オプション。アレイ内のエントリの最大数を指定する。値「unbounded」は、制約が存在しないことを示す。デフォルト値は「unbounded」である。
基本タイプに指定された制約に適合するためには、Minimumに指定された値が以前の値に等しいかまたはこれより大きくなければならず、Maximumに指定された値が以前の値に等しいかまたはこれより小さくなければならない。
一意。<Unique>制約要素を使用して、一意の値をアレイ内に含めなければならない要素タイプのプロパティを指定することができる。この要素は以下の属性を有することができる。Properties−−必須。コンマで区切られた要素プロパティ名のリスト。
チェック。<Check>制約要素はブール照会式を含むことができる。プロパティ値を有効にする場合、この式が真であることを評価しなければならない。この式は、いかなる副次作用も有してはならない。チェック制約が基本タイプおよび派生タイプの両方に指定された場合、どちらの制約も妥当性が検査される。アレイプロパティのチェック制約は、プロパティ全体に適用されることに留意されたい。例えばこれを使用して、要素プロパティの合計が何らかの制限よりも少ないことをチェックすることができる。代替の方法として、<ElementConstraint>要素内部に配置されたチェック制約は、各値に個別に適用されることになる。
テーブルタイプ。テーブルタイプのインスタンスは、指定されたエンティティタイプの順序付けされていないインスタンスの集まりを格納することができる。指定されたエンティティタイプ、またはその基本タイプ階層内のタイプは、キープロパティを指定しなければならない。これは、必ずしもエンティティタイプを抽象タイプとすることができないことを意味するものでないことに留意されたい。ネストされたテーブルに格納されたエンティティタイプのキープロパティは、いずれのテーブルインスタンスにおいても一意でなければならない。テーブルは、指定されたタイプまたはそのタイプから派生したタイプのいずれのエンティティも保持することができる。アプリケーションはエンティティをテーブルに挿入すること、およびエンティティをテーブルから除去することができる。テーブルタイプは以下の構文を使用して指定される。
エンティティタイプ(およびエンティティタイプのみ)は、テーブルタイプのプロパティを定義することができる。こうしたプロパティは、ネストされたテーブルを表す。ネストされたテーブルは、収容エンティティのインスタンスに依存する格納場所を定義する。ネストされたテーブルに格納されたエンティティは、収容エンティティによって定義されたデータのまとまりのある(cohesive)単位の一部とみなされる(例えば、収容エンティティが削除された場合に削除される)。しかしながら、コンテナおよび含まれるエンティティに対する変更に関する整合性の保証はなく、トランザクションを使用するアプリケーションを介して明示的に管理されるものと思われる。再帰的テーブルを定義するのは誤りである。すなわちエンティティは、そのタイプ、そのスーパータイプ、またはそのサブタイプのテーブルを定義できず、そのタイプのテーブルを有する何らかの他のエンティティタイプのテーブルを宣言することもできない。テーブルタイププロパティは、2つのエンティティ(プロパティを備えた親エンティティと、テーブルに含まれる子エンティティ)間の構成リレーションシップを定義する。
エンティティ参照タイプ。参照タイプのインスタンスは、指定されたタイプのエンティティへの参照を格納する。参照は、エンティティおよびエンティティのキープロパティ値を含むテーブルへの参照を封入する。参照を、参照のターゲットであるエンティティに解決することができる。参照タイプは以下の構文を使用して指定される。
エンティティおよびインラインのタイプは、参照タイプのプロパティを定義することができる。参照タイププロパティは、2つのエンティティ(プロパティを備えたソースエンティティと、プロパティによって参照されるターゲットエンティティ)間のアソシエーションリレーションシップを定義する。
テーブル参照タイプ。テーブル参照タイプのインスタンスは、テーブルへの参照を格納する。ターゲットテーブルは、テーブルセットまたはネストされたテーブル内の「トップレベル」とすることができる。参照は、参照のターゲットであるテーブルに解決することができる。テーブル参照タイプは以下の構文を使用して指定される。
エンティティおよびインラインのタイプは、参照タイプのプロパティを定義することができる。
プロパティ。プロパティは、ストレージを割り振るためにエンティティおよびインラインのタイプ内で使用される。プロパティは、<Property>要素を使用して定義される。上記で定義された一般的なメンバ要素に加えて、この要素は以下の属性を有することができる。
・ Name−−必須。メンバの名前。この名前は定義タイプの範囲内で一意でなければならない。この名前はクラスメンバ名に関するCLR規則に従わなければならず、.NetFramework命名ガイドラインにも従うものとする。
・ DuplicateName−−オプション。メンバ名は、DuplicateName属性が提供され、値「true」を有していない限り、基本タイプ階層全体にわたっても一意でなければならない。デフォルトの値「false」は、メンバ名が一意であると予測されることを示す。
この属性の役割は、a)メンバ名が基本タイプ内のプロパティと重複している事実をドキュメント化すること、およびb)スキーマ設計者に名前を重複させることを意図的に選択させることである(すなわち、C#での新規キーワードと同じ役割を果たす)。
・ Type−−必須。プロパティのタイプ。これは任意の単純、インライン、アレイ、エンティティ参照、またはテーブル参照のタイプとすることができる。エンティティ内で定義されるプロパティにはテーブルタイプも使用可能である。
・ Nullable−−アレイおよびネストされたテーブルを除くすべてのタイプのプロパティに必須であり、アレイおよびネストされたテーブルタイプを備えるプロパティには使用できない。値「true」は、プロパティがnull値を格納できることを意味する。値「false」は、プロパティがnull値を格納できないことを意味する。
・ Association−−プロパティタイプが参照または参照のアレイタイプの場合は必須。このプロパティが関与するアソシエーションの名前を指定する。詳細は「アソシエーション」の項を参照のこと。
・ Composition−−プロパティタイプがテーブルタイプの場合は必須。このプロパティが関与しているアソシエーションまたは構成の名前を指定する。詳細は「構成」の項を参照のこと。
・ Role−−このプロパティが関与しているアソシエーションの役割を指定する。この属性が必須の場合の説明は、「アソシエーション」に関する項を参照のこと。
いくつかのプロパティ定義の例を以下に示す。
プロパティの制約。プロパティに格納できる値は、<Property>要素内部の制約要素を使用して制約することができる。使用可能な制約要素のセットはプロパティのタイプに依存し、各タイプが検討されたように定義される。加えて、<PropertyConstraint>要素内部に制約要素を配置することによって、派生タイプ内でプロパティをさらに制約することができる。この要素は以下の属性を有することができる。
・ Property−−必須。制約されたプロパティの名前。重複するプロパティ名が存在する場合、この名前はタイプ名を使用して修飾することができる。名前が重複し修飾されていない場合、最大派生タイプにあるプロパティが想定される。
・ Type−−オプション。プロパティが制約されるタイプ。プロパティのオリジナルタイプがArray(T)、Table(T)、Ref(T)、またはTableRef(T)であった場合にのみ、タイプを指定することができる。こうした場合、新しいタイプはそれぞれArray(S)、Table(S)、Ref(S)、またはTableRef(S)でなければならず、SはTのサブタイプでなければならない。
<PropertyConstraint>要素を使用する場合、指定された制約が基本タイプで定義されたいずれの制約にも適合することが必要である。各制約要素の記述には、どのような適合を伴うかの定義が含まれる。いくつかの単純な例を以下に示す。
制約ターゲットタイプ。参照プロパティを有するタイプからタイプを派生させる場合、指定可能なエンティティのタイプをさらに制約することができる。これは、<PropertyConstraint>要素の内部にある要素を使用し、本明細書に記載されたType属性の値を指定することで実行される。例えば以下のとおりである。
算出プロパティ。算出プロパティは、格納された値ではなく算出される値を表すために、エンティティおよびインラインタイプで使用される。プロパティの値を算出する際に使用されるアルゴリズムは、データモデルの一部とはみなされない。プロパティは、データモデルの一部として照会を戻すように記述することができる。算出プロパティは、<ComputedProperty>要素を使用して宣言される。上記で定義された一般的なメンバ属性に加えて、この要素は以下の属性を有することができる。
・ ReadOnly−−オプション。プロパティが読み取り専用であるかどうかを示す。デフォルト値は、プロパティが読み取り専用であり更新には使用できないことを意味する「true」である。
・ Static−−オプション。プロパティが静的またはインスタンスプロパティであるかどうかを示す。デフォルト値は、これがインスタンスプロパティであることを示す「false」である。
以下の例は、タイプ「Int32」の「X」と命名された算出プロパティを宣言する。
算出プロパティの制約。プロパティに格納可能な値は、<ComputedProperty>要素内部の制約要素を使用して制約することができる。使用可能な制約要素のセットはプロパティのタイプに依存し、各タイプが検討されたように定義される。一実装では、<PropertyConstraint>要素が算出プロパティでも働く。
メソッド。メソッドは実行可能なオペレーションを表すためにインラインおよびエンティティタイプで使用される。メソッドをインプリメントするために使用されるアルゴリズムは、データモデルの一部とはみなされない。一実装では、メソッドは、入力として照会を利用し、データモデルの一部としての出力として照会を戻す。アソシエーションは、本来こうしたメソッドを定義する。メソッドは<Method>要素を使用して宣言される。この要素は以下の属性を有することができる。
・ Name−−必須。メンバの名前。この名前は定義タイプの範囲内で一意でなければならない。名前は、クラスメンバ名に関するCLR規則に従わなければならず、.NetFramework命名ガイドラインに従うものとする。
・ DuplicateName−−オプション。メンバ名は、DuplicateName属性が提供され、値「true」を有していない限り、基本タイプ階層全体にわたっても一意でなければならない。デフォルトの値「false」は、メンバ名が一意であると予測されることを示す。
この属性の役割は、a)メンバ名が基本タイプ内のプロパティと重複している事実をドキュメント化すること、およびb)スキーマ設計者に名前を重複させることを意図的に選択させることである(すなわち、C#での新規キーワードと同じ役割を果たす)。
・ ReturnType−−必須。メソッドによって戻される値のタイプ。これは単純、インライン、アレイ、エンティティ参照、テーブル参照、またはテーブルタイプとすることが可能であるか、あるいは何の値も戻されないことを示す空の文字列とすることができる。
・ Static−−オプション。メソッドが静的またはインスタンスメソッドであるかどうかを示す。デフォルト値は、これがインスタンスメソッドであることを示す「false」である。
・ Association−−戻りタイプが参照または参照のアレイタイプの場合は必須。このメソッドが関与するアソシエーションの名前を指定する。詳細は「アソシエーション」の項を参照のこと。
・ Composition−−戻りタイプがテーブルタイプの場合は必須。このメソッドが関与しているアソシエーションまたは構成の名前を指定する。詳細は「構成」の項を参照のこと。
・ Role−−このメソッドが関与しているアソシエーションの役割を指定する。この属性が必須の場合の説明は、「アソシエーション」に関する項を参照のこと。
<ReturnTypeConstraints>要素を<Method>要素内部にネストすることができる。メソッドの戻りタイプに適用される制約要素を、<ReturnTypeConstraints>要素内部にネストすることができる。<Method>要素はゼロまたはそれ以上の<Parameter>要素をネストして、メソッドによって受け入れられたパラメータを指定することができる。<Parameter>要素は以下の属性を有することができる。
・ Name−−必須。パラメータの名前。
・ Type−−必須。パラメータのタイプ。
・ Out−−オプション。これが出力パラメータの場合は「true」の値、あるいはこれが入力パラメータの場合はデフォルト値の「false」。
パラメータのタイプに適用される制約要素を<Parameter>要素内部にネストすることができる。以下の例は、タイプ「Int32」の「X」と命名された算出プロパティと、タイプ「Int32」の「a」と命名されたパラメータを備えた「Y」と命名されたメソッドとを宣言し、タイプ「Int32」の値を戻す。
インラインタイプ。インラインタイプのインスタンスは、唯一のエンティティインスタンスの構成要素としてのみ持続可能である。インラインタイプのインスタンスは明示的アイデンティティを持たない(アイデンティティは、その収容エンティティの内部にそれがどのように配置されているかが暗黙的である)。インラインタイプのインスタンスは、収容エンティティによって定義されたデータのまとまりのある単位の一部とみなされる(例えば、収容エンティティが削除された場合に削除される)。いかなる明示的なアプリケーションの動作もなしに、エンティティの一部であるすべてのインラインデータに渡って整合性が維持されることになる保証もある。これは、WinFSの変更ユニットおよび同期化などの機能が整合性を介してより精密な制御をスキーマ設計者に提供するのを妨げるものでないことに留意されたい。
スキーマ設計者は、プロパティのセットからなる構造で新しいインラインタイプを定義することができる。こうしたインラインタイプは、単一の基本インラインタイプから派生させることができる。こうしたタイプは、<Schema>要素内部の<InlineType>要素を使用して定義される(ネストされたインラインタイプは使用できない)。<InlineType>要素は以下の属性を有することができる。
・ Name−−必須。タイプの名前を指定する。
・ BaseType−−オプション。このタイプによってサブタイプ化されたインラインタイプを定義する。基本タイプが指定されない場合、プロパティを定義しない匿名抽象基本タイプが想定される。
・ Abstract−−オプション。タイプが抽象の場合は「true」、具象の場合は「false」。非抽象タイプのインスタンスのみが作成可能である。デフォルト値は「false」である。
・ Sealed−−オプション。タイプが封止(seal)される場合は「true」、されない場合は「false」、または定義スキーマの外部での使用に限って封止される場合は「external」。デフォルト値は「false」である。
・ FriendSchemas−−オプション。定義タイプの「friends」とみなされるスキーマネームスペースのコンマで区切られたリスト。これらのスキーマは、Sealed=「external」属性値によってインポーズされた制限を対象としない(ただし、制限Sealed=「true」は対象とする)。
以下に、インラインタイプ定義のいくつかの例を示す。
図10は、上記いくつかのインラインタイプのUML表現1100を示す図である。
インラインタイプの制約。インラインタイプのインスタンスは、以下の制約要素を使用して制約することができる。これらの要素は、インラインタイプを参照する様々な要素の中にネストすることができる(例えば、<EntityType>または<InlineType>要素内の<Property>要素)。
チェック。<Check>制約要素はブール照会式を含むことができる。プロパティ値を有効にする場合、この式が真であることを評価する。この式は、いかなる副次作用も有さないものとする。チェック制約が基本タイプおよび派生タイプの両方に指定された場合、どちらの制約も妥当性が検査される。
エンティティタイプ。エンティティタイプはデータのまとまりのある単位を定義する。エンティティタイプのインスタンスは、唯一のテーブルで持続可能である。エンティティタイプのインスタンスは明示的アイデンティティを有する。参照タイプを使用して、エンティティタイプインスタンスへの永続的な参照を格納することが可能である。
スキーマ設計者は、プロパティのセットからなる構造で新しいエンティティタイプを定義することができる。エンティティタイプは、単一の基本エンティティタイプから派生させることができる。こうしたタイプは、<Schema>要素内部の<EntityType>要素を使用して定義される(ネストされたエンティティタイプは使用できない)。<EntityType>要素は以下の属性を有することができる。
・ Name−−必須。タイプの名前を指定する。この名前は、格納スキーマ内で定義されたすべてのタイプ名(インラインおよびエンティティの両方のタイプ名)の中で一意でなければならない。
・ BaseType−−オプション。このタイプによってサブタイプ化されたエンティティタイプを定義する。基本タイプが指定されない場合、プロパティを定義しない匿名抽象基本タイプが想定される。
・ Abstract−−オプション。タイプが抽象の場合は「true」、具象の場合は「false」。非抽象タイプのインスタンスのみが作成可能である。デフォルト値は「false」である。
・ Sealed−−オプション。タイプが封止される場合は「true」、されない場合は「false」、または定義スキーマの外部での使用に限って封止される場合は「external」。デフォルト値は「false」である。
・ FriendSchemas−−オプション。定義タイプの「friends」とみなされるスキーマネームスペースのコンマで区切られたリスト。これらのスキーマは、Internal=「true」またはSealed=「external」によってインポーズされた制限を対象としない(ただし、制限Sealed=「true」は対象とする)。
・ Table−−オプション。構文entity−type−name.table−property−nameを使用して、このエンティティタイプを含むであろう唯一のテーブルまたはネストされたテーブルの名前を指定する。デフォルトは、テーブルの任意の番号がそのエンティティタイプのインスタンスを含むように定義されることができるといったものである。
・ Extensible−−オプション。デフォルトの値「true」は、以下で説明するように、エンティティが<EntityExtensionType>要素を使用して拡張可能であることを示す。値「false」は、エンティティ拡張できないことを示す。
・ Association−−エンティティがアソシエーション定義においてアソシエーションエンティティの役割を有する場合、この属性は必須であり、アソシエーションの名前を指定しなければならない。そうでない場合、この属性は存在できない。
・ Key−−エンティティタイプまたは基本タイプで定義されたプロパティの1つまたは複数の名前のコンマで区切られたリスト。エンティティタイプ階層内で1つのタイプのみがKey属性を指定することができる。そのタイプの基本タイプ階層内のすべてのタイプは抽象タイプでなければならない。指定されたプロパティはそのタイプまたはその基本タイプから取得することができる。指定されたプロパティはエンティティのアイデンティティの一部を確立する。アイデンティティの残りの部分は、エンティティの親から暗黙的に取得される(例えば、子エンティティが常駐するテーブルプロパティを定義するエンティティインスタンス)。アレイを除くインラインnull不可タイプを備えたプロパティのみが、キープロパティとして指定可能である。プロパティがユーザ定義インラインタイプである場合、このタイプのすべてのプロパティはキープロパティとみなされ、すべては単一の値かつnull不可でなければならない。ネストされたプロパティ(複合タイプの1プロパティのプロパティ群)もキープロパティとして指定することができる。
いくつかのエンティティタイプ定義の例は次のとおりである。
図11は、前述のいくつかのエンティティタイプ1100のUML表現を示す図である。
エンティティタイプの制約。エンティティタイプのインスタンスは、以下の制約要素を使用して制約することができる。これらの要素は、エンティティタイプを参照する様々な要素の内部にネストすることができる(例えば、<EntityType>要素内の<Property>要素)。
チェック。<Check>制約要素はブール照会式を含むことができる。プロパティ値を有効にする場合、この式が真であることを評価する。この式は、いかなる副次作用も有さないものとする。チェック制約が基本タイプおよび派生タイプの両方に指定された場合、どちらの制約も妥当性が検査される。
エンティティ拡張タイプ。WinFSおよびMBFシナリオに対処するためには、所与のタイプセットが定義されたスキーマを実際に修正することなく、それらのタイプセットを拡張できなければならない。これは、いくつかのパターンのうちの1つを採用すること(基本クラスにExtensionエンティティタイプのテーブルを提供することなど)によって実施可能であるが、こうした概念をデータモデルの最上クラス部分にすることが望ましい。これによって、拡張用に特別なAPIパターンを生成することが可能であり、タイプ設計者にとって理解および使用がより簡単である。
Extensible=「true」属性を指定するエンティティタイプは拡張可能である。エンティティ拡張は<Schema>要素内部の<EntityExtensionType>要素を使用して宣言される。<EntityExtensionType>要素は以下の属性を有することができる。
・ Name−−必須。拡張タイプの名前。
・ ExtendsType−−必須。拡張されるエンティティタイプの名前。
・ InstanceManagement−−必須。「Implicit」の値は、拡張のインスタンスが暗黙的に、拡張されたエンティティへ追加/拡張されたエンティティから除去されることを示す。「Explicit」の値は、拡張のインスタンスがアプリケーションによって明示的に追加および除去されなければならないことを示す。
・ Table−−オプション。拡張を格納するテーブルを指定する。
他の拡張タイプから1つの拡張タイプを派生させることが不可能な場合がある。<EntityExtensionType>要素は、<EntityType>要素内部に入れることが可能な任意の要素を含むことができる。通常、これには<Property>要素が含まれる。プロパティ名はすべての拡張にわたって、または拡張されたタイプのプロパティにわたって、一意である必要はない。InstanceManagement=「Implicit」の場合、拡張内に定義されたプロパティすべてがnull可能であるか、デフォルト値を指定するか、あるいは、ゼロの最少発生数制約を備えたアレイ、コレクション、またはテーブルタイプを有するかの、いずれかでなければならない。単集合(singleton)インラインタイププロパティはデフォルト値を指定できないため、null可能でなければならないことに留意されたい。これにより、常に存在しているかのように拡張に対して照会を実行することができる。
InstanceManagement=「Explicit」の場合、アプリケーションは、CDM用に照会言語で定義されたオペレーションを使用して、拡張を明示的にエンティティインスタンスへ追加およびエンティティインスタンスから除去する。拡張の存在をテストするための手段も提供される。エンティティ拡張インスタンスは、収容エンティティによって定義されるデータのまとまりのある単位の一部であるとみなされる(例えば、収容エンティティが削除された場合に削除される)。しかしながら、エンティティおよび拡張に対する変更に関する整合性の保証はなく、トランザクションを使用するアプリケーションを介して明示的に管理されるものと予測される。
すべてのEntityExtensionsはタイプRef(T)の「Entity」と命名されたデフォルトプロパティを有し、ここでTはExtendsTypeの値であり、拡張が関連付けられるエンティティインスタンスを指す。エンティティタイプおよび拡張の例を以下に示す。
アソシエーション。アソシエーションは、2つまたはそれ以上のエンティティが使用可能であり、エンドエンティティは互いに関係する。各エンドは概念上互いに独立したままである。アソシエーションは<Association>要素を使用して表される。この要素は以下の属性を有することができる。
・ Name−−必須。アソシエーションの名前。
・ Scope−−オプション。エンティティタイプの名前を指定する。アソシエーションは、指定されたタイプのエンティティのインスタンスにスコーピングされ、その妥当性はインスタンスに関してチェックすることができる。
<Association>要素は2つまたはそれ以上のネストされた<End>要素を有し、そのそれぞれがアソシエーションのエンドの1つを記述する。2つより多くの<End>要素が指定できるのは、<AssociationEntity>要素も指定された場合のみであることに留意されたい。<End>要素は以下の属性を有することができる。
・ Role−−必須。エンドがアソシエーションで果たすロールに命名する。
・ PluralRole−−オプション。複数形のロール名を与える。この名前は照会モデルおよび正規のオブジェクトマッピングで使用される。指定されない場合、代わりに形式roleEntitiesの名前が使用される。
・ Type−−必須。エンドによって表されるエンティティのタイプ。
・ Multiplicity−−オプション。濃度の下限および上限を設定する、アソシエーションのこのエンドの多重度。<lower_bound>..<upper_bound>形式の整数範囲として、または下限と上限が同じ場合には単一の整数として、指定される。上限は、制限なしを示す「*」とすることが可能である。単一の「*」は、「0..*」と同義である。デフォルト値とそれらのデフォルト値が書き換え可能であるかどうかに関する規則とは、アソシエーションのスタイルに依存する。
□ Reference:参照側では「*」、被参照側では「0..1*」
□ Composition:親側では「1」(固定)、子側では「*」
□ Condition(条件)およびCommon Value(共通値):両側で「*」(固定)
□ Association Entity:両側で「*」
1より大きい多重度は正当であるが、強制の目的で*として扱われる場合がある。
・ Table−−参照ベースアソシエーションのターゲットの場合は必須、そうでない場合はオプション。Typeによって指定されたエンティティタイプまたはTypeの祖先タイプの1つのテーブルプロパティを指定する。関連するエンティティが指定されたテーブルに現れるように、エンドが制約される。構文は、エンティティタイプで始まりプロパティタイプのテーブルプロパティで終わるパスを指定する。パスの各セグメントは以下の2つの方法のうちの1つでエンティティタイプに解決される。
a.エンティティタイプの参照またはテーブルプロパティを指定する(どちらかが基礎となるエンティティタイプに解決される)。この構文は<entity−type>/<property−name>の形である。参照プロパティが使用される場合、その対応するアソシエーションエンドにはテーブル名が指定されていなければならない。
b.アソシエーションまたは構成にロールを指定する。(どちらかがエンドのタイプに解決される)。この構文は<entity−type>/<relationship−name>.<role−name>の形である。アソシエーションが使用される場合、ロール名によって指定されたエンドにはテーブル名が指定されていなければならない。
おそらく参照ベースアソシエーションの「」は、参照を正しいタイプの任意のテーブルとすることができることを示す。Scope属性が指定された場合、パスは示されたエンティティタイプで始まらなければならない。Typeの定義でTable属性が指定された場合、このパスはこれに適合しなければならない。
・ Scoped−−オプション。このエンドが<Association>要素のScope属性に示されたエンティティのインスタンスにスコープされるかどうかを示す。デフォルトはtrueである。
・ OnDelete−−オプション。ロール内のエンティティが削除された場合にとられる処置を指定する。このエンドが<Reference>または<CommonValue>要素にリストアップされた場合にのみ指定可能である。可能な値は以下のとおりである。
・ Restrict−−エンティティが削除されるのを防ぐ。これはデフォルトの値である。
・ Cascade−−他方のエンドロールのエンティティを削除させる。
・ CascadeToAssociationEntity−−アソシエーションエンティティのみを削除させる。
・ SetNull−−アソシエーションの他方のエンドのプロパティをnullに設定させる。プロパティが参照のコレクションである場合、コレクションから参照が除去される。アソシエーションの他方のエンドの多重度の下限はゼロでなければならない。このエンドが<CommonValue>要素のプロパティの1つまたは<Reference>要素のToRoleにリストアップされた場合にのみ指定可能である。
・ OnUpdate−−オプション。エンドロール内のエンティティの共通値プロパティが更新された場合にとられることになる処置を指定する。このエンドが<CommonValue>要素にリストアップされた場合にのみ指定可能である。OnUpdateが指定されない場合、一方のエンドのプロパティを更新しても他方のエンドのプロパティには影響を与えない。可能な値は以下のとおりである。
・ Restrict−−エンティティが更新されるのを防ぐ。
・ Cascade−−他方のエンドロール内のエンティティの共通値プロパティが同じ値に更新されるようにする。
・ SetNull−−他方のエンドロール内のエンティティの共通値プロパティをnullに設定させる。アソシエーションの他方のエンドの多重度の下限はゼロでなければならない。
アソシエーションスタイル。アソシエーションのスタイルは、エンドがどのように接続されるかを示す。あらゆるアソシエーションは、<Association>要素の下で以下の要素のうちの1つをネストすることによって示される4つのスタイルのうちの1つである。
・ <Reference>−−2つのエンドがエンドのうちの1つの参照プロパティを使用して接続される。
・ <Condition>−−2つのエンドがエンドの任意結合を介して接続される。
・ <CommonValue>−−2つのエンドが各エンドからのプロパティの同等結合を介して接続される。
・ <AssociationEntity>−−2つまたはそれ以上のエンドが追加のエンティティを使用して接続される。この要素が使用される場合にのみ、2つより多くの<End>要素を指定することができる。
<Reference>要素は、参照スタイルアソシエーションを記述する。この要素は以下の属性を有することができる。
・ FromRole−−必須。参照タイププロパティを含むロールの名前。アソシエーションエンティティの場合、これはアソシエーションエンティティロールの名前でなければならない。
・ ToRole−−必須。参照プロパティのターゲットであるロールの名前。識別されたロールはOnUpdate属性を指定してはならない。
・ Property−−必須。FromRoleエンティティの参照プロパティの名前。このプロパティを定義する<Property>要素は、封入アソシエーションを指定するRole属性を有していなければならない。多重度の上限が1の場合、プロパティのタイプは参照でなければならず、下限がゼロの場合、その参照はnull可能でなければならない。1より大きい場合、プロパティタイプは参照のアレイでなければならない。
エンティティAおよびBを関係付ける参照アソシエーション「AtoB」の一例を以下に示す。
<CommonValue>要素は共通値スタイルアソシエーションを記述する。この要素は以下の属性を有することができる。
・ Property1−−必須。フォーマットrole−name.property−nameの文字列を使用して、エンドのうちの1つのプロパティを識別する。
・ Property2−−必須。フォーマットrole−name.property−nameの文字列を使用して、エンドのうちの1つのプロパティを識別する。
アソシエーションの場合、Property1およびProperty2のうちの1つがアソシエーションエンティティロールを指定し、他方がエンドロールを指定する。指定されたエンドはOnUpdateおよび/またはOnDelete属性を含むことができる。エンティティAおよびBを関係付ける共通値アソシエーション「AtoB」の一例を以下に示す。
<Condition>要素は、2つのエンド間の任意結合に基づくアソシエーションを記述する。この要素は、関係エンティティに対してtrueを評価する式を含まなければならない。<End>および<Using>要素に指定されたロール名をこの式で使用することができる。<Association>要素が<Condition>要素を含む場合は、ゼロまたはそれ以上の<Using>要素も含むことができる。これらの要素は、エンド間のリレーションシップを定義するために使用される追加のエンティティを記述する。<Using>要素は以下の属性を有することができる。
・ Role−−必須。リレーションシップで使用されるエンドのロールの名前。
・ Type−−必須。リレーションシップで使用されるエンティティのタイプ。
・ Table−−アソシエーション<End>要素の属性記述を参照のこと。
<End>、<Using>、および<Condition>要素を使用して、完全な参照が構築される。この参照は以下の形式である。
以下の例は、第3のエンティティCを含む式を使用する関係する2つのエンティティAおよびBを示す。
<AssociationEntity>要素は、アソシエーションのエンドがアソシエーションエンティティによって接続されることを示す。<AssociationEntity>要素は以下の属性を有することができる。
・ Role−−必須。アソシエーションエンティティがアソシエーションで果たすロールに命名する。
・ PluralRole−−オプション。複数形のロール名を与える。この名前は照会モデルおよび正規のオブジェクトマッピングで使用される。指定されない場合、代わりに形式roleEntitiesの名前が使用される。
・ Type−−必須。アソシエーションエンティティのタイプ。このタイプを定義する<EntityType>要素は、封入する<Association>要素を識別するAssociation属性を指定しなければならない。
・ Table−−アソシエーション<End>要素に関する属性記述を参照のこと。
<AssociationEntity>は1つのネストされた<End>要素を有する。アソシエーションエンティティは、この<End>要素と<Association>の下にネストされたそれぞれの<End>要素との間のアソシエーションを定義する。これらアソシエーションのスタイルは、<Reference>、<Condition>、または<CommonValue>要素で記述される。その代わりにアソシエーションのうちの1つは、以下のように<Composition>要素で記述することができる。
・ <Composition>−−アソシエーションエンティティは、構成のエンドのうちの1つの子である。
<Association>の各<End>のRoleは、これらスタイル要素のうちの1つの、2つのロールのうちの1つによって参照されなければならず、他方のホールは<AssociationEntity>の<End>を参照する。
<Composition>要素は、エンドロールのうちの1つへのアソシエーションエンティティの構成を記述する。これを<AssociationEntity>内部にネストしなければならない。<Composition>要素は以下の属性を有する。
・ ParentRole−−必須。アソシエーションエンティティタイプのネストされたテーブルを含むエンドロールの名前。これは、アソシエーションエンティティロールであってはならない。このロールによって参照される<End>要素上のOnDelete属性は、CascadeまたはCascadeToAssociationEntityを指定しなければならない。OnUpdate属性は指定できない。
・ ChildRole−−必須。親エンティティによって収容されるロールの名前。これはアソシエーションエンティティの<End>ロールでなければならない。
・ Property−−必須。親エンティティ内のテーブルプロパティの名前。このプロパティを定義する<Property>要素は、封入アソシエーションを指定するAssociation属性を有していなければならない。
<Condition>要素は、<AssociationEntity>の下にネストされた場合、以下の属性を有していなければならない。
・ JoinedRoles−−必須。2つまたはそれ以上のロール名の共通の区切りリスト。このリストは、<AssociationEntity>の<End>のロール名およびエンドロール名のうちの1つを含む。リストアップされたロールは、OnDeleteまたはOnUpdate属性を指定してはならない。
以下の例は、アソシエーションエンティティCを使用してAおよびBを関係付けるエンティティアソシエーション「A to B」の一例を示し、ここでCはA内で構成され、Bへの参照を有する。
構成。あらゆるネストされたテーブルは、テーブルタイププロパティを含むエンティティタイプとテーブルによって収容されるエンティティタイプとの、2つのタイプのエンティティ間の構成を定義する。構成は<Composition>要素を使用して記述される。この要素は以下の属性を有することができる。
・ Name−−必須。構成の名前。
<Composition>要素は<ParentEnd>要素を含む。この要素は以下の属性を有することができる。
・ Role−−必須。親エンティティのロールに命名する。
・ Type−−必須。親エンティティのタイプを指定する。
・ Property−−必須。構成を定義する親エンティティのプロパティを指定する。
・ PluralRole−−オプション。複数形のロール名を与える。この名前は照会モデルおよび正規のオブジェクトマッピングで使用される。指定されない場合、代わりに形式roleEntitiesの名前が使用される。
<Composition>要素は<ChildEnd>要素も含まなければならない。この要素は以下の属性を有することができる。
・ Role−−必須。子エンティティのロールに命名する。
・ Type−−必須。子エンティティのタイプを指定する。
・ Multiplicity−−オプション。構成内の子の多重度。アソシエーションの<End>要素の多重度も参照のこと。
・ PluralRole−−オプション。複数形のロール名を与える。この名前は照会モデルおよび正規のオブジェクトマッピングで使用される。指定されない場合、代わりに形式roleEntitiesの名前が使用される。
以下のスキーマは、A:B.ATableおよびC.ATableのインスタンスを含むことができる2つの独立したネストされたテーブルを定義する。B,D.BTableのインスタンスを含むことができるネストされたテーブルと、C,D.CTableのインスタンスを含むことができるネストされたテーブルも存在する。DのインスタンスはDTableと名付けられたトップレベルテーブルに含まれる。
図12は、構成の下でのいくつかの同じタイプのUML表現1200を示す図である。
図13は、TS.TableDでのDのインスタンスの可視化1300を示す図である。
図14は、図13のエンティティテーブルに対応するSQLテーブル1400を示す図である。
ネストされたテーブルタイプの制約。以下に定義された制約要素のうちの1つを使用してコレクションおよびアレイタイプの値を制約することができる。これらの要素はテーブルタイプを参照する様々な要素の内部にネストすることができる(例えば、<EntityType>または<InlineType>要素内の<Property>要素)。
エンティティの制約。<EntityConstraint>制約要素を使用して、テーブル内のエンティティに制約を課すことができる。エンティティタイプに有効な任意の制約要素を<EntityConstraint>要素内部に指定することができる。
発生数。<Occurs>制約要素を使用して、テーブル内のエンティティの数を制約することができる。この要素は以下の属性を有することができる。
・ Minimum−−オプション。テーブル内のエントリの最小数を指定する。デフォルト値はゼロ。
・ Maximum−−オプション。テーブル内のエントリの最大数を指定する。値「unbounded」は、制約が存在しないことを示す。デフォルト値は「unbounded」である。
基本タイプに指定された制約に適合するためには、Minimumに指定された値が以前の値に等しいかまたはこれより大きくなければならず、Maximumに指定された値が以前の値に等しいかまたはこれより小さくなければならない。
一意。<Unique>制約要素を使用して、一意の値をテーブル内に含めなければならないエンティティタイプのプロパティを指定することができる。この要素は以下の属性を有することができる。Properties−−必須。コンマで区切られたエンティティプロパティ名のリスト。
チェック。<Check>制約要素はブール照会式を含むことができる。テーブルを有効にする場合、この式が真であることを評価しなければならない。この式は、いかなる副次作用も有してはならない。チェック制約が基本タイプおよび派生タイプの両方に指定された場合、どちらの制約も妥当性が検査される。テーブルのチェック制約は、プロパティ全体に適用されることに留意されたい。例えばこれを使用して、特定プロパティ値の合計が何らかの制限よりも少ないことをチェックすることができる。代替の方法として、<EntityConstraint>要素内部に配置されたチェック制約は、各値に個別に適用されることになる。
ナビゲーションプロパティ。ナビゲーションプロパティは、リレーションシップのいずれかのエンドによって指定されたエンティティ上にオプションで配置することができる。このプロパティはリレーションシップの一方のエンドから他方のエンドへとナビゲートする手段を提供する。ナビゲーションプロパティは、<Entity>定義内の<NavigationProperty>要素を使用して表される。この要素は以下の属性を有することができる。
・ Name−−必須。メンバの名前。この名前は定義タイプの範囲内で一意でなければならない。この名前はクラスメンバ名に関するCLR規則に従わなければならず、.NetFramework命名ガイドラインにも従うものとする。
・ DuplicateName−−オプション。メンバ名は、DuplicateName属性が提供され、値「true」を有していない限り、基本タイプ階層全体にわたっても一意でなければならない。デフォルトの値「false」は、メンバ名が一意であると予測されることを示す。
この属性の役割は、a)メンバ名が基本タイプ内のプロパティと重複している事実をドキュメント化すること、およびb)スキーマ設計者に名前を重複させることを意図的に選択させることである(すなわち、C#での新規キーワードと同じ役割を果たす)。
・ Association−−AssociationまたはCompositionのいずれかの属性が存在しなければならない。このプロパティで表されるアソシエーションの名前を指定する。
・ Composition−−AssociationまたはCompositionのいずれかの属性が存在しなければならない。このプロパティで表される構成の名前を指定する。
・ FromRole−−必須。ナビゲーションプロパティを備えるエンティティによって表されるエンドのロール。
・ ToRole−−必須。プロパティによって表されるエンドのロール。
タイプ別名(Typed Aliases)。タイプ別名は単純、コレクション、アレイ、テーブル、または参照タイプおよび制約のセットに、一意の名前を与える。タイプ別名は、以下の属性が可能な<TypeAlias>要素を使用して定義される。
・ Name−−必須。別名の名前
・ AliasedType−−必須。別名タイプの名前。これは、単純、コレクション、アレイ、テーブル、または参照タイプでなければならない。
<TypeAlias>要素は、別名タイプに使用可能な任意の制約要素を含むことができる。定義された別名は、別名タイプの名前が使用可能ないずれの場所でも使用することができる。別名のいくつかの例を以下に示す。
テーブルセットおよびテーブルセットタイプ。テーブルセットタイプは、エンティティタイプの制限された形である。テーブルセットタイプは<TableSetType>要素を使用して定義される。この要素は以下の属性を含むことができる。
・ Name−−必須。テーブルセットタイプの名前。この名前は、定義スキーマ内のすべてのタイプおよびリレーションシップの中で一意である。
・ DefaultTableSet−−オプション。テーブルセットタイプのデフォルトテーブルセットを指定する。指定されない場合デフォルト値はない。
<TableSetType>要素は、参照およびテーブルタイプを指定する<Property>要素を含むことができる。参照プロパティは、テーブルセットタイプのみを指定することができる。<TableSetType>要素は<ComputedProperty>および<Method>要素も含むことができる。
テーブルセットインスタンス。テーブルセットとは、テーブルセットタイプのインスタンスのことである。テーブルセットはデータモデルの「トップレベル」を形成する。すべてのストレージは、テーブルセットを作成することによって直接的または間接的に割り振られる。テーブルセットは<TableSet>要素を使用して記述される。この要素は以下の属性を有することができる。
・ Name−−必須。テーブルセットの名前。この名前は、定義スキーマ内のすべてのテーブルセットの中で一意でなければならない。
・ Type−−必須。テーブルセットタイプの名前。
テーブルセットの集合。<TableSet>要素は、指定されたエンティティタイプ内の各参照タイププロパティに関する<AggregatedTableSet>要素を含む。これは、以前に定義されたテーブルセットを新しいテーブルセットに集合させることができる。これは、2つの別々のアプリケーションから単一のアプリケーションにデータを組み合わせる場合に役立つ。<AggregatedTableSet>要素は、以下の属性を含むことができる。
・ Property−−必須。参照タイププロパティの名前。
・ TableSet−−必須。プロパティによって参照されることになるテーブルセットの名前。
この例を以下に示す。
Salesスキーマより
WinFSスキーマより
Thirdスキーマより
照会言語。CDM用の照会言語を指定することができる。照会言語は、エンティティおよびリレーションシップなどのCDM概念をターゲットとするSQLに基づくことができる。
照会での構成の使用。以下のパターンは、入力テーブルが基本とするテーブルセットを決定することによって動作する。構成は、以下の機能を照会で使用できるようにすることができる。
・ Table(parent-type) composition.Getparent-role-p(Table(child-type))−−入力された複数の子の複数の親を戻す。
・ parent-type composition.Getparent-role-s(child-type)−−入力された子の親。
・ Table(parent-type) composition.Filterparent-role-p(Table(parent-type),Table(child-type))−−入力された複数の子のセットにおける子の存在によってフィルタリングされた複数の親のセットを戻す。
・ Table(child-type) composition.Getchild-role-p(Table(parent-type))−−入力された複数の親の複数の子を戻す。
・ Table(child-type) composition.Getchild-role-p(parent-type)−−入力された親の複数の子を戻す。
・ Table(child-type) composition.Filterchild-role-p(Table(child-type), Table(parent-type))−−入力された複数の親のセットにおける子の存在によってフィルタリングされた複数の子のセットを戻す。
上記で、compositionは構成名を表し、parent−role−sは単数形の親ロール名を表し、parent−role−pは複数形の親ロール名を表し、child−role−sは単数形の子ロール名を表し、child−role−pは複数形の子ロール名を表し、parent−typeは親エンティティタイプを表し、child−typeは子エンティティタイプを表し、Table(type)は特定タイプのテーブルを介した照会を表す。
照会でのアソシエーションの使用。これらのパターンは入力テーブルが基本とするテーブルセットを決定することによって動作する。アソシエーションは、以下の機能を照会で使用できるようにすることができる。
・ Table(end-1-type) association.Getend-1-role-p(Table(end-2-type))−−指定された複数のend−2エンティティに関連付けられたend−1エンティティを戻す。
・ Table(end-1-type) association.Getend-1-role-p(end-2-type)−−指定されたend−2エンティティに関連付けられたend−1エンティティを戻す。
・ Table(end-1-type) association.Filterend-1-role-p(Table(end-1-type),Table(end-2-type))−−入力されたend−2エンティティのセットにおける関連付けられたend−2エンティティの存在によってフィルタリングされた複数のend−1のセットを戻す。
・ 上記方法は、存在する場合アソシエーションエンティティを含む、すべてのエンドの組合せについて繰り返される。
上記で、associationはアソシエーション名を表し、end−1−role−sは単数形のエンドのロール名を表し、end−1−role−pは複数形のエンドのロール名を表し、end−2−role−sは単数形のエンドのロール名を表し、end−2−role−pは複数形のエンドのロール名を表し、end−1−typeはソースエンティティタイプを表し、end−2−typeはターゲットエンティティタイプを表し、Table(type)は特定タイプのテーブルを介した照会を表す。
インターフェース。インターフェースはエンティティおよびインラインタイプにCLR同様のインターフェースを提供する。これを使用して、インターフェースがオブジェクトタイプシステムで解決するのと同じ問題のほとんどを解決することができる。インターフェースは、<Interface>要素を使用して宣言される。<Interface>要素は以下の属性を有することができる。
・ Name−−必須。インターフェースの名前。スキーマで定義されたすべてのタイプおよびトップレベルテーブルの中で一意でなければならない。
・ BaseInterfaces−−オプション。このインターフェースの派生元であるインターフェースのコンマで区切られたリスト。
<EntityType>または<InlineType>要素は、ImplementedInterfaces属性を使用して、これをインプリメントするインターフェースのコンマで区切られたリストを指定することができる。リストアップされたインターフェースで定義されたそれぞれのプロパティを、タイプ内で定義することができる。C#のインターフェースと同様に、インターフェースで定義されたプロパティは、同じ名前およびタイプを備えたプロパティを宣言するだけで、タイプ内で暗黙的にインプリメントされる。これが宣言されると、プロパティに課される制約を狭めることができる。プロパティは明示的にインプリメントすることもできる。これは、インターフェースタイプ名をプロパティ名に含めることによって実施される(C#の場合と同様)。これにより、同じ署名を有するが異なるインターフェースから継承されるプロパティに、様々な制約を適用することができる。例えば以下のとおりである。
以下に完全なスキーマの例を示す。以下の例は、Customer、Order、OrderLine、Product、およびSupplierのエンティティタイプ、ならびにこれらのエンティティがどのように関係するかを記述するアソシエーションを定義する。
SQL99およびCDM。SQL99は、コアリレーショナルデータモデル(例えば、SQL92)へのいくつかのオブジェクト拡張を定義する。SQL99のいくつかの主要なアスペクトは、Distinct(特殊)タイプおよびStructured(構造化)タイプの両方を含むUser−defined(ユーザ定義)タイプ、Methods(メソッド)(Behaviors(動作))、Typed Tables(タイプ別テーブル)、およびRefs(参照)である。
SQL99は、SQLデータモデル内で自己完結した完全なタイプシステムの一部またはすべてを定義する。プログラミング言語内のオブジェクトはSQLオブジェクトにマッピングできるが、プログラミング言語(例えばJava(登録商標)、C#)との緊密結合を定義することがSQL99の目標ではない。例えばSQL99では、メソッドは標準的なプログラミング言語ではなくSQL手続き型言語で定義される。CDMの目標は、SQLおよびCLRの両方との緊密なアライメント(alignment)を指定することである。
ユーザ定義タイプ。CDMにおける単純および複合タイプは、SQL99のユーザ定義タイプを使用してほぼ1対1でマッピングする。単純タイプおよび単純タイプ別名は、SQL99のスカラタイプおよび特殊タイプにマッピングし、複合タイプはSQL99構造化データタイプにマッピングする。SQL構造化タイプと複合タイプとの主な相違点は、InlineタイプとEntityタイプとの違いである。CDMでは、アイデンティティ/キーの概念はタイプ定義時に定義される。SQL99では、アイデンティティは、タイプ別テーブルの定義にタイプが使用される場合に定義される。したがってSQL99では、アイデンティティを有するタイプと有さないタイプを区別する必要はなく、それによって、テーブル(参照可能オブジェクト)と列定義(参照不可、インラインオブジェクト)の両方に対するタイプの再使用をサポートしていた。こうしたタイプの再使用は、テーブル定義の際にアイデンティティが定義できる場合にのみ、ストレージとして働く。しかしながら、同じタイプをインラインクラスならびに参照可能クラスにマッピングすることはできない。CDMの目標がアプリケーションオブジェクトフレームワークおよび持続性フレームワークを提供することであるため、インラインタイプとエンティティタイプとの区別は重要である。
メソッド/動作。CDMでは、動作はCLRフレームワークを使用して定義される。SQL99はそれ自体のメソッド/動作フレームワークを定義する。これはほとんどの最新のOO言語に対して閉じている(closed)から、依然として異なり、アプリケーションに良好なプログラミング環境を提供しない。通常、アプリケーション(またはアプリケーションサーバ)はプログラミング環境とデータベース環境の間の溝を埋める。
タイプ別テーブル対エンティティテーブル。CDMのエンティティテーブルはSQL99のタイプ別テーブルと同様である。しかしながら、エクステントは論理的、すなわちオブジェクトの論理コレクションである。エクステントに関連付けられた物理ストレージはない。タイプテーブルはすべてのストレージ属性がテーブル上に存在できるSQLテーブルである。エクステントは1つまたは複数の物理テーブルにマッピング可能である。
参照。CDMとSQL99とでは、参照が非常に似ている。CDMでは、参照は参照用のエクステントを指定することによってスコーピングされ、SQL99では、参照は参照用のターゲットとしてタイプテーブルを指定することによってスコーピングされる。どちらの場合も、参照はオブジェクトに解決される。
図15は、主題となるアーキテクチャのCDMを利用可能なデータプラットフォーム1500を示す概略図である。この概略図で任意の構成要素および/またはボックスを位置決めすることは、プロセス/マシンの境界を横切るいかなる特定の配置も示唆しない(または必ずしも防がない)ことを理解されよう。データプラットフォーム1500は、変更が保存される場合、および基礎となるデータへの他の変更がすでに実行された場合、競合検出がアプリケーション特有の方法でこれを解決するように、楽観的並行性モデルを利用することができる。効果的なプラットフォームにするために、データプラットフォーム1500は、プログラミング言語統合、リッチデータモデル化、持続性フレームワーク、サービス、その他などの機能を含む。API 1502は、ストア1508へのデータプラットフォームランタイム1506を介して、アプリケーション1504による言語統合およびデータアクセスを容易にする。データプラットフォーム1500は、以下の機能を提供する。
CDM。データプラットフォーム1500の中央にあるランタイム1506はCDM 1510である。CDM 1510の意図は、主にユーザデータ(PIM、ドキュメントなど)で動作するアプリケーションからLOBおよび企業データまで複数のアプリケーションドメインに共通のモデル化概念を取り除くことである。リッチなオブジェクトおよびリレーションシップ抽象化の提供に加えて、CDM 1510は構造、非構造化、および半構造化データのサポートを提供する。
行/エンティティデータ。CDM 1510は、構造および構造化データ(例えばビジネスデータ)の動作をキャプチャするためにリッチエンティティ−リレーションシップモデルをサポートする。CDM 1510は、リッチオブジェクト抽象化およびリレーションシップモデル化用の拡張を備えた(例えば、DocumentsとContactsとの間のAuthorリレーションシップ、Purchase OrdersとOrder Linesとの間のLinesリレーションシップ)、コアリレーショナルモデルのスーパーセットである。
ファイルデータ。CDM 1510は、非構造化(ファイル)データを格納および操作するために、「ファイルストリーム」データタイプをサポートする。ファイルストリームデータタイプは、ファイルとしてデータを格納することが可能であり、ファイルアクセスAPIをサポートする。ファイルストリームデータタイプは、本来、NTFSファイルストリームにマッピングされたSQLサーバでサポートされ、すべてのファイルハンドル/ストリームベースオペレーションをサポートする。CDM 1510では、非構造化コンテンツのファイルストリームとしてのモデル化に加えて、エンティティタイプを使用し、有用なコンテンツを構造化プロパティとしてプロモートすることができる。データベースベースのファイルストレージシステムは、構造化プロパティならびに非構造化コンテンツのファイルストリームをモデル化するエンティティである、ファイルバックアイテム(file backed item)の概念を定義する。ファイルバックアイテムは、関連するファイルストリーム上でのリッチ照会ならびにストリームベースオペレーションを提供する。
XMLデータ。CDM 1510では、(1)XMLデータタイプとして格納すること、(2)XMLドキュメントを1つまたは複数のエンティティにマッピングすること(例えばデータ契約と同様)、という2つの主な方法で、XMLドキュメントをモデル化することができる。CDM 1510は、SQLサーバでサポートされるように、XMLデータタイプをサポートする。XMLデータタイプは任意のエンティティプロパティのタイプとすることが可能であり、XMLデータタイプは、非タイプ別またはタイプ別のXMLドキュメントを格納することができる。1つまたは複数のXMLスキーマをXMLドキュメントプロパティに関連付けることによって、強力なタイプ化が提供される。
API 1502における、照会を含むプログラミング言語統合。データプラットフォーム1500の機能構成要素である、セッションおよびトランザクション1512、照会1514、持続性1516、カーソル1515、サービス1520、オブジェクトキャッシュ1522、ならびにビジネス論理ホスティング1524は、データプラットフォームAPI 1502で使用可能ないくつかの「ランタイム」クラスに封入される。
持続性エンティティ1516は、リレーショナルストアからの構成要素部片からオブジェクトがどのようにアセンブルされるかを正確に記述する宣言型マッピング定義を提供する、持続性エンジンを含む。エンジンは、オブジェクト照会式に関して照会プロセッサによって定義された式を取得し、次にこれを宣言型マッピングと組み合わせる、照会生成構成要素(図示せず)を含む。これが、データベース内の基礎となるテーブルにアクセスする等価照会式に変わる。更新生成構成要素(図示せず)は、変更追跡サービスに注目し、メタデータのマッピングからの支援により、オブジェクトの世界でのこれらの変化をテーブルの世界での変化に変換する方法を記述する。
持続性エンジンは、オブジェクト−リレーショナルマッピングを含むことができる。言い換えれば、データプラットフォーム1500によって提供されるモデル化、アクセス、および照会の抽象化は、オブジェクトベースである。データプラットフォーム1500によって使用される主なストレージ技術は、リレーショナルベースである。持続性エンジンはオブジェクト−リレーショナルマッピング(「O−Rマッピング」とも呼ばれる)を使用し、ここで持続性エンジンは、言語クラスを基礎となるテーブル表現にマッピングすることができる。
ファイルおよびXMLデータの照会/検索。CDM 402は、それぞれファイルストリームおよびXMLデータタイプを使用して、非構造化および半構造化データを格納する。CQLは、これらのデータタイプを照会することができる。構造化エンティティにプロモートされるファイルコンテンツ(例えばWinFSファイルバックアイテム)では、CQLのリレーショナルオペレータはこれらのエンティティを照会することができる。ファイルストリームとして格納された非構造化データは、フルテキスト検索を使用して照会することができる。XMLコンテンツは、XPathまたはXQueryを使用して照会することができる。
オブジェクト−リレーショナルマッピング。データプラットフォーム1500は、リレーショナル(テーブル)ストレージのトップにオブジェクトベース抽象化を提供するため、O−Rマッピング構成要素を提供する。データプラットフォーム1500は、透視マッピングおよび非透視マッピングの両方をサポートする(タイプ設計者はマッピングを指定する際にある程度の柔軟性を有する)。現在のデータベースベースのファイルストレージシステムインプリメンテーションは透視マッピングを使用するが、より一般的なO−R持続性フレームワークには非透視マッピングが必要である。
キャッシング。データプラットフォームランタイム1506は、照会結果(例えばカーソル)および非コミット更新のキャッシュを維持する。これはセッションキャッシュと呼ばれる。データプラットフォーム1500は、アプリケーションが非接続モードで動作できるようにする明示的キャッシュも提供する。データプラットフォーム1500は、明示的キャッシュ内のデータに関する様々な整合性の保証を提供する。キャッシュは、データのオンディスクアイデンティティをインメモリオブジェクトと相関させることによって、アイデンティティ管理を実行する。データプラットフォームランタイム1506は、照会結果(例えば以下で詳細に論じるカーソル)および非コミット更新のキャッシュ1522を維持し、こうしたキャッシュはセッション、トランザクション1512に関係しているため、セッションキャッシュと呼ばれる場合がある。加えてこれは、セッションが作成されると出現し、セッションが終了するとなくなる。
データプラットフォーム1500は、明示的キャッシュと呼ばれる別の種類のキャッシュも公表することができる。明示的キャッシュは、1つまたは複数の照会からのデータのキャッシュを提供する。データが明示的キャッシュに具体化されると、1)読み取り専用、権限なし、2)ライトスルー、権限あり、および3)外生(exogenous)通知を介した自動リフレッシュの、データ整合性保証が与えられる。明示的キャッシュに対するプログラミングおよび照会モデルは、ストアデータを介するものとほぼ同様とすることができる。
照会プロセッサ。データベースアクセスは照会プロセッサを介して行われる。照会プロセッサは、複数の照会言語を処理するために複数のフロントエンドを表現し、その後、内部正規フォーマットにマッピングできるようにするものである。これは、ドメインモデルおよびこれが動作するアプリケーションのオブジェクトに関して実行される。その後、パイプラインであるプロセッサに照会が渡され、バックエンド特有の照会に変換される。
カーソル。データプラットフォーム1500は、順方向専用カーソルおよびスクロール可能カーソルの両方を提供することができる。カーソルは、通知、拡張/縮小状態でのマルチレベルグルーピング、動的ソート、およびフィルタリングをサポートする。カーソル、規則1515は、CQLから戻されたデータエンティティのセットを1回に1つずつ処理できるようにするメカニズムである。アプリケーションは、単に結果セット全体をメモリにコピーすること、およびメモリ構造内でこのトップにスクロールパターンをオーバレイすることによって、結果セットを介してカーソルを作成することができる。しかし、時にカーソルのインプリメンテーションに関与してこの要件および複雑さが遍在する(特に、更新、ページングなどが考慮に入れられる場合)ということは、任意のデータプラットフォームがカーソルモデルを提供するべきであることを意味する。ブラウジングおよびスクロールの基本機能に加えて、データプラットフォームカーソルは、1)外生通知および保守、2)拡張/縮小状態でのマルチレベルグルーピング、ならびに3)動的ソートおよびフィルタリング(例えば「後処理」)、の機能を提供することができる。カーソルは結果セットを指定するための異なるメカニズムとすることはできないこと、結果セットは照会によって指定されること、およびカーソルはこれら照会を介するものであることを、理解されよう。
ビジネス論理ホスト1524。データプラットフォーム1500は、タイプ/インスタンスおよびオペレーションに関してデータ中心論理をホストするために、ランタイム環境を提供する。こうしたデータ中心ビジネス論理は、アプリケーションサーバ内でホスト可能なアプリケーション/ビジネスプロセス論理とは別のものである。オブジェクトは、データベース内の単なる行ではない。オブジェクトがメモリ内で具体化された場合、実際にはアプリケーションが呼び出すことのできる動作を有するオブジェクトである。システム内には、ランタイム時にデータプラットフォーム1500を拡張するようにすべてが動作する、主としてイベントおよびコールバックである、拡張ポイントがある。これらのオブジェクトは単なるオブジェクトではなく、CLRオブジェクト、.NETオブジェクトなどである。データプラットフォーム1500は、それらオブジェクト内でプロパティまたはメソッド呼び出しをインターセプトする機能を可能にする。アプリケーションはこれらオブジェクトの動作をカスタマイズすることができる。
データプラットフォーム1500は、ビジネス論理をオーサリングするためのいくつかのメカニズムを提供する。これらのメカニズムは、制約、イベントハンドラ、静的/インスタンスメソッド、結合可能動作、および静的サービスメソッドの、5つのカテゴリに分けることが可能であり、そのそれぞれについて、以下でより詳細に論じる。制約/セキュリティエンティティ1526は、宣言型および手続き型とすることができる。これらの制約は、データに近接したストア上で実行可能である。したがって、制約1526は信用の境界内にあるものとみなされる。さらに、タイプ設計者は制約をオーサリングすることができる。
ビジネス論理ホスティング1524は、イベントハンドラを使用することができる。データプラットフォームAPI 1502は、データ変更オペレーションでいくつかのイベントを発生させる。ビジネス論理作成者は、ハンドラコードを介してこれらのイベントに接続(hook into)することができる。例えば、注文管理アプリケーションについて考えてみる。新しい注文が入ると、アプリケーションは、その注文の価格が顧客に許可された信用限度より低いことを確認する必要がある。この論理は、注文がストアに挿入される前に実行されるイベントハンドラコードの一部とすることができる。
サービス。データプラットフォーム1500は、すべてのデータプラットフォームクライアントが利用できるサービスのコアセットを提供する。これらのサービスには、規則、変更追跡、競合検出、イベント化、および通知が含まれる。イベント化は、フレームワークレベルのサービスから、または追加の動作を加えるためのアプリケーション用に、データプラットフォームランタイム1506を拡張するものであり、ユーザインターフェースでのデータの結合にも使用される。
制約。データプラットフォーム1500は、タイプ設計者が制約を宣言的に作成できるようにするために、制約/セキュリティ構成要素1526を提供する。これらの制約はストア内で実行される。通常、データプラットフォーム制約の範囲は、長さ、精度、スケール、デフォルト、チェックなどの概念を包含する。これらの制約は、データプラットフォーム制約エンジン1526によってランタイム時に強制される。
セキュリティ。データプラットフォーム1500は、ユーザの信用証明がその「役割」(管理者、パワーユーザ、承認者など)を決定する、役割ベースのセキュリティモデルを提供する。各役割にはアクセス許可のセットが割り当てられる。データプラットフォームセキュリティエンジン1526は、これらのセキュリティポリシーを強制する。加えて、データプラットフォーム1500は、データプラットフォーム1500内のエンティティへのアクセスを制御するためのセキュリティモデルを提供する。セキュリティモデルは、オペレーティングシステムユーザの認証、エンティティの許可レベル(例えば、読み取りおよび更新用に別々の許可を与える)などをサポートすることができる。
制約/セキュリティ構成要素1526は、データプラットフォームランタイム構成要素1506とは別のエンティティとして動作可能であるため、これとは別に図示されていることに留意されたい。代替方法として、またおそらくより効率的に、制約/セキュリティ構成要素1526は、データベースシステムとすることが可能なストア構成要素1508と組み合わされる。
以下の図16〜18では、図面内の各クラスはモデルまたはスキーマ要素である。「S」と示された要素は、SDL内の要素である。他の要素は、構造化要素、暗黙的構築要素(参照タイプなど)、または組み込み要素(直接宣言によってではなく、CLRタイプのインポートによって拡張される単純タイプなど)のいずれかである。
図16は、タイプに関するモデルのいくつかのセマンティクスを明確にするCDMメタモデルフラグメントを示す図である。これらのモデルは、正確な構文をモデル化するのではなく、スキーマの効果を記述する。例えば、アソシエーションエンドロールの名前を使用する属性は、これらのモデル内のアソシエーションエンドへの参照として表される。コメントおよび追加の制約を以下に示す。
エンティティタイプの宣言は、EntityCollectionTypeおよびReferenceTypeを暗黙的に定義する。複合タイプの宣言は、InlineCollectionを暗黙的に定義する。実際には、これらのタイプはRef<T>、EntityCollection<T>、InlineCollection<T>などの総称でインプリメントすることができる。
・ プロパティは、インラインおよびエンティティタイプの宣言でのみ宣言可能である。
・ typeof(InlineCollectionType.ElementType) != InlineCollectionType
図17は、プロパティに関するモデルのいくつかのセマンティクスを明確にするCDMメタモデルフラグメントを示す図である。コメントおよび追加の制約を以下に示す。
Property.Kindは、Propertyメタクラスがタイプを有し、それが表すプロパティがタイプを有する場合、アソシエーション制約を読みやすくする。Kindは、生じる可能性のあるいかなる混乱も回避する。
・ AssociationEnd.Propertyは、アソシエーションの同じエンドにあるエンティティを参照するプロパティである。言い換えれば、アソシエーションの反対側にあるエンティティ上のプロパティである。
・ 参照またはエンティティセットのプロパティは、基礎となるエンティティタイプを有するアソシエーションプロパティである。
・ ナビゲーションプロパティは照会を戻す。
図18は、アソシエーションに関するモデルのいくつかのセマンティクスを明確にするCDMメタモデルフラグメントを示す図である。ここで制約のほとんどは、アソシエーションエンドのプロパティが右側のタイプ(right type)でなければならないことを単に示すものであり、この右側のタイプは非常に明白である。例えば、Referenceスタイルアソシエーションは参照タイプのプロパティを有するものでなければならない。コメントおよび追加の制約を以下に示す。
AssociationEnd.Propertyは、アソシエーションの他方のエンドのエンティティタイプのプロパティである。これは、アソシエーションのこのエンドのエンティティを参照するプロパティを示す。アソシエーションに関してより正式に表すと以下のようになる。
Ends[0].Property.UnderlyingType=Ends[1].Typeおよび
Ends[1].Property.UnderlyingType=Ends[0].Type
・ CommonValue.Propertiesのうちの1つは、共通値アソシエーションの2つのエンティティそれぞれからのものである。
代替インプリメンテーションおよび構文
次に、オブジェクト−リレーショナルデータに関するデータモデルの代替インプリメンテーションを示す。この代替インプリメンテーションの説明では、この代替インプリメンテーションを表現するための多くの可能な形式の1つであるスキーマ定義言語を使用する。また、前述のインプリメンテーションとの類似点が多いが、例えば命名および構文の形において顕著な相違点があることにも留意されたい。
この代替の説明では、リレーションシップは<Association>または<Composition>要素を使用してトップレベルで定義することができる。Refアソシエーション(または構成)を定義するために、ソース(または親)のプロパティを定義する必要はない。OnCopy、OnSerialize、OnSecure、およびOnLockは、リレーションシップで導入されるオペレーション動作である。EntitySetsは、EntityContainerType内でのみ定義され、EntityType内では定義されない。NavigationPropertyはもはや使用されず、RelationshipPropertyがわずかに異なるセマンティクスで使用される。
明示的Refタイププロパティはエンティティへの非スコープ参照であり、リレーションシップは作成しない。RelationshipPropertyは暗黙的にRef(またはCollection(Ref))タイプである。リレーションシップ範囲は、エンティティコンテナタイプの<Scope>節内に指定される。
リレーションシップはより抽象的に作られている。以前のインプリメンテーションでは、リレーションシップはエンティティ内の参照またはコレクション値プロパティによって暗黙的に定義されたが、これはリレーションシップをインプリメントする方法を前提とするものである。ここでは、リレーションシップはトップレベルで定義される。これによって、タイプ宣言からリレーションシップメタデータが除去され、タイプの再使用が可能になる。
階層化。参照アソシエーション、条件付アソシエーション、およびアソシエーションエンティティは、すべて<Association>要素内で定義される。これは、メタモデルが、2つのエンティティ間のアソシエーションのコア概念を有するという事実を反映するものであり、これが参照、条件に基づくか、またはアソシエーションエンティティを通じて関係するかは、<Association>内の様々なタグおよびサブエレメントによって定義される。特殊概念(参照、条件、アソシエーションエンティティ)は、コア概念(アソシエーション)のトップで階層化される。
コアモデリングと持続性の分離。エンティティコレクションの概念は、以前のインプリメンテーションで2つの目的に使用された。その第1はエンティティの持続性グループを命名および参照するための方法として、第2は構成を定義するための方法として使用することである。したがって、構成をモデル化するためだけに持続性に対応しなければならなかった。ここでは、エンティティコレクションは純粋なグループ化/スコーピングの概念であり、エンティティタイプ内のフィールドとしては使用できない。構成は、関与するエンティティに関する抽象メタデータを指定することによって、トップレベルで定義される。持続性を構成から分離することによって、モデルはより柔軟かつ直交性のあるものとなる。
コレクションの簡略化。ここでのエンティティコレクションは、EntityContainerType(上記ではEntityDatabaseTypeとして理解されていた)内でのみ可能であり、インラインコレクションのみをエンティティまたは複合タイプのプロパティとすることができる。これは、コレクションセマンティクスの簡略化の結果である。もはや、エンティティコレクションとインラインコレクションとを区別する必要はない。単なる「コレクション」が存在し、インラインタイプを集めるために使用される。
操作セマンティクスの指定機能。このインプリメンテーションではアソシエーションまたは構成要素のリレーションシップを指定し、そのタイプに関係なく任意のリレーションシップでの操作の動作を直交的に指定する。したがって、任意のリレーションシップでOnCopy、OnSerialize、OnSecure、OnLock動作を指定できるようになっている。これによってもやはりさらなる柔軟性が与えられ、より大規模なシナリオセットがキャプチャされる。
エンティティの任意のグループ化。WinFS「アイテム」の概念は、実際はいくつかのエンティティ(例えばItemエンティティ、ItemFragmentエンティティ、および収容されたエンティティ)をグループ化する操作である。以前に定義された構成は、この概念をモデル化することを過度に制約していた。操作セマンティクスを指定する機能およびエンティティコレクションをリレーションシップ定義から分離することにより、操作の動作を選択し、これを任意のエンティティのグループ化に適用することができる。
改名。セマンティクスをよりよく反映させるために、いくつかの名前が変更されている。例えば、(a)EntityCollectionはEntitySetに変更され、エンティティの順不同のグループ化となったため、古典的なERモデリングで使用される用語にも整合し、(b)「データベース」という用語が多くの持続性/操作/管理上の含意を有するため、これをなくすためにEntityDatabaseTypeがEntityContainerTypeに変更され、(c)Collectionがこのインプリメンテーションモデル内で可能な唯一のコレクションの種類であるため、InlineCollectionはCollectionに変更された。
EntityDatabaseはもはや使用されないが、ここではEntityDatabaseTypeのインスタンスである。<AssociationEntityType>は<Association>要素内で定義されている。
したがってデータモデルは、アプリケーションが関心のある様々なデータの部片の、形状およびセマンティクス(制約、動作)、ならびにこれらの間のリレーションシップを記述するものである。
図19は、CDMの代替インプリメンテーションの4つの主な概念を示す図である。前述のように、4つの概念とはタイプ、インスタンス、エンティティ、およびリレーションシップである。図19は、典型的には、異なる種類のデータである注文、顧客、注文ライン、住所、供給業者、製品、従業員、などの処理が可能な、LOBアプリケーションと関連付けることのできるデータのサブセットを示す。Customer(顧客)とラベル表示されたボックスについて考えてみる。CDMではこれはエンティティと呼ばれ、アプリケーションが作業の対象とするトップレベルのデータ単位を表す。Customerには、CustomerID、CompanyName、ContactName、Address、およびPhoneといういくつかのフィールドがある。各フィールドはタイプを有し、これがそのフィールドに入るデータの構造を決定する。CustomerIDが固定長の文字列であることは容易にわかるであろう。CompanyNameおよびContactNameフィールドも、タイプ文字列である。Customerそれ自体がタイプを有する。Customerはエンティティであるため、このタイプはエンティティタイプと呼ぶことができる。Addressフィールドは他のフィールドとは異なり、他のフィールドの形の内部構造を有することにも留意されたい。CDMでは、こうしたフィールドのタイプを複合タイプと呼ぶ。これとは対照的に、CustomerID、CompanyName、およびContactNameのタイプはすべて単純タイプである。Phoneフィールドはいくつかの電話番号からなり、それぞれが文字列である。これはコレクションタイプと呼ばれる。タイプは構造(および値に関するある種の制約)を指定し、実際のデータはこれらタイプのインスタンスに格納される。タイプおよびインスタンスは、それぞれクラスおよびオブジェクトと同様である。図19は、Customer、Order、およびOrderDetailのインスタンスを示す。
CustomerとAddressは、どちらも内部構造を有する(複数のフィールドから構成される)という観点では同様である。しかし、意味論上および操作上では、CustomerはAddressとは異なる。Customerは、照会、データ変更操作、トランザクション、持続性、および共有のための単位として働く。他方でAddressは常にCustomer内に存在し、参照されること、またはそれ以外の方法で独立して動作することはできない。CDMでは、こうしたトップレベルのデータ単位をエンティティと呼ぶ。すべての他のデータはエンティティへのインラインとみなされる。
次にOrder(注文)を見ると、ビジネス規則は、あらゆる注文が対応する顧客を有することを必要とする。これは、OrderエンティティとCustomerエンティティとの間のリレーションシップによってモデル化される。CDMによってサポートされるリレーションシップには様々な種類がある。OrderとCustomerとの間のリレーションシップはアソシエーションと呼ばれる。アソシエーションは、通常、エンティティ間のピアツーピアリレーションシップをモデル化するために使用される。各注文は、いくつかの注文ラインで構成される(ある書店から5冊の本が注文された場合、それぞれの本に関する情報が注文ラインである)。これは、別の種類のリレーションシップ、すなわち構成としてモデル化される。構成内の各OrderLine(注文ライン)がエンティティである。
データの形状は、タイプを定義することによって記述される。概念上、タイプとは値のセットに与えられる名前のことである。例えば、何かのタイプがintである場合、精密には整数の範囲である値の範囲が指定される。タイプの概念を精密に定義するには、本明細書の範囲を超えたカテゴリ論へと踏み込んでいく必要がある。したがって本明細書では、タイプの概念は形式上は基本的概念であることを前提とする。タイプシステムは、タイプを定義し、これを言語構造に関連付けるためのメカニズムである。
CDMの中心はそのタイプシステムである。このタイプシステムを使用して定義されたデータは、CLRと同様、強力にタイプ付けされたものとみなされる。言い換えれば、インプリメンテーションが例外なくタイプ規則を厳しく強制すること、すべてのタイプはコンパイル時にわかっていること、およびいかなるタイプの変換もその影響が予測できることが予期される。
CDMタイプシステムは、最高レベルで、エンティティタイプおよびインラインタイプの2種類のタイプを定義する。エンティティタイプは一意のアイデンティティを有し、整合性の操作単位を形成する。直感的に言えば、エンティティは、例えばCustomers、Orders、Suppliersなどのデータモデル内で「トップレベル」の概念をモデル化するために使用される。インラインタイプは収容されるタイプである。これらはエンティティタイプの中に含まれる。これらは、収容するタイプとの関連で、存在および消滅し、処理され、その中でのみ参照される。非常に大まかに言えば、エンティティタイプはCLRの参照タイプに類似し、インラインタイプは値タイプに類似する。これは制限付きの類似点であり、CLRの値タイプのようにインラインタイプは独立した存在を持たず、CLRの参照タイプのようにエンティティタイプは独立に存在可能であり、独立に参照可能である、という点でのみあてはまる。
インラインタイプには、スカラタイプ、複合タイプ、XMLタイプ、FILESTREAMタイプ、およびこれらタイプのコレクションといういくつかの種類がある。これらタイプのいくつかについて、以下でより詳細に説明する。
タイプを記述するための構文として、スキーマ定義言語(SDL)が使用される。SDLはクラスを定義するためのC#のサブセット、またはSQLのデータ定義言語(DDL)サブセットと類似している。SDLはXMLで表される(ただし、XSDベースではない)。本説明全体を通じて、説明される概念を示すためにSDLフラグメントが使用されることになる。
スカラタイプは、ある意味で、タイプシステムで使用可能な最も単純なタイプである。システムに対して可視の内部構造はない。スカラタイプは単一の値を表す。CDMは、単純(Simple)タイプ、列挙(Enumeration)タイプ、および参照(Ref)タイプという3種類のスカラタイプを定義する。
単純タイプは、システムによって提供される組み込み型の基本タイプである。System.String、System.Boolean、System.Byte、System.Int16などのように、CLRの値タイプがCDMの単純タイプとして使用される。CDMは、System.StorageおよびSystem.Data.SqlTypesネームスペースで定義された、いくつかのタイプもサポートする(System.Storage.ByteCollection、System.Data.SqlTypes.Sqlsingle...)。
列挙タイプは、(赤、青、緑)または(春、夏、秋、冬)などの記号名のセットを定義する。列挙タイプのインスタンスは、このセット全体に及ぶ値を有する。
参照タイプのインスタンスは、エンティティを識別する値である。参照タイプについては、以下で説明する。
単純タイプを使用して、さらに複合タイプを構築することができる。複合タイプは名前を有すること、または匿名のままとすることができる。
名前付き複合タイプは、名前およびメンバセットを有する。メンバは名前およびスカラタイプのように単純とすることができる。各メンバはスカラタイプ(この場合は単純タイプ)である。これらのようなデータメンバはプロパティと呼ばれる。
複合タイプには、2つの他の種類のメンバ、メソッドおよび算出プロパティが存在可能であり、これらについては以下で説明する。複合タイプは他の複合タイプを含むこともできる。
匿名複合タイプは、その名前が暗に示すように、構造的には複合タイプと同様であるが、これに基づいてプロパティを宣言するためには使用できない。匿名複合タイプは(エンティティからフィールドのサブセットを考案する照会などにおいて)照会結果として戻される。これらは、照会閉包(closure)を保証するためにCDMに存在する。SDLはこれらのタイプを宣言するための構文を持たない。
名前付き複合タイプと匿名複合タイプとの相違点の1つに注目すると、まったく同じ構造を持つが名前の異なる2つの名前付き複合タイプは別のタイプであるとみなされる。しかし、まったく同じ構造を持つ2つの匿名複合タイプは、同じタイプであるとみなされる。
エンティティタイプは、スカラタイプおよび他の複合タイプから構築されるタイプであると言う点で、構造上は複合タイプと同様である。しかしながら、意味論上および操作上はまったく異なり、エンティティはアイデンティティ、様々な操作に関する整合性の単位、およびその他を介して、一意に参照可能である。エンティティタイプは、複合タイプと同様の方法で定義される。
コレクションは、インラインタイプのゼロまたはそれ以上のインスタンスを格納する。以下の例で、Personタイプについて考えてみると、このタイプはある人物に関する連絡先情報を格納する。通常、名前、自宅の住所、勤務先の住所、自宅の電話番号、勤務先の電話番号、携帯電話番号、電子メールIDが(最も一般的なサブセットを利用するために)格納される。このリストでは、2つの住所と3つの電話番号があることに留意されたい。これらはCDMを使用して、以下の例に示されるようにコレクションとしてモデル化することができる。
4行目はAddressフィールド用にAddress要素のコレクションを定義し、5行目はPhoneNumberフィールド用のString要素のコレクションを定義する。したがってこの人物は、Personオブジェクトの下に例えば2つのコレクション、AddressesおよびPhoneNumbersを有することができる。AddressesコレクションにはAddressタイプの2つのインスタンスが含まれ、PhoneNumbersコレクションにはStringタイプの2つのインスタンスが含まれる。CDMでは、コレクションは単純タイプおよび複合タイプ用に定義することができる。
コレクションは、しばしばアレイのセマンティクスを有することが望ましい。アレイとは、要素が順序付けおよび索引付けされるコレクションのことである。アレイは順序付けされるが、必ずしもソートされないことに留意されたい。例えば、[1,4,5,3]は順序付けされたコレクションであるが、ソートはされていない。これは、第2の要素を要求すると「4」が返されることが保証される(明示的変更なし)ため、順序付けされている。
コレクションタイプ<Property>の<Collection>サブエレメントのArray属性は、trueに設定された場合、これをアレイに入れる。Arrayは、そのデフォルトの値が「false」を取るオプションの属性である。
通常、アプリケーションによって使用されるデータモデルは多くの異なるタイプを有する。これらタイプのいくつかは、完全に別々の概念、例えばCustomerおよびOrderをモデル化する。こうしたタイプは、いかなるメンバも共有しない。しかしながら他のタイプは、互いにわずかな類似性を有するが依然として異なる概念をモデル化する。例えば、CustomerおよびEmployeeについて考えてみる。たとえこれらが異なる概念をモデル化しても、それらの間にはどちらも住所、電話番号、および名前に関するプロパティを有するという基礎となる共通性のスレッドが存在する。これは、誰かに連絡を取るために必要な情報である。言い換えれば、これは連絡先情報である。
図20は、タイプ継承の概念をサポートするCDMを示す図である。継承は、あるタイプが他のタイプから、プロパティ、メソッド、および算出プロパティを継承できるようにするものである。例では、EmployeeおよびCustomerがContactから継承する。ここでContactはスーパータイプまたは基本タイプと呼ばれる。EmployeeおよびCustomerは、サブタイプまたは派生タイプと呼ばれる。サブタイプ化は単一レベルで止める必要はなく、あるサブタイプを他のタイプの親とすることが可能であって、例えばEmployeeをManagerの基本、CustomerをPreferredCustomerの基本、などとすることができる。この方法で、図20に示すように全体の継承階層を形成することができる。
上記の例ではプロパティの継承のみを示したが、派生タイプもその基本タイプからメソッドおよび算出プロパティを継承する。CDMは、継承メソッド(動作)に関してCLRセマンティクスに従う。上記の継承階層に対する(部分的)SDL指定を以下の例に示す。
前述のように、継承の1つの目的は複数のタイプ間で総称概念を共有することである。継承の他の目的は、拡張可能性である。ISVが継承階層をインプリメントおよび配置した後でも、顧客は継承を介して自分たちの目的に合うようにタイプを拡張することができる。この拡張可能性を動作させるために重要なものは、派生タイプのあらゆるインスタンスは基本タイプのインスタンスでもあると言う、値の置換可能性(多相性(polymorphism)としても知られる)の概念である。したがって、ManagerがEmployeeから派生したものである場合、ManagerのあらゆるインスタンスはEmployeeのインスタンスでもある。したがって、すべての従業員(基本タイプ)を照会すると、すべての経営者(派生タイプ)も戻される。
図21は、このインプリメンテーションに関するCDMタイプの分類法を示す図である。このセクションでは、CDMタイプシステムにおけるタイプの正しい分類について説明する。より広範囲なセマンティックとの関連において調べると、ほぼすべてのデータが何らかの形でそのタイプのドメイン全体にわたって制約される。CDMは、異なるタイプにわたって様々な制約を指定することができる。
単純タイプ制約。単純タイプに許可される値のセットは、長さ(文字列および2進数)、精度、スケール(10進数)などを制約するなど、様々な方法で制約することができる。デフォルト制約は、デフォルト値を指定することができる。チェック制約は、プロパティの値を介して論理式を指定することができる。この式がfalseと評価された場合、プロパティ値は無効である。
コレクションタイプ制約。コレクションに関して以下の制約がサポートされる。ElementOccurs制約は、コレクションの最高および最低濃度を指定する。Unique制約を使用して、コレクション要素値の一意性を保証することができる。ElementConstraintを使用して、コレクションの基礎となるタイプに関する制約を指定することができる(例えば、Decimalタイプのコレクションを定義すると、この<ElementConstraint>を使用して精度およびスケールを指定することができる)。
チェック制約はブール照会式を指定する。コレクションが有効とみなされるために、この式はtrueと評価されるべきである。この制約は、コレクション内の個々の要素ではなく、全体としてのコレクションプロパティに適用されることに留意されたい。
タイプ設計者は、特にコレクションが多数の要素を含むと予測される場合、Collectionsに関して常に一意の制約を定義することが推奨される。ランタイム時に、コレクションのうちの1つの要素が更新された場合、この一意性の制約により、インプリメンテーションはコレクション全体を書き換える代わりに、その単一の要素を更新のターゲットとすることができる。これにより、更新時間およびネットワークトラフィックが削減される。
派生タイプ制約。派生タイプ制約を使用して、派生タイプ内の基本タイププロパティを制約することができる。様々な航空会社から提供されるマイレージ・サービスについて考えてみる。例えば、ユナイテッド航空はマイレージプラスと呼ばれるプログラムを有する。このプログラムには1Kメンバ、プレミアエグゼクティブメンバ、プレミアメンバ、および「単なる(just)」メンバという、いくつかのメンバシップレベルがある。プレミアメンバになるためには、少なくとも25000マイルまたは30支払い区間を飛ばなくてはならず、プレミアエグゼクティブおよび1Kになるためには、それぞれ50000/60および100000/100が必要である。派生タイプ制約を定義する場合、制約は基本タイプ制約に適合しなければならないことに留意されたい。例えば、基本タイプのコレクションフィールドに対するElementOccurs制約が、最低1および最高50を指定した場合、派生タイプの制約は最低が1より大きく、最高が50未満でなければならない。
null可能性制約。単純タイプおよび複合タイプはnull可能性制約を指定することができる。これは、このタイプのインスタンスがNULL値を格納できることを意味する。これは、<Property>要素のNull可能属性によって指定される。
コレクションプロパティはNull可能に設定すべきではなく、Null可能は複合タイププロパティにも可能であることに留意されたい。Null可能属性のデフォルト値は「true」である。
これまで、この代替インプリメンテーションのCDMタイプシステムによって提供されるコアモデリング機能について説明してきた。CDMは、複合タイプを定義し、列挙を作成し、制約、継承、および値の置換可能性(多相性)を表す機能の、組み込みタイプのリッチセットである。
システム内でこれらのタイプが設計および配置されると、アプリケーションはこれらのタイプのインスタンスの作成および操作を開始する。コピー、移動、照会、削除、バックアップ/復元(持続データの場合)などの様々な操作が、タイプインスタンスで実行される。次に、CDMの操作セマンティクスについて説明する。
タイプおよびインスタンス。タイプはデータの構造を定義する。実際のデータはタイプインスタンスに格納される。例えばオブジェクト指向言語では、タイプおよびインスタンスはクラスおよびオブジェクトと呼ばれる。
図22は、このCDMのインプリメンテーションにおけるタイプおよびインスタンスの概念を示す図である。図22内の楕円形は実際のデータであり、立方体はタイプ、すなわちメタデータである。
エンティティおよびインラインタイプ。ここで再度、仮想上のLOBアプリケーションによって使用されるデータに注目すると、一方ではCustomersおよびOrdersなどのタイプを有し、他方ではAddressおよびAddresLineなどのタイプも有する。これらそれぞれのタイプは、それぞれが複数のフィールドに分解可能な構造を有する。しかしながら、CustomerタイプとAddressタイプとの間には2つの主要な相違点がある。Customerタイプのインスタンスは独立した存在を有するが、Addressのインスタンスは(例えば)Customerタイプインスタンス内にのみ存在する。
この意味で、Customerはトップレベルタイプであり、単独で存在するこのタイプのインスタンスは独立して参照され(「CompanyNameが...のCustomerを表示」)、独立して処理される。他方でAddressは収容されたタイプであり、そのインスタンスは、例えば「CustomerのAddress」または「Orderの出荷先Address」などのように、トップレベルタイプインスタンスとの関連においてのみ存在する。
Customerタイプにはアイデンティティがあるが、Addressタイプにはない。Customerのあらゆるインスタンスは一意に識別され、これへの参照が実行できる。Addressタイプは、Customerなどのタイプ外で別々に識別することができない。この基本的な区別は、CDMではEntityタイプおよびInlineタイプの概念によって形式化される。前述のLOB例では、CustomerはEntityタイプであり、AddressはInlineタイプである。
エンティティの特徴。エンティティタイプは構造上は複合タイプと同様であるが、これにはインラインタイプと区別するいくつかの特徴がある。これらの特徴はエンティティインスタンスに特別な操作セマンティクスを与える。エンティティとは、エンティティタイプのインスタンスのことである。エンティティは、独立して存在できるCDMデータの最小単位である。これは、以下の特徴を示す。
アイデンティティ:あらゆるエンティティはアイデンティティを有する。このアイデンティティは、その存続期間中にエンティティおよびそのエンティティのみを参照するように保証される。アイデンティティの存在は、そのエンティティへの参照が利用可能であることを示唆する。
エンティティアイデンティティは、なぜエンティティが「トップレベル」データ単位であるか、すなわち、あらゆるエンティティが参照可能であり、したがって照会、更新、および他の操作で使用可能であるかの理由である。
整合性の単位:照会および更新は、エンティティレベルでの整合性が保証される。エンティティはコピー、移動、削除、バックアップ、復元などの、ほとんどのCDP操作のターゲットである。これらの操作はインラインタイプをターゲットにしない。
トランザクションの単位:トランザクションはエンティティレベルで発生する。言い換えれば、エンティティは別々に処理されるが、インラインタイプは常に収容エンティティとの関連において処理される。
リレーションシップに関する単位:リレーションシップは、インラインタイプではなくエンティティのレベルで指定される。エンティティは構成および参照アソシエーションを介して互いに関係することが可能であり、インラインタイプインスタンスはリレーションシップのソースまたはターゲットになることはできない。
持続性の単位:エンティティは持続性の単位である。インラインタイプはそれ自体は持続せず、エンティティの一部としてのみ持続する。本来、インラインタイプは値によって動作するため、エンティティの一部として格納しなければならない。
しかしながら、CDMそれ自体は、エンティティを持続させることを暗示せず、またこれを必要ともしないことに留意されたい。CDMは、エンティティがメモリ内にあるかまたは持続するかにかかわらず、整合性を維持する。
共有の単位:エンティティはデータモデル内での共有の単位である。例えば、LOBアプリケーションはProductの概念を有する。Supplierは1つまたは複数の製品を供給し、Orderは1つまたは複数の製品を有する。製品情報の冗長なストレージを避けるために、Productエンティティを定義することが可能であり、このエンティティのインスタンスへの参照をOrderおよびSupplierエンティティ内に挿入することができる。他方で、Productがインラインタイプである場合、OrderおよびSupplierの両方がProductインスタンスを含まなければならず、これが、冗長なストレージならびにその結果生じる異常の挿入、削除、および更新につながる。
図23は、エンティティおよびインラインタイプがSDLを使用して宣言される方法を示す図である。エンティティは、14〜27行目に示されるように<EntityType>要素を使用して宣言される。エンティティタイプのプロパティは、インラインタイプ(定義による)である。何種類かのインラインタイプがある。スカラタイプ:スカラタイプはさらに単純、参照、および列挙タイプに細分できることを想起されたい。単純インラインタイプはCDMフレームワークに組み込まれており、ある意味ですでに宣言され、使用可能である。図23の例では、こうしたタイプの使用が8、9、10、11、12、15、および18行目に示されている。
列挙タイプは、1〜5行目に示されるように<EnumerationType>要素を使用して宣言される。いったん宣言されると、これらのタイプを任意の複合またはエンティティタイプ内で使用することができる(8行目を参照)。
XMLおよびFILESTREAMタイプ(この例では図示せず)は組み込みタイプであるが、正確にはスカラではない(すなわちデータモデルは、これらのタイプの内部が範囲限定であると推論することができる)。
複合タイプは、7〜13行目に示されるように<ComplexType>要素を使用して宣言される。複合タイプのプロパティは、任意のインラインタイプ、すなわちスカラ、コレクション、または複合タイプとすることが可能である。いったん宣言されると、複合タイプを任意の複合またはエンティティタイプ内で使用することができる。
コレクションタイプは、コレクションキーワードおよびこれに続くインラインタイプの名前を使用して宣言される。AddressTypeのコレクションが22行目に示される。
前述のように、エンティティの基本的な特徴は、一意のアイデンティティを有するという事実である。エンティティアイデンティティは、エンティティを更新しても存続を続け、その存続時間全体にわたって同じエンティティを識別し続けることが保証される。エンティティは、キー属性も有する。このキーは、1つまたは複数のプロパティで構成される。エンティティキーは、EntitySet内で一意であることが必要である。インプリメンテーションはエンティティキーを使用して、エンティティアイデンティティを生成することができる。エンティティキーは、<EntityType>要素の「Key」属性を使用して指定される。スカラ(参照タイプを含む)または複合タイププロパティの任意のセットは、キー内の少なくとも1つのプロパティがnull不可である限り、エンティティタイプへのキーとして働くことができる。コレクションタイププロパティは、キーの一部であってはならない。
エンティティタイプ階層の基本タイプのみがキーを指定できることに留意されたい。派生タイプは、基本タイプから自動的にキーを継承する。これにより、値の置換可能性(多相性)を決定論的に動作させることがサポートされる。
エンティティ参照。エンティティはアイデンティティを有するため、エンティティ参照を有することが可能である。CDMのこのインプリメンテーションでは、エンティティ参照は主にリレーションシップナビゲーションに使用される。例えばCustomerエンティティは、Customer_Orderリレーションシップを介してOrderエンティティに関係付けられる。Orderが与えられると、Orderエンティティ上の特別なプロパティ(リレーションシッププロパティとして知られる)を使用して関連付けられたCustomerを見つけることができる。このプロパティはRef(Customer)タイプである。キーワードRefは、これが他のエンティティタイプへの参照であることを示す。
エンティティタイプまたは複合タイプ内にRefタイププロパティを明示的に定義することもできる。このプロパティは、参照されるエンティティへの「ポインタ」として働く。Refタイププロパティの存在は、収容するエンティティタイプと参照されるエンティティタイプとの間のリレーションシップを定義または暗示しない。リレーションシップは明示的に定義されなければならない。持続エンティティの場合、参照は永続的である。
インラインタイプ。エンティティは、単独でトップレベルに存続するか、またはエンティティセット内に含まれる。エンティティを、他のエンティティまたは複合タイプ内に直接埋め込むことはできない。他方で複合タイプは、他の複合タイプまたはエンティティタイプ内に埋め込むことができる。すなわち、エンティティおよび複合タイプのどちらも、タイプが複合タイプのプロパティを有することができる。
スカラタイプおよびコレクションも、他の複合タイプまたはエンティティタイプ内に埋め込むことができる。これが、複合タイプ、コレクション、およびスカラタイプがまとめてインラインタイプとして参照される理由である。
エンティティセットおよびエンティティ制約。エンティティインスタンスがどこに存在するかを記述するのに役立つシナリオが2つ提供されている。エンティティインスタンスは、何らかのデータストア内で持続する。CDMそれ自体は、ストアにとらわれないように注意深く作成されている。理論的には、様々なストレージ技術を介してインプリメントすることができる。エンティティはメモリ内にも一時的に存在する。CDMは、メモリ内で具体化される方法、およびアプリケーションに対して使用可能とされる方法は指定しない。アプリケーションは、通常、様々なタイプのエンティティの複数のインスタンスを処理する。これらのインスタンスは単独でトップレベルに存在するか、またはエンティティセット内に含まれることが可能である。エンティティセットは、所与のタイプ(またはそのサブタイプ)のエンティティのインスタンスを含む。エンティティキーは、エンティティセット内で有意である。エンティティセット内の各エンティティは、一意のキーを有するはずである。
エンティティコンテナは、1つまたは複数のエンティティセットのグループである。エンティティコンテナは、アソシエーションおよび構成のリレーションシップをスコーピングするために使用される。エンティティコンテナは、それを介してバックアップ、復元、ユーザ、ロール、および他のそうしたセマンティクスが定義される、持続性および管理単位でもある。
スキーマは、タイプ、リレーションシップ、および他の名前を保持するための組織構造である。これは、その中で通常の名前の一意性規則が適用される、ネームスペースを提供する。スキーマは<Schema>要素を使用して定義され、SDLファイルのトップレベル要素である。すべてのエンティティ、リレーションシップ、複合タイプなどは、スキーマ内で定義される。どこで定義されたスキーマも、<Using>要素でインポート可能であり、そこで定義されたタイプは、それらの完全修飾名を使用して参照することができる。また、完全修飾構文Namespace.Type−nameを使用して、他のスキーマ内で直接(例えば<Using>要素を持たずに)タイプを使用することも可能である。任意の配置されたスキーマ内に定義されたタイプは、そのタイプの完全修飾名を提供することによって使用できる。
CDM指定は、SDL内にタイプが書き込まれると何が生じるべきかに関して明言しない。SDLに書き込まれるタイプに関して、CDMをインプリメントするCDPは、SDL記述を入手してこれらのタイプをストア上に配置するツールを提供する。ストアの性質に応じて、この配置はストアレベル抽象化の作成を含むことができる。例えば、ストアがRDBMSの場合、配置はスキーマおよびタイプに対応するデータベースおよびテーブルを作成することになり、制約およびデータモデル強制のためのSQLコードも作成する可能性がある。別の方法として、データベースのテーブルをCDMタイプにマッピングすることによって、既存のテータベースでCDPを使用することもできる。
ストアレベルアイテムの作成に加えて、CDPツールは、タイプおよびリレーションシップに対応するCLRクラスも生成することになる。このインプリメンテーションは、<Schema>要素のNamespace属性を使用して、これらのクラスをスコーピングするためのCLRネームスペースを作成することができる。CDPは、CDMタイプへの既存のオブジェクトモデルのマッピングもサポートする。CDMタイプはストアを必要としないことに留意されたい。メモリ内配置が可能である。
実世界データの任意の有意セットは、その構成要素部分間に常にリレーションシップを有する。例えば、**顧客**は1つまたは複数の**注文**を発注し、**注文**は**注文明細**を含み、**製品**は1つまたは複数の**供給業者**から入手可能である(
)、などという具合である。この文章では、データは**で囲み(英文ではイタリック)、それらの間のリレーションシップは下線を施してある。明らかに、リレーションシップの概念はいずれのデータモデル化の努力にも不可欠である。リレーショナルモデルはリレーションシップを明示的にサポートせず、基本キー、外部キー、および参照保全性は、リレーションシップによって暗示される制約のうちのいくつかをインプリメントするためのツールを提供する。CDMのキー値は、データモデル自体の中の最高クラス概念としてのリレーションシップのそのサポートである。これにより、より単純かつリッチなモデル化機能が可能になる。リレーションシップサポートは、CDM照会にも延在し、これによって照会内でリレーションシップを明示的に参照することが可能であり、リレーションシップに基づいてナビゲートする機能が提供される。
図24は、CDMによってサポートされる多くの種類のリレーションシップを示す図である。実世界モデル化シナリオでは、異なる次数(単項(unary)、2項(binary)...)、多重度(1対1、1対多数、多数対多数...)、およびセマンティクス(包含(containment)、ピアツーピア...)を有する、多くの異なる種類のリレーションシップが存在する。CDMは、これら異なるタイプのリレーションシップすべてをモデル化する機能を有する。CDMでは、リレーションシップはエンティティレベルで定義される。エンティティを関係付けるには、アソシエーションおよび構成の2つの方法がある。アソシエーションは「ピアツーピア」リレーションシップをモデル化し、構成は「親子」リレーションシップをモデル化する。
モデル化セマンティクスは、様々な操作に対して単位として動作する関係エンティティを要求することができる。例えば、図24のOrderとOrderLineとの間のContainsリレーションシップについて考えてみる。Orderでのコピーまたは直列化操作が、結果として関連付けられたOrderLinesのコピーまたは直列化も発生させることになると予想するのは妥当である。CDMは、削除、コピー、直列化、機密保護(secure)、およびロックの、少なくとも5つの操作を定義する。これらの操作に応答して、関係エンティティ上で動作を指定することができる。アソシエーションおよび構成の参照に加えて、エンティティを関係付ける他の方法には、条件付アソシエーションおよびアソシエーションエンティティの2つが存在する可能性があることに留意されたい。
アソシエーションは、データモデル化における最も一般的で有用なリレーションシップの1つである。アソシエーションの古典的な例は、CustomerエンティティとOrderエンティティとの間のリレーションシップである。通常、このリレーションシップには、各Orderが厳密に1つのCustomerに関連付けられる多重度が含まれる。あらゆるCustomerは、ゼロまたはそれ以上のOrdersを有する。このリレーションシップは操作の動作も含むことが可能であり、あたかも単位であるかのように関係エンティティ上で動作するために有用である。例えば、顕著なOrdersを有するCustomerが削除、コピー、または直列化された場合、対応するOrdersにとっても、削除、コピー、または直列化されることが望ましい。<Association>要素は、このリレーションシップをモデル化するために使用される。
<End>上の「Type」属性は、リレーションシップに関与するエンティティタイプを定義する。
「Multiplicity」属性は、エンドの濃度を定義する。この例では、ゼロまたはそれ以上の注文(値は14行目の「*」)に対して厳密に1人のCustomer(値は15行目の「1」)が存在することが指定される。この属性の他の値は以下のとおりである。
・ 「0..1」−−ゼロまたは1
・ 「1」 −−厳密に1
・ 「*」 −−ゼロまたはそれ以上
・ 「1..*」−−1つまたは複数
・ 「n」 −−厳密にn
・ 「n..m」−−nからmの間(nおよびmを含む)、nはmより少ないかまたは等しい
16行目の<OnDelete>要素は、削除操作の操作動作を指定する。1つの属性「Action」を有し、これは3つの値のうちの1つを有することができる。Cascade−−Customerに属するすべてのOrderを削除する。これは上記の例に示されている。Restrict−−顕著なOrdersが存在する場合にCustomerの削除を防止する。RemoveAssociation−−OrdersとCustomerとの間のリレーションシップを除去する。整合性のあるセマンティクスを有するために、<OnDelete>要素はリレーションシップの一方のエンドにのみ可能であることに留意されたい。
CDMは、コピー、直列化、機密保護、およびロックの他の操作の動作も指定することができる。これらはすべて、形式<OnOperation Action=“...”>のサブエレメントを使用することによって、削除動作について示したのと同じパターンに従う。操作動作の指定は、アソシエーションと構成の両方で実行可能である。
アソシエーションモデルのピアツーピアリレーションシップ。構成は、厳密な包含(親子)リレーションシップをモデル化する。構成の従来の例は、Orderとそれに対応するLineアイテムとの間のリレーションシップである。注文ラインは、その親注文によって完全に制御される。意味論的には、収容する注文の外部には有意な存在はない。注文を削除すると、強制的にすべての注文ラインが削除される。したがって、OrderおよびLineエンティティは、構成を介して関係付けられていると呼ばれる(すなわち、Orderは1つまたは複数のLineエンティティで構成される)。
構成リレーションシップは、以下の3つの特徴を有する。
一意性:所与の親の子は、それらの間に一意のキーを有しているはずである。例えば、Orderに属しているLineは、これを同じOrderに関する他のすべてのLineと区別するために一意のキーを有しているはずである。これをインプリメントする一般的な方法は、子のキーと親のキーとを組み合わせることによって、子のアイデンティティを派生させることである。
カスケード削除:親を削除すると、子が削除される。
多重度:親の多重度は1である。これは、OrderなしではLineが存在できないという意味論を表す。
<Composition>要素は、構成をモデル化するために使用される。
1つの構成につき親は常に1つであるため、親の「多重度」は指定する必要がないことに留意されたい。事実、構成の親に1以外の「多重度」を指定することは誤りである。多重度は子エンドに指定可能であり、以下の値のいずれかを有することができる。
操作動作は、構成上でコピー、直列化、機密保護、およびロック操作について指定可能である。構成は常にカスケード削除セマンティクスを有するので、<OnDelete>を指定する必要がないことに留意されたい。xが「Cascade」に等しい<OnDelete Action=“x”>を指定すること、および子エンドで<OnDelete>を指定することは誤りである。
あたかも1つの単位であるかのように関係するエンティティ上での操作は、しばしば有用である。例えば、Orderエンティティをコピーする場合、通常、対応するLineエンティティも同様にコピーされることが望ましい。CDMは、これらの動作を、削除、コピー、直列化、機密保護、およびロックという様々な操作に指定することができる。使用される一般的なパターンは、<OnOperation Action=“value」/>の形のサブエレメントを定義することである。Operationは、Delete、Copy、Serialize、Secure、またはLockのうちの1つとすることができる。Operationに応じて、「Action」の値はCascade、Restrict、RemoveAssociationなどとすることができる。
操作セマンティクスを指定する場合、以下の点に留意されたい。すべての<OnOperation.../>要素はリレーションシップエンドの1つだけに指定するものとする。(例えば)Customerに<OnDelete>を指定し、Orderに<OnCopy>を指定することは、正しくない可能性がある。ここでの概念上のモデルは、リレーションシップのエンドの1つが制御の役割を果たし、操作セマンティクスはそのエンティティから他のすべてのエンドへとカスケードする、というものである。構成に<OnDelete.../>を指定する必要はない。定義により、構成の親を削除すると、その操作は子までカスケードする。すべての<OnOperation.../>要素は、構成の親に指定されるものとする。Action=「Cascade」で<OnDelete>または<OnSeure>を指定するエンドは、多重度「1」を有するものとする。そうでない場合、セマンティクスは不整合になる。
CDM内のリレーションシップは、それに関与しているタイプ以外で定義される。タイプ自体はリレーションシップを確立するために特別なプロパティを有する必要がない。例えば、Order_Customerリレーションシップはトップレベル<Association>要素を使用して指定可能であり、CustomerおよびOrderタイプは、それらの中に互いにリレーションシップに関与していることを示すためのプロパティまたは他の識別マークを持たない。
照会またはAPIで、リレーションシップの一方のエンドから他方へとナビゲートするための様々なメカニズムが想定可能である。例えば、CDP APIは各リレーションシップに静的クラスを有し、このクラスがナビゲーションに使用できるメソッドを有する。Order_Customerの例を利用すると、クラスにはOrder_Customerと命名し、メソッドはGetOrdersGivenCustomer(...)などとなる。
しかしながら最も直感的な方法は、リレーションシップのいずれかのエンドに実際にプロパティを有することである。例えば、OrderがCustomerと呼ばれるプロパティを有する場合、ナビゲーションはプロパティにアクセスするのと同様に単純になる。リレーションシップナビゲーションに関するこの単純なパターンを実行可能にするために、CDMはリレーションシッププロパティの概念を有する。関係エンティティにナビゲーションの目的を示すために、これらをエンティティ上に定義することができる。リレーションシッププロパティは、<RelationshipProperty>要素を使用して定義される。<RelationshipProperty>要素は、3つの属性を有する。「Name」はプロパティの名前を定義する。この名前を照会またはAPIで使用して、リレーションシップの他方のエンドへナビゲートすることができる。「Relationship」は、アソシエーションまたは構成の名前を指定する。「End」はナビゲーションターゲットを識別する。リレーションシッププロパティはアソシエーションと構成の両方のリレーションシップに対して定義可能であり、リレーションシップのいずれかのエンドで定義可能である。
「通常の」プロパティとは異なり、リレーションシッププロパティは「Type」属性を持たないことに留意されたい。これは、それらが暗黙的にEntity Ref(またはEntity Refのコレクション)にタイプ付けされるからである。このエンティティ参照は、ターゲットエンティティへのナビゲーションに使用される。
リレーションシッププロパティは、ターゲットとするエンドの多重度に応じて、単一のEntity RefまたはEntity Refのコレクションのいずれかである。以下の表は、「多重度」に可能な値と、対応するリレーションシッププロパティのタイプを示す。
前述のように、エンティティはトップレベルに「単独」で存在するか、またはエンティティセット内に常駐する(それ自体がエンティティコンテナ内にある)ことができる。リレーションシップの2つのエンドとの関連における状況を考えてみる。「浮動性(free floating)」エンティティの場合、リレーションシップの両方のエンドはエンティティの海のどこかに存在する。エンティティが複数のエンティティセットにグループ化される場合を考えてみる。例えば、以下のスキーマフラグメントについて考える。
エンティティコンテナ(LOBData)は、Orders、GoodCustomers、およびBadCustomersの3つのエンティティセットを有する。GoodCustomers内のすべてのCustomerエンティティはかなり立派な信用度を有するため、発注するに値するとみなされる。BadCustomersは、その支払いを怠っている。ここでの明白なビジネス規則は、GoodCustomersのみにOrderの発注を希望することである。言い換えれば、GoodCustomers内のエンティティのみがOrdersを有するように、Customer_Orderリレーションシップの範囲を制約する。さらに、すべてのOrdersはOrdersエンティティセット内に常駐していなければならない。これは、以下に示されるように、<EntityContainerType>内で<Scope>要素を使用することによって実行される。
<Scope>(5行目)要素は1つの属性「Relationship」を有し、これは、エンドがスコーピングされているアソシエーションまたは構成を識別する。リレーションシップの各エンドにつき1つの<End>サブエレメントは、このエンドのスコーピング先のエンティティセットを指定するために使用される。6行目では、CustomerエンドがGoodCustomersエンティティセットにスコーピングされることがわかり、7行目では、OrderエンドがOrdersエンティティセットにスコーピングされることがわかる。
配置されたスキーマがエンティティコンテナを有する場合、各リレーションシップの各エンドは、エンティティコンテナ内の1つだけのエンティティセットにスコーピングされる。所与のアソシエーションまたは構成に対して明示的な<Scope>節がない場合、インプリメンテーションはエンドをデフォルトのエンティティセットにスコーピングする。暗黙のスコーピングが実行される方法は、インプリメンテーション定義済みである。
CDMは、構成についてのより厳密なスコーピング規則を指定することができる。OrderとLineとの間の構成を考えてみる。対応するOrderなしにLineが存在しても意味を成さない。したがって、Lineエンティティを含むエンティティセットは、あらゆるLineが1つだけのOrderの子であるものとするビジネス規則を強制すべきである。これは、<Requires>要素を使用して実行される。
以下のスコーピング要件は、前述の例によって満たされる。Shipment_LineのLineエンドは、ShipmentLinesエンティティセット(16行目)へとスコーピングされるものとする。ShipmentLines内のあらゆるLineはShipment_Line構成のエンドでなければならない。これは、<Requires>要素を使用して7行目で実行される。この要素は1つの属性「Relationship」を有し、これが構成を識別する。Order_LineのLineエンドはOrderLinesエンティティセット(12行目)へとスコーピングされるものとする。OrderLines内のあらゆるLineは、Order_Line構成のエンドであるものとする(4行目)。エンティティセット内に<Requires>要素がない場合、任意の所与の構成に属するエンティティを有するように制約されない。これは、多くのモデル化シナリオにおいて重要な要件である可能性がある。<Requires>要素を使用して、1つだけの構成名を指定できることに留意されたい。
これまでのCDMの代替の説明は、厳密にエンティティがどこに常駐するかにはとらわれないものであった。エンティティはメモリ内に常駐するか、または実際にストア内に永続的に存続することが可能である。コアCDMは、エンティティがどこに常駐するかについて暗示、要求、または留意することがなく、エンティティはメモリ内に常駐するかまたは持続することが可能である。次に、持続性エンティティについて、および持続性の概念をCDMがどのようにサポートするかについて説明する。
エンティティコンテナは、エンティティ用のトップレベルの組織単位であり、持続性セマンティクスが定義されるレベルである。エンティティとは、持続可能なデータの最小単位である。典型的には、持続エンティティは、コピー、移動、バックアップ、復元、直列化などのそれらに関する操作セマンティクスを有する。エンティティコンテナは、これらのセマンティクスが定義できる持続性の単位である。これは、バックアップ、復元、ユーザ、ロールなどの管理概念が定義される組織単位でもある。この意味で、エンティティコンテナはSQLデータベースに類似している。
エンティティコンテナは、すべてのエンティティがその中に常駐する1つまたは複数のエンティティセットを有する。したがって、エンティティコンテナのインスタンスを定義することで、ストレージ割り振りプロセスが活性化(jump−start)される。通常、タイプ設計者はエンティティコンテナタイプを定義する。CDMそれ自体は、エンティティコンテナインスタンスがタイプからどのように取得されるか、および、このインスタンスが基礎となるストレージ構造にどのようにマッピングされるか(EntityContainer−>Database、Entity set−>table(s)など)を定義しない。CDPは、エンティティコンテナ(とそれに含まれるタイプ)の間でのSQLストレージへの規範的マッピングのセットを定義する。CDPは、同様に非規範的(ユーザ指定可能)マッピングも可能である。
一般にアプリケーションは、選択した任意の方法でエンティティを自由に編成し、CDMはいかなる特定の組織構造も指示しない。しかしながら、持続エンティティについて言えば、エンティティ、エンティティセット、およびEntity Containerのセマンティクスはある種の構造組織を暗に示す。エンティティが持続する場合、あらゆるエンティティはエンティティセット内で存続するはずであり、あらゆるエンティティセットはEntity Container内で存続するはずであり、Entity Containerはトップレベルで存続するはずである。
図25は、CDMにおける持続エンティティに関する構造組織を示す図である。これは物理的なものでなく、データの論理的表現である。図示された各エンティティセットは、例えばテーブルにマッピングすることができる。このテーブルは、ほぼ間違いなくリレーションシップを表すための追加の列を有することになる。Ordersエンティティセットが、CustomerID列を有するOrdersテーブルにマッピングされると想定することができる。CDMはストレージマッピングを規定しないため、記述は論理レベルで維持されてきた。あらゆるエンティティはエンティティセット内に常駐することがわかる。さらに、あらゆるエンティティセットがEntityContainer内に含まれる(インスタンスビュー内のMyLobDB)。構造組織のこの説明を完結させるために、CDMストアが1つまたは複数のEntityContainersからなることに留意されたい。
すべてのアプリケーション開発者がタイプを定義するわけではなく、そのほとんどが、他のISVによって定義および配置されたタイプを使用する。本明細書には、オリジナルタイプの精度を低下させることのない特定の方法で、事前に定義されたタイプを拡張することができるタイプのユーザ用のメカニズムが提供される。Entity ExtensionsおよびExtensible Enumerationsは、タイプの独立した拡張可能性を可能にするためにCDMで提供される2つの機能である。
図26は、このCDMのインプリメンテーションにおけるエンティティ拡張の使用を示す図である。エンティティ拡張の必要性および使用を動機付けるために、ContractTypeについて考えてみる。これは、Name、Address、およびPhoneNumberについての標準プロパティを有する。GPS(全地球測位システム)ソフトウェアISVが、このタイプに緯度および経度の情報を追加したいと想定する。これを実行するための1つの方法は、実際のContactTypeを修正することであり、システム内にこのタイプの他のユーザが多数存在するため、これは望ましくない。他の方法は、ContactWithGPSTypeと呼ばれるContactTypeから、新しいクラスをサブタイプ化することである。これは、AddressTypeのすべてのユーザがContactWithGPSTypeを使用するために自分のコードを変更しなければならなくなることを意味し、さらに、GPS情報はこの新しいタイプに書き直さなければならないため、システム内の既存の連絡先に追加することができない。
CDMは、エンティティ拡張の概念によって、この問題を簡潔明快に解決する。エンティティ拡張は参照可能な構造化タイプであり、エンティティが含むことの可能な任意のメンバ、プロパティ、メソッド、および算出プロパティを含むことができる。拡張は、<EntityExtensionType>要素を使用して定義される。拡張タイプは継承を享受しない。<EntityExtensionType>は、<EntityType>内に存在可能な任意の要素を含むことができる。プロパティ名にとって、すべての拡張にわたって、あるいは拡張されるタイプのプロパティにわたって、必ずしも一意である必要はない。
存続時間管理。拡張は、各拡張タイプが、それが延在するエンティティタイプを指定するため、エンティティに緊密に結合される。すべてのエンティティ拡張は、タイプRef(T)の「Entity」と名付けられたデフォルトのプロパティを有し、ここでTはExtendsTypeの値であり、これはエンティティインスタンスを指し示し、これが拡張である。これは、拡張内のエンティティキーとして図26に概略的に示されている。
拡張は、延在しているエンティティ外部に独立した存在を持たない。CDMは、拡張の存続期間管理がインプリメンテーションの一部であることを要求し、すなわちインプリメンテーションは、対応するエンティティが削除された場合、すべての拡張を削除するはずである。この意味で拡張は、対応するエンティティの構成であるのと同様に動作する。たとえエンティティ拡張インスタンスが、収容エンティティによって定義されたデータの凝集単位の一部とみなされる場合でも、トランザクションを使用してアプリケーションによって明示的に管理される場合を除き、エンティティおよび拡張への変更に関する整合性の保証はない。
インスタンス管理。InstanceManagement=「Implicit」の場合、拡張で定義されたすべてのプロパティは、null可能である、デフォルトの値を指定する、または最低発生数制約がゼロのCollectionタイプを有するの、いずれかのはずである。単集合インラインタイププロパティは、デフォルトの値を指定することはできないため、null可能でなければならないことに留意されたい。これにより、常に存在するかのように拡張に対して照会を実行することができる。
InstanceManagement=「Explicit」の場合、アプリケーションは、共通データモデル用の照会言語で定義された操作を使用して、拡張を明示的にエンティティインスタンスに追加、およびエンティティインスタンスから除去するはずである。拡張の有無を調べるための手段も提供される。
拡張可能性の防止。タイプ設計者は、所与のタイプについての拡張の作成を防止したい場合がある。これは、<EntityType>または<AssociationEntityType>要素の「Extensible」属性によって実行可能である。「true」(これはデフォルト値である)に設定された場合、<EntityExtensionType>群をこのエンティティ用に定義することができる。これを、このタイプへの拡張を防止するために「false」に送ることができる。
拡張可能列挙および列挙別名。売主またはその顧客が配置されたタイプのセットを発展させると、時には既存の列挙に名前を追加する必要が生じることがある。例えば、おそらく2795では[Corolla,Camry,MR2,Celica,Avalon]の名前を有した、ToyotaCarModelsと呼ばれる列挙を考えてみる。しかしながら2005では、追加の名前、Prius、Echo、Matrix、およびSolaraを有する必要がある。
列挙は、<EnumerationExtensionType>要素を使用して拡張することができる。この例を以下に示す。
7行目では、列挙タイプ「C」が、名前「Q」、「S」、および「T」を追加するために拡張される。12行目では、名前「T」および「U」を追加することによって、「C」に対して別の拡張が実行される。列挙メンバは、基礎となる基本または列挙拡張タイプの名前によって常に修飾されるため、拡張における重複名はOKである(この例ではD.TおよびE.T)。
既存の列挙メンバ名に対する別名を有することがしばしば有用である。この従来の例は、Seasons列挙で生じる。アメリカ合衆国では、季節は[spring,summer,fall,winter]である。イギリスまたはインドでは「fall」は「autumn」と呼ばれる。両方の名前が定義できるが、これらを概念的に同じ列挙メンバにマッピングさせることが望ましい。<EnumerationMember>要素内の「AliasesMember」属性は、既存の名前に別名を定義する。この例では、C.R、D.T、およびE.UはすべてC.Qの別名であるため、一意の名前を表すものではない。
図27は、タイプに関するモデルのセマンティクスを明確にする、代替インプリメンテーションのCDMメタモデルフラグメントを示す図である。
図28は、プロパティに関するモデルのいくつかのセマンティクスを明確にする、代替インプリメンテーションのCDMメタモデルフラグメントを示す図である。
図29は、アソシエーションに関するモデルのいくつかのセマンティクスを明確にする、代替インプリメンテーションのCDMメタモデルフラグメントを示す図である。
図30は、図に示されたリレーションシップのいくつかの態様を示す図29のUML構成図である。
図31は、代替インプリメンテーションの拡張リレーションシップを示す図である。
CDMタイプシステム
以下の表は、システムの再帰的構造、すなわち有限文法によって暗に示される正しいセンテンスの無限セットを表す、CDMタイプシステムを抽象構文の形で示す。まず、タイプシステムが全部提示され、次いでやはり説明文と小規模な例が提示される。
構造タイプ
公称タイプ
基本タイプ
anameシンボリック属性名(すなわちメンバ名)
enameシンボリックエンティティタイプ名
cname複合タイプのシンボリック名
sname他のタイプに関するシンボリック同義語
rname2項リレーションシップのシンボリック名
esnameエンティティセットのシンボリック名
ecnameエンティティコレクションのシンボリック名
scalar重要な内部構造のない基本タイプ
enum列挙されたシンボルのタイプ
constraint一次述語計算(first−order predicate calculus)における式
構造タイプ。定義の第1ブロックは、CDM構造タイプを含む再帰的に閉じた2次文法である。この2次文法内のセンテンスが参照できるのは、(1)同じ2次文法内の他の用語、(2)名前のみによる公称タイプ、(3)基本タイプの最終ブロックの用語、のみである。基本タイプは、どこかで開発される様々なネームスペースおよび簡単なタイプのみを含む。ただ1つの例外(エンティティコンテナにおけるコレクションタイプ)は、構造タイプは直接インスタンス生成できないことである。代わりにこれらはエンティティタイプを構築するが、これは一種の公称タイプであり、データのインスタンスを生成するための基本的な方法である。
SimpleTypeは、scalar、enum、cname、sname、またはenameへの参照のいずれかである。scalarは、マシンプリミティブ整数、SQL10進数、あるいは.NET StringまたはDateTimeのような、重要な内部構造を持たない基本タイプである。非常に重要な種類のscalarタイプはGUIDである。このタイプは、あらゆるインスタンスが空間および時間を横切って普遍的に一意である、プロパティを有する。基本的には、システム生成または代理キーのタイプとして使用される。enumは、C#、Visual Basic、または他の.NETプログラミング言語で見られるような、簡単な列挙タイプである。cnameは、以下に定義された公称タイプの1つである、complexTypeの名前である。snameは、名前付きタイプインラインの定義の作成と意味論的に同様の、typeSynonymである。snamesは公称タイプを参照できない、単なる構造タイプに関する同義語であることに留意されたい。最後にenameは、公称タイプの基本種類であるentityTypeの名前である。enamesは、エンティティタイプのみが最上級参照を有することを強調するために、リテラルRef<>表記で囲まれる。エンティティへの参照は、リレーショナルデータベース内の外部キーをモデル化する。CDMは、タイプベースのリレーションシップを介して、この使用法を公式化する。
一般に等価性には、第1に、2つのタイプの式が同じタイプを示すかどうか、第2に、単一の所与のタイプの2つのインスタンスが等しいかどうか、という2つの面がある。「タイプの等価性」という用語は前者に使用され、「値の等価性」または「インスタンスの等価性」は後者に使用される。
単純タイプの等価性は簡単であり、2つの単純タイプが明らかに同じであるか否か(enumsが同じ順序で同じシンボリックタグを有していなければならない)である。単純タイプの値の等価性は、原則として、ビット単位の比較によって定義される。実際には、.NETタイプのいくつかはより複雑な等価性オペレーションを有することになる。あらゆる単純タイプが、タイプの2つのインスタンスを利用してブール変数を戻す、等価性演算子を提供しなければならないとだけ言えば十分であろう。
tupleTypeは、structuralType anameの形の1つまたは複数のペアであり、それぞれの後にオプションのハッシュマークが付き、すべて「大括弧」で囲まれる。タプル(tuple)タイプは、それぞれが名前とstructuralTypesのうちの1つとを再帰的に有する、メンバまたは属性からなるC#クラス定義のペイロードと同様である。属性の名前はタイプanameであり、すなわち、ename、cnameなどのそれとは別のシンボリック名の領域から取り出される。名前による属性へのいかなる参照も、明白でなければならない。
タプルタイプの等価性は、2つのタプルタイプの属性が同じ名前およびタイプを有し、さらに同じ順序で現れる場合にのみ、この2つのタプルタイプは等しい、と定義される。したがって、{TA A,TB B}および{TB B,TA A}は、まったく異なるタプルタイプである。その理由は、CDMの認識では定位置アクセス構文をサポートしているからである。タプルタイプの2つのインスタンスは、それらの属性のタイプおよび値が再帰的に等しい場合に等しい。
ハッシュマークはキー指定を構成する属性を示し、ある種の環境では、ハッシュマークが付けられた属性の値は、集合的にコレクションタイプセット内またはentitySets内で一意でなければならないことを意味する。あるタイプ内で複数の属性がハッシュマークを有する場合、そのキーは、マークが付けられたすべての属性からなり、テキスト内で定義された順序で連結された、複合キーである。複合キーは、複数のタプルタイプに及ぶことが可能であるため、例えば以下のようになる。
キー指定は{B,C}である。さらに長い例を考えてみる。
これは、personName、socialSecurityNumber、およびaddressと名付けられた3つの属性を備える連絡先カードのトイ(toy)タプルタイプである。これらの属性はそれぞれ、人物の名前に関する自由形式の文字列と、エンティティセットまたはセットコレクションで一意のキーとして働くようにハッシュマークが付けられた社会保障番号の3つの部分を含むネストされたタプルと、番地、都市、州、および2つの部分からなる郵便番号を含み、より深くネストされたタプルとして再度表されたネストされたタプルとの、3つのタイプを有する。
collectionTypeは、それぞれが他の構造タイプによってパラメータ化されたList、Set、Multiset、またはその他のいずれかである。たいていの場合、コレクションタイプはエンティティの構成要素として間接的にインスタンス化される。しかしながら、以下で説明するように、エンティティコンテナ内部で直接インスタンス化することもできる。
リスト。リストは、structuralTypeのインスタンスの順序付けされたコレクションである。「順序付けされた」とは、正の整数1、2、...からコレクションの要素へのマッピングが存在することを意味する。「順序付けされた」と「ソートされた」を混同してはならず、リスト「1,3,2」は順序付けされているがソートされておらず、「1,2,3」は順序付けとソートの両方がされている。ペアの特別なケースが普及している。ペアとは、単なる長さが2のリストのことである。
リストタイプの等価性は、リストのメンバの構造タイプにわたって再帰的である。(1)同じ数のメンバがいる場合、(2)再帰的にメンバ値が等しい場合、および(3)メンバが同じ順序で現れる場合に、リストタイプの2つのインスタンスは等しい。例えば、List<Int>は、整数のリストのタイプである。
セット。セットとは、重複が許されない、structuralTypeのインスタンスの順序付けされないコレクションである。Set<Int>は、整数セットのタイプである。メンバの挿入、メンバシップのテスト、および共用体、交差などの算出のための操作である。
セットタイプの等価性は、セットのメンバの構造タイプにわたって再帰的である。セットタイプの2つのインスタンスは、同じ数のメンバを含み、再帰的にメンバの値が等しく、順序とは無関係な場合に等しい。
1から上方へのカウントは数学規則であり、プログラミング言語はゼロから上方へカウントする傾向がある。しかしながら数学においてさえも、1からカウントするか、ゼロからカウントするかを決定しないことが通用している。Nで書かれた自然数のセットとしてかなり基本的なものは、0、1、...として、および時には1、2、...として定義される。
マルチセット。マルチセットは、structuralTypeのインスタンスの順序付けされていないコレクションであり、重複が許可される。例えば、
は、文字列のセットのマルチセットのタイプとなり、
は、人物の名前および生年月日の匿名タプルタイプのインスタンスのマルチセットのタイプとなる。
マルチセットタイプの等価性は、マルチセットのメンバの構造タイプにわたって再帰的である。マルチセットタイプの2つのインスタンスは、(1)同じ数のメンバを含む場合、および(2)順序とは無関係であるが重複のカウントに関して、再帰的にメンバの値が等しい場合に等しい。したがって、「1,1,2,3」と「2,1,3,1」はマルチセットとして等しいが、「1,1,2,3」と「1,2,2,3」は等しくない。数学的に、マルチセットの最も簡単な表現は、多重度のカウントおよび値のペアのセットである。マルチセットがそのように表される場合、それらの等価性は自動的であり、セットの等価性およびペアの等価性にのみ依拠する。
公称タイプ。公称タイプは、ドメイン内で一意に命名されなければならない際立った特徴を有する。2つの公称タイプがサブタイプ化リレーションに関与する。これら2つはcomplexTypeおよびentityTypeである。構造タイプのサブタイプ化は理論的にかなり複雑であるため、CDMでは使用できない。
エンティティセットは、名前がタイプRef<e>のエンティティ参照の一部であること、およびインスタンスツリーをルート化する(root)方法の1つであることの、両方の理由から、名目上のものである。その役割において、エンティティセットは、アプリケーションがインスタンスデータを取り出すことができるように名前を持たなければならない。エンティティコレクションも、インスタンスツリーをルート化するものであるため、命名されなければならない。その本質が命名であることから、タイプの同義語は公称タイプである。最終的に、アソシエーションエンティティが共有し、名前によって参照できるように、リレーションは名目上のものである。
公称タイプの等価性は、ある意味で構造タイプの等価性よりも容易である。そのほとんど竜のような形(draconic form)において、2つの公称タイプが同じ名前を有し、その定義においてたとえ構文上であっても何らかの相違点がある場合は、エラーである。
公称タイプの値の等価性は、命名を利用することもできる。特にエンティティタイプの2つのインスタンスは、それらの参照が等しい場合にのみ等しい。これは、エンティティへの参照をそのアイデンティティと呼ぶための弁明の事由である。
それは、6つの異なる種類の公称タイプの宣言である。タイプ同義語は、特定のsnameをsnamesのドメインに導入する。そのsnameがどこかで使用される場合、これが参照するstructuralTypeがsnameの代わりに使用される。例えば、
は、上記に示された連絡先カードタイプのタイプ同義語を定義する。そのタイプ同義語であるtoyContactCardは、逐語定義をコピーペーストまたはキーボード入力するように強制された場合に必ず使用することができる。
complexTypeは、(1)オプションで他の複合タイプを拡張し、ここで(2)あらゆるインスタンスが一次述語計算で表されたオプションの制約に従い、さらに(3)所与の構造タイプが祖先の構造タイプに追加され、属性の衝突は許可されないことを意味する、structuralTypeによって示された追加の構造を有する、cnameを導入する。
CDMは単一の継承を許可し、これは、ある複合タイプが多くとも1つの他の複合タイプを拡張することが可能であることを意味するが、再帰が可能であるため、次に直系の祖先が多くとも1つの他の複合タイプを拡張することが可能である。
複合タイプは、最もリッチな種類の構造化CDMインラインタイプである。インラインタイプは、他のタイプ定義において名前によるそれらへの参照は可能であるが、それらを直接インスタンス化することも、エンティティで生じる可能性のあるインスタンスへの参照を利用することも不可能である。タプルタイプのハッシュマーク付き属性の形の埋め込まれたキー指定が、複合タイプの状況では無視される場合もある。
複合タイプとタイプ同義語との相違は、前者が継承を享受して制約を受けることである。余談として、定理の証明およびモデルチェック技術を介して、コンパイル時にいくつかの制約を統計的にチェックできることに留意されたい。他の制約はランタイム時にチェックしなければならず、この場合、コンパイラが制約チェックコードを出力しなければならない。例えば
は、上記のタイプ同義語によって指定されたペイロードで複合タイプを定義する。
は、すでに定義されたより良好な連絡先カードに基づいて、従業員記録用の複合タイプを定義する。これは、betterContactCardおよびインラインで作成された明示的タプルのすべての属性を有する。
entityTypeは、(1)オプションで他のエンティティタイプを拡張し、ここで(2)あらゆるインスタンスがオプションの制約に従い、(3)オプションでその名前によってリレーションシップを参照し、(4)所与の構造タイプが祖先のエンティティタイプの構造タイプに線形に連結され、属性の衝突は許可されないことを意味する、structuralTypeで示される追加の構造を有する、enameを導入する。
キー指定(ハッシュマーク)も連結され、祖先を伴うエンティティタイプのキー指定は、線形順序で含まれるタプルタイプのキー指定を連結することを意味する。
エンティティタイプはキー指定を有するものとする。これは、エンティティタイプが、その継承チェーンに少なくとも1つのハッシュマークを備えた少なくとも1つのタプルタイプを有することを暗に示す。この制限は、構文が複雑になり過ぎないように意味的に強制される。
オプションのrnameは、特別の属性を備えた2項リレーションである、CDMのアソシエーションエンティティを反映する。詳細については、以下のリレーションシップの項を参照されたい。
CDMは単一の継承を許可するが、これは、エンティティタイプが再帰的に多くとも1つの他のエンティティタイプを拡張できることを意味する。エンティティタイプは複合タイプを拡張することはできず、複合タイプはエンティティタイプを拡張することはできない。言い換えれば、複合タイプおよびエンティティタイプはサブタイプ化の領域に存在する。
エンティティタイプは、entitySetsに関与する最もリッチな種類の構造化CDMタイプであり、タプル内でハッシュマークが付けられた属性はリレーショナルデータベースの通常の意味で基本キーを構築する。さらに、エンティティインスタンスはアイデンティティを有し、これはそのエンティティセットのアイデンティティに連結されるキー値である。これらのアイデンティティは、文法のブロック1に現れる明示的Ref<ename>の値を構築する。
エンティティタイプは、常にエンティティセットとの関連において直接インスタンス可能な基本的種類のCDMタイプであり、ここでも、リレーショナルデータベースの通常の意味において、リレーションまたはテーブルに関するCDMのモデルである。例えば、
は、上記で定義された複合タイプemployeeRecordに基づいて、エンティティタイプを定義する。この点で、以前に無視されたハッシュマークが付けられた属性は、有意性が回復する。employeeRecordはbetterContactCardを拡張し、これはタイプ同義語toyContactCardを使用し、これは埋め込まれた属性
を有することを想起されたい。
属性上のハッシュマークは、社会保障番号がemployeeEntityインスタンスのエンティティセットの基本キーとなることを暗に示す。ユーザがキーに関する社会保障番号を介して従業員番号を設定した場合、ハッシュマークの付いた従業員番号およびハッシュマークの付いていない社会保障番号で新しいタプルタイプを定義するか、古いタイプから新しいタイプを作成するために、以下のハッシュマーク操作オペレーションを使用することが必要となろう。
entitySetは、タイプenameのエンティティの名前付きコレクションである。エンティティセットではエンティティインスタンスの重複は許可されず、エンティティタイプはキー指定、すなわち、ハッシュマークのタグが付けられた1つまたは複数の属性を持たなければならない。エンティティセットの名前esnameが、esnamesの別個のドメインに導入される。
は、社会保障番号をキーとして使用する従業員エンティティのエンティティセットのタイプとなる。
entityContainerは1つまたは複数の用語の名前付きコレクションであり、それぞれがそのesnameまたは匿名コレクションタイプのいずれかによって示されるエンティティセットである。
は、従業員と名付けられたエンティティセットのインスタンスを保持するエンティティコンテナのタイプとなる。エンティティコンテナ内のコレクションタイプをインスタンス化する方法がTBDである。そうでない場合、エンティティコンテナは1つまたは複数のエンティティセット用の単なるカプセルである。
リレーションシップ。CDMは、(1)アソシエーション、(2)条件付アソシエーション、(3)アソシエーションエンティティ、(4)構成という、規範的な形のリレーションシップを必要とする。これらはすべて、数学的リレーションの同じ下位レベル概念の変形であり、以下のように公式化される。
数学的リレーションは、サブセットのすべてのメンバが何らかの制約を満たすような、セットのデカルト積(Cartesian product)のサブセットである。Ai,i=1..nとしても作成された1つまたは複数のセット(A1,A2,...An)のリストを考えてみる。C=A1×A2×...×Anと書かれたこれらセットのデカルト積は、順序付けタプルn−aryのセットである。
C={(a1,a2,...an)|a1∈A1,a2,∈A2,...,an∈An}
デカルト積は、制約がいかなるメンバもフィルタリングによって除去しないことから、セットのリストから形成可能な最大のリレーションである。
完全なデカルト積よりも少ないメンバでリレーションを形成するためには、制約がフィルタリングによってなんらかを除去しなければならない。例えば、1..100と書かれた1から100までの従業員メンバのセットと、1から10までの部門番号のセットについて考えてみる。従業員と部門とを関係付ける1つの方法は、リレーションの名前として記号
を定義すると、以下のとおりである。
上式で、「div」は数論的整数除算(number−theoretic integer division)である。これは、従業員1から10を部門1に、従業員11から20を部門2に、と言う具合に関係付ける。述語は、e∈1..100、d∈1..100、および(e−1)div10=d−1の3つの部分の結合である。
この例では、従業員と部門との間の多数対1のリレーションシップを暗黙的に指定する。これは、以下の2項「演算子」としてリレーションの名前を使用するための標準的な省略法である。
一次述語計算は、一意性、多重度、参照、および条件付メンバシップを含む、実際的関心のすべての制約を表すのに十分である。CDMは、実際に重要または非常に一般的な制約のある種のパターンに名前を与える。例えば、リレーショナルデータベースシステムは、しばしば1対多数のリレーションシップを外部キーによってインプリメントする。CDM参照制約は、ターゲットエンティティセットにおいて、外部キーの値が基本キーとして表わされなければならないステートメントである。その外部キーの値はタイプRef<ename>のインスタンスである。述語計算のパターンは、参照制約のクラスを表すために抽象化することができる。
略式には、制約は、「and」、「or」、および「not」などの論理連結語を介した個々の単語の構成である。各単語はブールタイプの式であり、enameおよびanameによってエンティティの属性と、定数と、≦などの比較演算子と、∀および∃などの修飾子によって導入される変数と、何らかの特別な副次作用のある操作制約とを参照することが可能であり、そのために以下の構文が与えられる。
9つの形の操作制約は、それぞれ、そのenameよって2項リレーションの2つのエンティティタイプのうちの1つを参照する。Cascadeは、操作Delete、Copy、またはSerializeがリレーション内の他のエンティティタイプのインスタンスに伝播するものであることを意味する。Restrictは、操作が、他のエンティティタイプのインスタンスが適合可能な操作を独立して実行する場合にのみ実施されるものであることを意味する。Removeは、操作が完了した場合にリレーションそれ自体が除去されるものであることを意味する。
制約の他の特別な形は、多重度制約であり、
上式で、ni≦miはゼロより大きい自然数である。この形は、述語計算における等価式用の構文上の砂糖(sugar)であり、従来のモデル化シナリオであるため、ここに提供されている。名前付きエンティティタイプは、リレーションでも命名されたものでなければならない。
CDMは、上記のいずれのカテゴリにも入らない制約に条件付制約という用語を使用する。構成制約のクラスを識別すべきであるかどうかについて、引き続き論議する。
論理的に言えば、entitySetは単項リレーションであり、デカルト積はたった1つのセットからなる単純なものである。binaryRelationは、2項リレーションであり、デカルト積は2つのセットに命名する。3項(ternary)、4項(quaternary)などのリレーションは、デカルト積を徐々に大きくして設計することができる。しかし、2項リレーションは仮想上はすべての実際のシナリオを満足させるものであり、さらにすべてのより大きなリレーションは2項リレーションの構成として簡単に構築することができる。
binaryRelationは、rnameをrnamesのドメインに導入し、エンティティのペアでの2項リレーションまたは必須の制約を満たす他のリレーションを定義する。ペアがエンティティであって他のリレーションではない、基本的なケースでは、ペアはエンティティタイプの汎用セットのデカルト積のメンバである。関係する種類の一方または両方が他のリレーションである、再帰的なケースは、より大きなアリティ(arity)のリレーションの構成的な構築をサポートする。
は、部門に関するエンティティタイプおよびエンティティセットを追加し、部門から従業員エンティティへの1対多数のリレーションシップを宣言する。こうしたリレーションシップをインプリメントするためのオプションがある。例えば、結合テーブルまたは外部キー制約のいずれかによってインプリメント可能である。
アソシエーション。CDMアソシエーションは、上記で定義したように2項リレーションシップである。
条件付アソシエーション。すべての2項リレーションは条件付きであり、これは制約が必須であることを意味する。したがってCDM条件付アソシエーションは、上記で定義したように2項のリレーションである。
アソシエーションエンティティ。エンティティタイプは、オプションで、rnameによって2項リレーションを参照することができる。こうしたエンティティはCDMアソシエーションエンティティを反映する。
構成。2つのエンティティタイプのうちの少なくとも1つの多重度が1である多重度制約があること、およびそのエンティティタイプにOnDelete ename Cascadeの形の操作制約があることという、2つの基準を満たす2項リレーションはCDM構成である。
タイプレベルでの操作
(cname|ename)drop → structuralType
は、複合タイプまたはエンティティタイプを構造タイプに変換する。これは、complexTypeおよびentityType宣言を逆にする。
betterContactCardは、宣言ComplexType betterContactCard toyContactCardによってtoyContactCardから構築されたものであるため、betterContactCard dropを作成することは、toyContactCardを作成することと同じである。
(tupleType|sname) ++ (tupleType|sname) → tupleType
は、他を作成するために2つのタプルタイプ、またはそれらに命名する同義語を連結する、2項(binary)演算子++を定義する。
{String personName} ++ {{Int a,Int b,Int c} socialSecurityNumber #}
と作成することは、
{String personName, {Int a, Int b, Int c} socialSecurityNumber #}
と作成することと同じである。
(tupleType|sname)−−aname → tupleType
は、命名された属性をタプルタイプから除去する。入力タプルタイプが命名された属性を持たない場合、これはノーオペレーション(nop)である。
{String personName,Address address} -- personName
と作成することは、
{Address address}
と作成することと同じである。
(tupleType|sname)StripHashes → tupleType
は、その引数のタプルタイプのすべての属性のすべてのハッシュマークを取る。
{String personName, {Int a,Int b,Int c} socialSecurityNumber #} StripHashes
と作成することは、
{String personName, {Int a, Int b, Int c} socialSecurityNumber}
と作成することと同じである。
(tupleType|sname) aname AddHash -! tupleType
は、結果としてハッシュマーク付きの命名された属性を備えたタプルタイプを生じさせる。その属性がすでにハッシュマーク付きであった場合、そのままとなる。
{String personName, {Int a, Int b, Int c} socialSecurityNumber} personName AddHash
と作成することは、
{String personName #, {Int a, Int b, Int c} socialSecurityNumber}
と作成することと同じである。
次に図32を参照すると、CDMアーキテクチャを実行するように動作可能なコンピュータを示すブロック図である。本発明の様々な態様に追加の情況を提供するために、図32および以下の考察は、本発明の様々な態様がインプリメント可能な好適なコンピューティング環境3200の簡潔で全体的な説明を提供することを意図している。これまで、1つまたは複数のコンピュータで実行可能なコンピュータ実行可能命令との一般的な関連において本発明について説明してきたが、当業者であれば、本発明が他のプログラムモジュールとの組合せで、ならびに/あるいは、ハードウェアおよびソフトウェアの組合せとしてもインプリメント可能であることを理解されよう。
一般にプログラムモジュールは、特定のタスクを実行するか、または特定の抽象データ型をインプリメントする、ルーチン、プログラム、構成要素、データ構造などを含む。さらに当業者であれば、本発明の方法は、それぞれを1つまたは複数の関連付けられたデバイスに動作可能に結合することができる、単一プロセッサまたはマルチプロセッサのコンピュータシステム、ミニコンピュータ、メインフレームコンピュータ、ならびにパーソナルコンピュータ、ハンドヘルドコンピューティングデバイス、マイクロプロセッサベースまたはプログラム可能な消費者家電製品などを含む、他のコンピュータシステム構成で実施可能であることを理解されよう。
本発明の例示された態様は、通信ネットワークを介してリンクされたリモート処理デバイスによってある種のタスクが実行される、分散コンピューティング環境でも実施可能である。分散コンピューティング環境では、プログラムモジュールをローカルおよびリモートの両方のメモリストレージデバイスに配置することができる。
コンピュータは、典型的には様々なコンピュータ読み取り可能媒体を含む。コンピュータ読み取り可能媒体は、コンピュータがアクセス可能な任意の使用可能媒体とすることが可能であり、揮発性および不揮発性媒体、取り外し可能および取り外し不能媒体の両方を含む。例を挙げると、コンピュータ読み取り可能媒体はコンピュータストレージ媒体および通信媒体を含むことができるが、これらに限定されるものではない。コンピュータストレージ媒体は、コンピュータ読み取り可能命令、データ構造、プログラムモジュール、または他のデータなどの、情報を格納するための任意の方法または技術でインプリメントされた、揮発性および不揮発性、取り外し可能および取り外し不能の両方の媒体を含む。コンピュータストレージ媒体は、RAM、ROM、EEPROM、フラッシュメモリまたは他のメモリ技術、CD−ROM、デジタルビデオディスク(DVD)または他の光ディスクストレージ、磁気カセット、磁気テープ、磁気ディスクストレージまたは他の磁気ストレージデバイス、あるいは、所望の情報を格納するために使用可能でありコンピュータがアクセス可能な任意の他の媒体を含むが、これらに限定されるものではない。
再度図32を参照すると、本発明の様々な態様をインプリメントするための例示的環境3200はコンピュータ3202を含み、このコンピュータ3202は、処理ユニット3204、システムメモリ3206、およびシステムバス3208を含む。システムバス3208は、システムメモリ3206を含むがこれに限定されるものではないシステム構成要素を、処理ユニット3204に結合する。処理ユニット3204は、市販の様々なプロセッサのいずれであってもよい。デュアルマイクロプロセッサおよび他のマルチプロセッサアーキテクチャを、処理ユニット3204として使用することも可能である。
システムバス3208は、(メモリコントローラを備えるかまたは備えない)メモリバス、周辺バス、および様々な市販のバスアーキテクチャのいずれかを使用するローカルバスと、さらに相互接続することが可能ないくつかのタイプのバス構造のうちのいずれであってもよい。システムメモリ3206は、読み取り専用メモリ(ROM)3210およびランダムアクセスメモリ(RAM)3212を含む。基本入出力システム(BIOS)は、ROM、EPROM、EEPROMなどの不揮発性メモリ3210に格納され、BIOSは、起動時などにコンピュータ3202内の要素間で情報を転送する際に役立つ基本ルーチンを含む。RAM 3212は、データをキャッシュするための静的RAMなどの高速RAMも含むことができる。
コンピュータ3202は、好適なシャーシ(図示せず)内で外付けとして使用するように構成することも可能な内蔵ハードディスクドライブ(HDD)3214(例えばEIDE、SATA)と、磁気フロッピー(登録商標)ディスクドライブ(FDD)3216(例えば、取り外し可能なディスケット3218からの読み取りまたはこれへの書き込みのため)と、光ディスクドライブ3220(例えば、CD−ROMディスク3222の読み取り、あるいは、DVDなどの他の大容量光媒体からの読み取りまたはこれへの書き込みのため)とをさらに含む。ハードディスクドライブ3214、磁気ディスクドライブ3216、および光ディスクドライブ3220は、それぞれ、ハードディスクドライブインターフェース3224、磁気ディスクドライブインターフェース3226、および光ドライブインターフェース3228によって、システムバス3208に接続することができる。外付けドライブインプリメンテーション用のインターフェース3224は、ユニバーサルシリアルバス(USB)およびIEEE 1394インターフェース技術のうちの少なくとも1つ、またはその両方を含む。他の外付けドライブ接続技術は、本発明の企図の範囲内である。
ドライブおよびそれらに関連付けられたコンピュータ読み取り可能媒体は、データの不揮発性ストレージ、データ構造、コンピュータ実行可能命令などを提供する。コンピュータ3202の場合、ドライブおよび媒体は、好適なデジタル形式での任意のデータの格納に対処する。上記のコンピュータ読み取り可能媒体の説明はHDD、取り外し可能磁気ディスケット、およびCDまたはDVDなどの取り外し可能光媒体に言及するものであるが、当業者であれば、zipドライブ、磁気カセット、フラッシュメモリカード、カートリッジなどの、コンピュータによって読み取り可能な他のタイプの媒体も例示的オペレーティング環境で使用可能であること、さらに、任意のこうした媒体が、本発明の方法を実行するためのコンピュータ実行可能命令を含むことが可能であることを理解されたい。
オペレーティングシステム3230、1つまたは複数のアプリケーションプログラム3232、他のプログラムモジュール3234、およびプログラムデータ3236を含むいくつかのプログラムモジュールを、ドライブおよびRAM 3212に格納することが可能である。オペレーティングシステム、アプリケーション、モジュール、および/またはデータのすべてまたは一部は、RAM 3212にキャッシュすることも可能である。本発明は、様々な市販のオペレーティングシステムまたはオペレーティングシステムの組合せでインプリメント可能であることを理解されよう。
ユーザは、1つまたは複数の有線/無線入力デバイス、例えばキーボード3238およびマウス3240などのポインティングデバイスを介して、コマンドおよび情報をコンピュータ3202に入力することができる。他の入力デバイス(図示せず)には、マイクロフォン、IRリモートコントロール、ジョイスティック、ゲームパッド、スタイラスペン、タッチスクリーンなども含むことが可能である。これらおよび他の入力デバイスは、しばしば、システムバス3208に結合された入力デバイスインターフェース3242を介して処理ユニット3204に接続されるが、パラレルポート、IEEE 1394シリアルポート、ゲームポート、USBポート、IRインターフェースなどの他のインターフェースによって接続することが可能である。
モニタ3244または他のタイプのディスプレイデバイスも、ビデオアダプタ3246などのインターフェースを介してシステムバス3208に接続される。コンピュータは通常、モニタ3244に加えて、スピーカ、プリンタなどの他の周辺出力デバイス(図示せず)を含む。
コンピュータ3202は、リモートコンピュータ3248などの1つまたは複数のリモートコンピュータへの有線および/または無線の通信を介した論理接続を使用する、ネットワーク環境内で動作することができる。リモートコンピュータ3248は、ワークステーション、サーバコンピュータ、ルータ、パーソナルコンピュータ、ポータブルコンピュータ、マイクロプロセッサベースの娯楽用電気製品、ピアデバイス、または他の共通ネットワークノードとすることが可能であり、通常は、コンピュータ3202に関して説明した要素の多くまたはすべてを含むが、簡略化するために、メモリ/ストレージデバイス3250のみが図示されている。記載された論理接続は、ローカルエリアネットワーク(LAN)3252および/または例えばワイドエリアネットワーク(WAN)3254などの大規模ネットワークへの、有線/無線接続を含む。こうしたLANおよびWANネットワーキング環境は事務所および会社内で一般的に見られ、イントラネットなどの企業規模のコンピュータネットワークを容易にするものであり、そのすべてが例えばインターネットなどのグローバル通信ネットワークに接続可能である。
コンピュータ3202は、LANネットワーキング環境で使用される場合、有線および/または無線の通信ネットワークインターフェースまたはアダプタ3256を介してローカルネットワーク3252に接続される。アダプタ3256は、無線アダプタ3256との通信のためにその上に配置された無線アクセスポイントも含むことができるLAN 3252への、有線または無線通信を容易にすることができる。
コンピュータ3202は、WANネットワーキング環境で使用される場合、モデム3258を含むか、またはWAN 3254上の通信サーバに接続されるか、またはインターネットを利用するなど、WAN 3254を介した通信を確立するための他の手段を有する。モデム3258は、内蔵型または外付け、および有線または無線デバイスとすることが可能であり、シリアルポートインターフェース3242を介してシステムバス3208に接続される。ネットワーク環境では、コンピュータ3202に関して示されたプログラムモジュールまたはその一部を、リモートメモリ/ストレージデバイス3250に格納することができる。図示されたネットワーク接続は例示的なものであり、コンピュータ間の通信リンクを確立するための他の手段が使用可能であることを理解されよう。
コンピュータ3202は、無線通信内に動作可能に配置された任意の無線デバイスまたはエンティティ、例えば、プリンタ、スキャナ、デスクトップ、および/またはポータブルコンピュータ、携帯情報端末、通信衛星、無線検出可能タグに関連付けられた任意の機器または場所(例えば、キオスク、新聞売店、屋内トイレ)、および電話と通信するように動作可能である。これには、少なくともWi−FiおよびBluetooth(商標)無線技術が含まれる。したがって、通信は、従来のネットワークの場合のように事前に定義された構造、または単に少なくとも2つのデバイス間の随時通信とすることができる。
Wi−FiすなわちWireless Fidelityは、家庭の長いす、ホテルの部屋のベッド、または仕事場の会議室から、無線でインターネットに接続できるようにするものである。Wi−Fiは、コンピュータなどのこうしたデバイスが、基地局の領域内であればどこでも屋内および屋外でデータを送受信できるようにする、携帯電話で使用される技術に類似した無線技術である。Wi−Fiネットワークは、IEEE 802.11(a、b、gなど)と呼ばれる無線技術を使用して、セキュアで信頼できる高速無線接続を提供する。Wi−Fiネットワークを使用して、コンピュータを相互に、インターネットに、および(IEEE 802.3またはイーサネット(登録商標)を使用する)有線ネットワークに接続することができる。Wi−Fiネットワークは、無認可の2.4および5GHzの無線帯域で、11Mbps(802.11a)または54Mbps(802.11b)のデータレートで、あるいは例えば両方の帯域(デュアルバンド)を含む製品を使用して動作するため、ネットワークは、多くの事務所で使用されるベーシック10BaseT有線イーサネット(登録商標)ネットワークと同様の実世界性能を提供することができる。
次に図33を参照すると、CDMが使用可能な例示的コンピューティング環境3300を示す略ブロック図が示されている。システム3300は、1つまたは複数のクライアント3302を含む。クライアント3302はハードウェアおよび/またはソフトウェア(例えばスレッド、プロセス、コンピューティングデバイス)とすることができる。クライアント3302は、例えば本発明を使用することによって、クッキーおよび/または関連付けられた文脈情報を収容することができる。
システム3300は、1つまたは複数のサーバ3304も含む。サーバ3304はハードウェアおよび/またはソフトウェア(例えばスレッド、プロセス、コンピューティングデバイス)とすることができる。サーバ3304は、例えば本発明を使用することによって、変換を実行するスレッドを収容することができる。クライアント3302とサーバ3304との間に可能な通信の1つが、2つまたはそれ以上のコンピュータプロセス間で伝送されるように適合されたデータパケットの形とすることができる。データパケットは、例えばクッキーおよび/または関連付けられた文脈情報を含むことができる。システム3300は、クライアント3302とサーバ3304との間の通信を容易にするために使用可能な通信フレームワーク3306(例えば、インターネットなどのグローバル通信ネットワーク)を含む。
通信は、有線(光ファイバを含む)および/または無線技術を介して容易にすることができる。クライアント3302は、情報(例えば、クッキーおよび/または関連付けられた文脈情報)をクライアント3302に対してローカルに格納するために使用可能な1つまたは複数のクライアントデータストア3308に、動作可能に接続される。同様に、サーバ3304は、情報をサーバ3304に対してローカルに格納するために使用可能な1つまたは複数のサーバデータストア3310に、動作可能に接続される。
以上、開示されたイノベーションの例について説明してきた。もちろん、構成要素および/または方法の考え得るあらゆる組合せを説明することは不可能であるが、当業者であれば、多くの他の組合せおよび順列が可能であることを理解されよう。したがって、本イノベーションは、添付の特許請求の範囲の精神および範囲に入るこうした代替、修正、および変形のすべてを包含することを意図している。さらに「含む」という用語が詳細な説明または特許請求の範囲のいずれかで使用される限り、こうした用語は、「備える、含む」が使用される場合に特許請求の範囲では遷移語(transitional word)として解釈されるため、「備える、含む」と同様に包括的であることが意図されている。