Caché の強力な機能に、固有の統一データ・アーキテクチャがあります。これは、高性能のオブジェクトとリレーショナル・アクセスを Caché に格納したデータに同時に提供します。
Caché では、ユーザのアプリケーション・コンポーネントをオブジェクトとして定義できます。オブジェクトは、オブジェクトのデータ (プロパティ) と振る舞い (メソッド) を定義するクラスで構築されます。
統一データ・アーキテクチャ
各クラスのメタ情報あるいは定義は、Caché クラス・ディクショナリと呼ばれる共通のリポジトリに格納されます。クラス・ディクショナリ自身は、Caché に格納されるオブジェクト・データベースで、オブジェクトを使用してコンテンツにアクセスします。クラス・コンパイラを使用し、クラス・ディクショナリは、永続オブジェクトに必要なストレージ構造を定義し、クラス定義を実行可能コードのパラレル・セットに変換します。このコード・セットは、このストレージ構造に対してオブジェクトとリレーショナル・アクセスの両方を提供します。このアーキテクチャにより、オブジェクトとリレーショナル・コード・パスは、効果的また自動的に互いに同期化されます。
クラス定義は、いくつかの方法で、クラス・ディクショナリに追加できます。
-
-
リレーショナル DDL の使用。Caché は、標準 SQL DDL 文を受け入れ、対応するクラスとテーブル定義を自動的に生成します。
-
テキストの XML を使用。Caché は、外部 XML で記述されたクラス定義をサポートします。通常、これは、ソース・コード管理、運用、自動コード生成、他のツ-ルとの相互運用性のために使用します。
-
プログラム的にオブジェクトを使用。Caché のクラス定義オブジェクトのセットを利用し、クラス・ディクショナリと直接通信するプログラムを生成し、アプリケーション実行時に新規クラスを生成します。
-
Caché スタジオ に組み込まれている XML スキーマ・ウィザードの使用。大半の XML スキーマ・ファイルからクラス定義を生成できます。
Caché のオブジェクト・モデルは、プロパティやメソッド以外にもプログラミング言語で使用されるモデルと異なり、インデックス、制約条件、ストレージ構造などストレージに関連する振る舞いを指定できます。
永続オブジェクトで使用されるストレージ構造は、クラスの論理定義から独立しているため、非常に柔軟性があります。開発者は、クラス・コンパイラから提供される既定の構造を使用する、あるいは、特定のケースに合わせて構造を調整できます。
Caché SQL ゲートウェイ を使用して、外部リレーショナル・データベースにクラスを格納できます。
Caché のフル機能、次世代オブジェクト・データベースは、複雑なトランザクション向きのアプリケーション要件に合うように設計されています。Caché オブジェクト・モデルには、以下の機能があります。
-
クラス ユーザのアプリケーション・コンポーネントの状態 (データ) と振る舞い (コード) を決定するクラスを定義できます。クラスは、ランタイム・コンポーネントとして、あるいはデータベースに格納される要素として、オブジェクトのインスタンスを生成するために使用します。
-
プロパティ クラスには、各オブジェクトのインスタンスに関連するデータを指定するプロパティがあります。プロパティは、単純なリテラル (文字列、数値など)、ユーザ定義型 (データ型クラスで定義される)、複雑なオブジェクト (あるいは埋め込みオブジェクト)、コレクション、他のオブジェクト参照です。
-
リレーションシップ クラスは、オブジェクトのインスタンスが他のインスタンスにどのように関連しているかを定義できます。システムは、データベース内に、リレーションシップの操作メソッドと参照一貫性を自動的に提供します。
-
メソッド クラスは、メソッドを使用し振る舞いを定義します。メソッドとは、オブジェクトに関連する実行可能なコードです。オブジェクト・メソッドは、Caché サーバ・プロセスで実行します (リモート・クライアントから実行できます)。オブジェクト・メソッドは、Caché ObjectScript、SQL を使用して記述するか、または、メソッド・ジェネレータを使用して生成できます。メソッド・ジェネレータとは、ユーザが定義した規則に従ってカスタマイズされたメソッドを自動的に生成するコードです。
-
オブジェクトの永続性 永続オブジェクトには、自分自身をデータベースに自動的に格納したり取り出したりする機能があります。永続性のサポートには、自動トランザクション管理、同時アクセス・コントロール、インデックス・メンテナンス、データの妥当性検証を含む完全なデータベース機能があります。永続オブジェクトは、SQL クエリから自動的に見ることができます。
-
継承 新規クラスを既存のクラスから派生することで、以前記述したコードを再利用したり、特有なクラスを生成したりできます。
-
ポリモフィズム(多態) Caché は、完全なオブジェクトのポリモフィズムをサポートします。つまり、アプリケーションは、適切なインタフェース (スーパークラスからのメソッドやプロパティのセット) を使用し、またシステムは、各オブジェクト・タイプを元に、正確なインタフェースの実装を自動的に呼び出します。これにより、柔軟なデータベース・アプリケーションの開発が可能になります。
-
スウィズリング (
遅延ロード) Caché は、オブジェクトが別のオブジェクトから参照される場合、関連する永続オブジェクトを自動的にスウィズル (ディスクからメモリに格納) します。これにより、複雑なデータ・モデルでの作業を簡素化します。
Caché のクラス定義で、単純で最も一般的な方法は、
Caché スタジオ 開発環境を使用することです。スタジオでクラスを定義するには、構文エディタ内の単純なテキスト形式、あるいはグラフィカルなポイント・アンド・クリックのインタフェースのいずれかを使用します。これら 2 つのビューは、交互に使用でき、自動的に同期を取ります。
ここでは、極めて単純な永続オブジェクト、
Component を定義します。Caché スタジオでは以下のように表示されます。
Class MyApp.Component Extends %Persistent [ClassType = persistent]
{
Property TheName As %String;
Property TheValue As %Integer;
}
このクラスは、永続クラスとして定義されます (つまり、データベース内に自分自身を格納できます)。この場合、Caché が提供する
%Persistent クラス (アプリケーション・クラスと区別するため、システム・クラス名には先頭に
% 文字があります) は、すべて必要な永続コードを継承します。クラスは、パッケージ、
MyApp に属します。パッケージは、関連するクラスを一まとめにし、大規模アプリケーションの開発を大幅に簡素化します。クラスは 2 つのプロパティを定義します。
TheNameは文字列値で、
TheValue は整数値です。
' Create a new component
component = New Component()
component.TheName = "Widget"
component.TheValue = 22
' Save the new Component to the database
component.%Save()
ここで、
Component の新規インスタンスは、システムが割り当てた一意のオブジェクト識別子を持ち、データベースに格納されます。(このオブジェクト識別子を使用して) これをオープンすると、オブジェクトを取り出すことができます。
' Open an instance and double its value:
component = OpenId Component(id)
component.TheValue = component.TheValue * 2
component.%Save()
Caché のさまざまなクライアント結合で固有の
Java、
C++、
ActiveX、
.NET を使用して、同一の処理を実行できます。クラス・コンパイラは、外部からのオブジェクトへのアクセスに必要な追加コードを生成し、同期を取ります。例えば、Java で Caché を使用している場合、クラス・コンパイラは、永続データベース・クラスにリモート・アクセスする Java プロキシ・クラスを自動的に生成、保持します。Java プログラムでは、元々このオブジェクトを使用できます。
// Get an instance of Component from the database
component = (MyApp.Component)MyApp.Component._open(database, new Id(id));
// Inspect some properties of this object
System.out.println("Name: " + component.getTheName());
System.out.println("Value: " + component.getTheValue());
Caché SQL は、フル機能のリレーショナル・データベース・エンジンで、Caché のオブジェクト・テクノロジーと完全に統合されています。標準 SQL-92 機能の他に、Caché SQL には以下の機能があります。
-
ストリーム (SQL では BLOB) のサポート
-
(オブジェクト・メソッドとして実装された) ストアド・プロシージャのサポート
-
-
-
トランザクション・ビットマップ・インデックスのサポート
ビットマップ・インデックスは、通常、大規模なデータの保管や OLAP システムで使用し、複雑に組み合わされた条件による高速検索が実行できます。このようなビットマップ・インデックスでは、リアルタイム更新はできませんが、通常はバッチ処理として更新されます。Caché SQL はビットマップ・インデックスをサポートし、挿入/更新の処理動作を低下させずに高性能な検索機能を提供します。これにより、トランザクション処理アプリケーションは、データ・ウェアハウス形式の問い合わせを実行でき、データ・ウェアハウス・アプリケーションは、リアルタイム更新が可能になります。詳細は、
Caché SQL ドキュメントを参照してください。
Caché ディクショナリのすべてのコンポーネントは、クラスとして定義されます。Caché クラス・コンパイラは、リレーショナル・テーブルとして永続クラスを自動的に投影します。各オブジェクト機能には、以下の表のように対応するリレーショナル・オブジェクトがあります。
オブジェクト機能のリレーショナル表
オブジェクト機能 |
リレーショナル・オブジェクト |
パッケージ |
スキーマ |
クラス |
テーブル |
オブジェクト・インスタンス |
テーブル行 |
プロパティ |
列 |
リレーションシップ |
外部キー |
埋め込みオブジェクト |
複数の列 |
メソッド |
ストアド・プロシージャ |
インデックス |
インデックス |
Caché が SQL DDL (データ定義言語) 文をロードする場合、この逆投影を使用して、リレーショナル・テーブルに対応するクラスを生成します。
Class MyApp.Person Extends %Persistent [ClassType = persistent]
{
Property Name As %String(MAXLEN=100);
Property Home As Address;
}
Home プロパティは、複雑なユーザ定義のデータ型を表しています。この場合、
Address クラスは以下のように定義されます。
Class MyApp.Address Extends %SerialObject [ClassType = serial]
{
Property City As %String;
Property State As %String;
}
SQL 表示される
Person クラスの構造は、以下のようになります。
Person クラスの SQL ビュー: SELECT * FROM Person
ID |
Name |
Home_City |
Home_State |
1 |
Smith,John |
Cambridge |
MA |
2 |
Doe,Jane |
Dallas |
TX |
オブジェクト識別子は、列として表示されていることに注意してください。また、埋め込みのオブジェクトの
Address フィールドは、分割フィールドとして投影されます。フィールドには、
Home_City と
Home_State という複合的なフィールド名があり、2 つの独立したフィールドが定義されているかのように振る舞います。
継承は、オブジェクト・ベースのシステムで重要な機能です。この機能は、リレーショナル・データベースにはありません。Caché SQL は、標準リレーショナル構造を使用して、この強力な継承機能を使用できます。例えば、前例で使用した
Person クラスから新規
Employee クラスを派生できます。
Class MyApp.Employee Extends Person [ClassType = persistent]
{
Property Salary As %Integer(MINVAL=0,MAXVAL=100000);
}
Employee クラスの SQL ビュー: SELECT * FROM Employee
ID |
Name |
Home_City |
Home_State |
Salary |
3 |
Divad, Gino |
Irvine |
CA |
22000 |
継承されたすべてのプロパティは、列として使用可能であることに注意してください。また、
Employee の実インスタンスである行のみが含まれていることにも注意が必要です。以下は、すべての
Person インスタンスを再要求します。
Person クラスの改訂 SQL ビュー: SELECT * FROM Person
ID |
Name |
Home_City |
Home_State |
1 |
Smith,John |
Cambridge |
MA |
2 |
Doe,Jane |
Dallas |
TX |
3 |
Divad, Gino |
Irvine |
CA |
オブジェクト・アプリケーションで SQL を使用しやすくするために、Caché には SQL へのオブジェクト拡張が多数あります。
最も特殊な拡張の 1 つは、リファレンス演算子 (
>) を使用して、オブジェクト参照を実行する機能です。例として、2 つのクラス、
Contact と
Region を参照する
Vendor クラスがあります。リファレンス演算子を使用すると、関連するクラスのプロパティを参照できます。
SELECT ID,Name,ContactInfo->Name
FROM Vendor
WHERE Vendor->Region->Name = 'Antarctica'
また、SQL JOIN 構文を使用しても、同様のクエリ式を記述できます。リファレンス演算子構文の利点は、簡潔で理解しやすい点です。