Caché の強力な機能に、固有の統一データ・アーキテクチャがあります。これは、高性能のオブジェクトとリレーショナル・アクセスを Caché に格納したデータに同時に提供します。
統一データ・ディクショナリ
Caché では、ユーザのアプリケーション・コンポーネントをオブジェクトとして定義できます。オブジェクトは、オブジェクトのデータ (プロパティ) と振る舞い (メソッド) を定義するクラスで構築されます。
統一データ・アーキテクチャ
各クラスのメタ情報あるいは定義は、Caché クラス・ディクショナリと呼ばれる共通のリポジトリに格納されます。クラス・ディクショナリ自身は、Caché に格納されるオブジェクト・データベースで、オブジェクトを使用してコンテンツにアクセスします。クラス・コンパイラを使用し、クラス・ディクショナリは、永続オブジェクトに必要なストレージ構造を定義し、クラス定義を実行可能コードのパラレル・セットに変換します。このコード・セットは、このストレージ構造に対してオブジェクトとリレーショナル・アクセスの両方を提供します。このアーキテクチャにより、オブジェクトとリレーショナル・コード・パスは、効果的また自動的に互いに同期化されます。
クラス定義は、いくつかの方法で、クラス・ディクショナリに追加できます。
柔軟なストレージ
Caché のオブジェクト・モデルは、プロパティやメソッド以外にもプログラミング言語で使用されるモデルと異なり、インデックス、制約条件、ストレージ構造などストレージに関連する振る舞いを指定できます。
永続オブジェクトで使用されるストレージ構造は、クラスの論理定義から独立しているため、非常に柔軟性があります。開発者は、クラス・コンパイラから提供される既定の構造を使用する、あるいは、特定のケースに合わせて構造を調整できます。Caché 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 は整数値です。
メソッド内などの Caché ObjectScript コード内から、このオブジェクト構文を使用して、Component オブジェクトのインスタンスを処理できます。
Basic を使用する場合、Component オブジェクトのインスタンスを操作し、メソッドを定義できます。
' 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é のさまざまなクライアント結合で固有の JavaC++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());
SQL
Caché SQL は、フル機能のリレーショナル・データベース・エンジンで、Caché のオブジェクト・テクノロジーと完全に統合されています。標準 SQL-92 機能の他に、Caché SQL には以下の機能があります。
オブジェクト/リレーショナル接続
Caché ディクショナリのすべてのコンポーネントは、クラスとして定義されます。Caché クラス・コンパイラは、リレーショナル・テーブルとして永続クラスを自動的に投影します。各オブジェクト機能には、以下の表のように対応するリレーショナル・オブジェクトがあります。
オブジェクト機能のリレーショナル表
オブジェクト機能 リレーショナル・オブジェクト
パッケージ スキーマ
クラス テーブル
オブジェクト・インスタンス テーブル行
プロパティ
リレーションシップ 外部キー
埋め込みオブジェクト 複数の列
メソッド ストアド・プロシージャ
インデックス インデックス
Caché が SQL DDL (データ定義言語) 文をロードする場合、この逆投影を使用して、リレーショナル・テーブルに対応するクラスを生成します。
以下は、リレーショナル投影へオブジェクトを示す簡単な例です。以下は、2 つのプロパティ、NameHome を持つ永続 Person クラス (“MyApp” と呼ばれるパッケージの一部) の定義です。
Class MyApp.Person Extends %Persistent [ClassType = persistent]
{
Property Name As %String(MAXLEN=100);
Property Home As Address;
}
Person クラスは、Caché が持つ %Persistent スーパークラスから永続的な振る舞いを継承します。Name プロパティは、100 文字までの簡単な文字列で定義します。
Home プロパティは、複雑なユーザ定義のデータ型を表しています。この場合、Address クラスは以下のように定義されます。
Class MyApp.Address Extends %SerialObject [ClassType = serial]
{
Property City As %String;
Property State As %String;
}
Address クラスは、%SerialObject スーパークラスから派生します。このクラスには、それ自身のクラスを直列化し (自身を単一の文字列表現に変換する)、別のクラス内に (Person クラスのように) 埋め込む機能があります。
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_CityHome_State という複合的なフィールド名があり、2 つの独立したフィールドが定義されているかのように振る舞います。
継承と SQL
継承は、オブジェクト・ベースのシステムで重要な機能です。この機能は、リレーショナル・データベースにはありません。Caché SQL は、標準リレーショナル構造を使用して、この強力な継承機能を使用できます。例えば、前例で使用した Person クラスから新規 Employee クラスを派生できます。
Class MyApp.Employee Extends Person [ClassType = persistent]
{
Property Salary As %Integer(MINVAL=0,MAXVAL=100000);
}
新規クラスは、Salary プロパティを追加して、Person クラスを拡張します。
SQL で表示される Employee クラスの構造は、以下のようになります。
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
この場合、Employee ごとに返されるすべての行は Person のインスタンスとして定義されています。しかし、Person で定義されたプロパティのみが表示されます。
SQL へのオブジェクト拡張
オブジェクト・アプリケーションで SQL を使用しやすくするために、Caché には SQL へのオブジェクト拡張が多数あります。
最も特殊な拡張の 1 つは、リファレンス演算子 (“–>”) を使用して、オブジェクト参照を実行する機能です。例として、2 つのクラス、ContactRegion を参照する Vendor クラスがあります。リファレンス演算子を使用すると、関連するクラスのプロパティを参照できます。
SELECT ID,Name,ContactInfo->Name
FROM Vendor
WHERE Vendor->Region->Name = 'Antarctica'
また、SQL JOIN 構文を使用しても、同様のクエリ式を記述できます。リファレンス演算子構文の利点は、簡潔で理解しやすい点です。