Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

オブジェクト、SQL、統一データ・アーキテクチャ

Caché の強力な機能に、固有の統一データ・アーキテクチャがあります。これは、高性能のオブジェクトとリレーショナル・アクセスを Caché に格納したデータに同時に提供します。

統一データ・ディクショナリ

Caché では、ユーザのアプリケーション・コンポーネントをオブジェクトとして定義できます。オブジェクトは、オブジェクトのデータ (プロパティ) と動作 (メソッド) を定義するクラスで構築されます。

統一データ・アーキテクチャ
generated description: uda.jpg

各クラスのメタ情報あるいは定義は、Caché クラス・ディクショナリと呼ばれる共通のリポジトリに格納されます。クラス・ディクショナリ自身は、Caché に格納されるオブジェクト・データベースで、オブジェクトを使用してコンテンツにアクセスします。クラス・コンパイラを使用し、クラス・ディクショナリは、永続オブジェクトに必要なストレージ構造を定義し、クラス定義を実行可能コードのパラレル・セットに変換します。このコード・セットは、このストレージ構造に対してオブジェクトとリレーショナル・アクセスの両方を提供します。このアーキテクチャにより、オブジェクトとリレーショナル・コード・パスは、効果的、自動的に互いに同期化されます。

クラス定義は、いくつかの方法で、クラス・ディクショナリに追加できます。

  • スタジオ開発環境のインタラクティブな使用。

  • リレーショナル DDL の使用。Caché は、標準 SQL DDL 文を受け入れ、対応するクラスとテーブル定義を自動的に生成します。

  • テキストの XML を使用。Caché は、外部 XML で記述されたクラス定義をサポートします。通常、これは、ソース・コード管理、運用、自動コード生成、他のツールとの相互運用性のために使用します。

  • プログラム的にオブジェクトを使用。Caché のクラス定義オブジェクトのセットを利用し、クラス・ディクショナリと直接通信するプログラムを生成し、アプリケーション実行時に新規クラスを生成します。

  • スタジオに組み込まれている XML スキーマ・ウィザードの使用。大半の XML スキーマ・ファイルからクラス定義を生成できます。

柔軟なストレージ

Caché のオブジェクト・モデルは、プログラミング言語で使用するオブジェクト・モデルと異なり、プロパティやメソッドのほかにもインデックス、制約条件、ストレージ構造などストレージに関連する動作を指定できます。

永続オブジェクトによって使用されるストレージ構造は、クラスの論理定義から独立しているため、非常に柔軟性があります。開発者は、クラス・コンパイラから提供される既定の構造を使用することも、特定のケースに合わせて構造を調整することもできます。

オブジェクト

Caché には、複雑なトランザクション向きのアプリケーション要件に合うように設計された、フル機能の次世代オブジェクト・データベースが含まれています。Caché オブジェクト・モデルには、以下の機能があります。

  • クラス — ユーザのアプリケーション・コンポーネントの状態 (データ) と動作 (コード) を決定するクラスを定義できます。クラスは、ランタイム・コンポーネントとして、あるいはデータベースに格納される項目として、オブジェクトのインスタンスを生成するために使用します。

  • プロパティ — クラスには、各オブジェクトのインスタンスに関連するデータを指定するプロパティがあります。プロパティは、単純なリテラル (文字列、数値など)、ユーザ定義型 (データ型クラスで定義される)、複雑なオブジェクト (あるいは埋め込みオブジェクト)、コレクション、他のオブジェクト参照です。

  • リレーションシップ — クラスは、オブジェクトのインスタンスが他のインスタンスにどのように関連しているかを定義できます。システムによって、リレーションシップのナビゲーション・メソッドと参照整合性がデータベース内に自動的に提供されます。

  • メソッド — クラスは、メソッドを使用し動作を定義します。メソッドとは、オブジェクトに関連付けられた実行可能なコードです。オブジェクト・メソッドは、Caché サーバ・プロセスで実行します (リモート・クライアントから実行できます)。オブジェクト・メソッドは、ObjectScript、SQL を使用して記述するか、またはメソッド・ジェネレータを使用して生成できます。メソッド・ジェネレータとは、ユーザが定義した規則に従ってカスタマイズされたメソッドを自動的に生成するコードです。

  • オブジェクトの永続性 — 永続オブジェクトには、自分自身をデータベースに自動的に格納したり取り出したりする機能があります。永続性のサポートには、自動トランザクション管理、同時アクセス・コントロール、インデックス・メンテナンス、データの妥当性検証を含む完全なデータベース機能があります。永続オブジェクトは、SQL クエリから自動的に可視になります。

  • 継承 — 新規クラスを既存のクラスから派生することで、以前記述したコードを再利用したり、特有なクラスを生成したりできます。

  • ポリモフィズム (多態) — Caché は、完全なオブジェクトのポリモフィズムをサポートします。つまり、アプリケーションでは適切に定義されたインタフェース (スーパークラスからのメソッドやプロパティのセット) を使用でき、システムでは各オブジェクト・タイプを基に、正確なインタフェースの実装を自動的に呼び出すことができます。これにより、柔軟なデータベース・アプリケーションの開発が可能になります。

  • スウィズリング (“遅延ロード”) — Caché は、オブジェクトが別のオブジェクトから参照される場合、関連する永続オブジェクトを自動的にスウィズル (ディスクからメモリに格納) します。これにより、複雑なデータ・モデルでの作業が大幅に簡素化されます。

Caché オブジェクト機能は Caché の独立した部分ではありません。これは Caché プログラミングの中心部分であり、別途説明されているリレーショナル・アクセスと完全に統合されています。ただし、オブジェクト指向プログラミングに特に関心のあるユーザのために、"Caché オブジェクトの使用法" のドキュメントでは、Caché プログラミングについてこの観点から説明しています。

クラス定義

Caché のクラス定義で、単純で最も一般的な方法は、スタジオ開発環境を使用することです。スタジオでクラスを定義するには、構文エディタ内の単純なテキスト形式、あるいはグラフィカルなポイント・アンド・クリックのインタフェースのいずれかを使用します。これら 2 つのビューは、交互に入れ替えて使用でき、両者間で自動的に同期がとられます。

ここでは、極めて単純な永続オブジェクト、Component を定義します。スタジオでは以下のように表示されます。

Class MyApp.Component Extends %Persistent
{
Property TheName As %String;
Property TheValue As %Integer;
}

このクラスは、永続クラスとして定義されます (つまり、データベース内に自分自身を格納できます)。この場合、Caché が提供する %PersistentOpens in a new tab クラス (アプリケーション・クラスと区別するため、システム・クラス名には先頭に “%” 文字があります) は、すべて必要な永続コードを継承します。クラスは、パッケージ、“MyApp” に属します。パッケージは、関連するクラスを一まとめにし、大規模アプリケーションの開発を大幅に簡素化します。クラスは 2 つのプロパティを定義します。文字列値を持つ TheName と整数値を持つ TheValue です。

メソッド内などの ObjectScript コード内から、このオブジェクト構文を使用して、Component オブジェクトのインスタンスを処理できます。

 // Create a new component
 Set component = ##class(MyApp.Component).%New()
 Set component.TheName = "Widget"
 Set component.TheValue = 22

 // Save the new Component to the database
 Do component.%Save()

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()

ネイティブの JavaC++、または他の Caché クライアント・バインディングを使用してまったく同じ操作を実行できます。クラス・コンパイラは、外部からのオブジェクトへのアクセスに必要な追加コードを生成し、同期を取ります。例えば、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 には以下の機能があります。

  • ストリーム (SQL では BLOB) のサポート

  • (オブジェクト・メソッドとして実装された) ストアド・プロシージャのサポート

  • オブジェクトに基づいた (一連の) 機能拡張

  • ユーザ定義が可能なデータ型

  • トランザクション・ビットマップ・インデックスのサポート

    ビットマップ・インデックスは、通常、大規模なデータの保管や OLAP システムで使用するもので、条件を複雑に組み合わせて高速な検索を実行できます。このようなビットマップ・インデックスでは、リアルタイム更新はできませんが、通常はバッチ処理として更新されます。Caché SQL はビットマップ・インデックスをサポートし、挿入/更新の処理動作を低下させずに高性能な検索機能を提供します。これにより、トランザクション処理アプリケーションは、データ・ウェアハウス形式の問い合わせを実行でき、データ・ウェアハウス・アプリケーションは、リアルタイム更新が可能になります。詳細は、"Caché SQL 最適化ガイド" の “ビットマップ・インデックス” コンテンツを参照してください。

オブジェクト/リレーショナル接続

Caché ディクショナリのすべてのコンポーネントは、クラスとして定義されます。クラス・コンパイラは、リレーショナル・テーブルとして永続クラスを自動的に投影します。各オブジェクト機能には、以下のテーブルのように対応するリレーショナル・オブジェクトがあります。

オブジェクト機能のリレーショナル側からの見え方
オブジェクト機能 リレーショナル・オブジェクト
パッケージ スキーマ
クラス テーブル
オブジェクト・インスタンス テーブル行
プロパティ
リレーションシップ 外部キー
埋め込みオブジェクト 複数の列
メソッド ストアド・プロシージャ
インデックス インデックス

Caché が SQL DDL (データ定義言語) 文をロードする場合、この逆投影を使用して、リレーショナル・テーブルに対応するクラスを生成します。

以下は、オブジェクトからリレーショナルへの投影を示す簡単な例です以下は、2 つのプロパティ、NameHome を持つ永続 Person クラス (“MyApp” と呼ばれるパッケージの一部) の定義です。

Class MyApp.Person Extends %Persistent
{
Property Name As %String(MAXLEN=100);
Property Home As Address;
}

Person クラスは、Caché が持つ %PersistentOpens in a new tab スーパークラスから永続的な動作を継承します。Name プロパティは、100 文字までの簡単な文字列で定義します。

Home プロパティは、複雑なユーザ定義のデータ型の使用を表しています。この場合、Address クラスは以下のように定義されます。

Class MyApp.Address Extends %SerialObject
{
Property City As %String;
Property State As %String;
}

Address クラスは、%SerialObjectOpens in a new tab スーパークラスから派生します。このクラスには、それ自身のクラスを直列化し (自身を単一の文字列表現に変換する)、別のクラス内に (Person クラスのように) 埋め込む機能があります。

SQL 表示される Person クラスの構造は、以下のようになります。

Person クラスの SQL ビュー : SELECT * FROM Person
ID 名前 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
{
Property Salary As %Integer(MINVAL=0,MAXVAL=100000);
}

この新規クラスは、Salary プロパティを追加して、Person クラスを拡張します。

SQL 表示される Employee クラスの構造は、以下のようになります。

Employee クラスの SQL ビュー : SELECT * FROM Employee
ID 名前 Home_City Home_State Salary
3 Divad, Gino Irvine CA 22000

継承されたすべてのプロパティは、列として使用可能であることに注意してください。また、Employee の実インスタンスである行のみが含まれていることにも注意が必要です。以下では、すべての Person インスタンスを要求します。

Person クラスの改訂 SQL ビュー : SELECT * FROM Person
ID 名前 Home_City Home_State
1 Smith,John Cambridge MA
2 Doe,Jane Dallas TX
3 Divad, Gino Irvine CA

この場合、すべての EmployeePerson のインスタンスとして定義されているので、すべての行が返されます。ただし、この場合に表示されるのは Person で定義したプロパティのみです。

SQL へのオブジェクト拡張

オブジェクト・アプリケーションで SQL を使用しやすくするために、Caché には SQL へのオブジェクト拡張が多数あります。

たいへん興味深い拡張として、リファレンス演算子 (“–>”) を使用して、オブジェクト参照を実行する機能があります。例えば、2 つのクラス、ContactRegion を参照する Vendor クラスがあるとします。リファレンス演算子を使用すると、関連するクラスのプロパティを参照できます。

SELECT ID,Name,ContactInfo->Name
FROM Vendor
WHERE Vendor->Region->Name = 'Antarctica'

また、SQL JOIN 構文を使用しても、同様のクエリ式を記述できます。リファレンス演算子構文の利点は、簡潔で理解しやすい点です。

FeedbackOpens in a new tab