永続クラスのその他のオプション
ここでは、永続クラスに使用できる、その他のオプションについて説明します。
シャード・クラスの定義
データ・ストレージの水平方向の拡張にシャーディングを使用している場合、クラス定義で Sharded クラス・キーワードを使用してシャード・クラスを定義できます。シャード・クラスは永続クラスの 1 つで、データはシャード・クラスタのデータ・ノード間で分散されますが、アプリケーションはローカルの場合と同じようにそのデータにアクセスできます。
シャード・クラスを作成するには、以下の例のようにキーワード Sharded = 1 を設定します。
Class MyApp.Person Extends %Persistent [ Sharded = 1 ]
シャード・クラスが完全に実装されるまでは、オブジェクト側からではなく SQL からシャード・テーブルを作成することをお勧めします。
シャードの詳細は、"シャーディングによるデータ量に応じた InterSystems IRIS の水平方向の拡張" を参照してください。
読み取り専用クラスの定義
オブジェクトを開くことはできても、保存または削除できない永続クラスを定義できます。これを行うには、クラスの READONLY パラメータを 1 に設定します。
Parameter READONLY = 1;
これは、既存のストレージ (既存のグローバルや外部データベースなど) にマップされたオブジェクトを持っている場合にのみ便利です。読み取り専用オブジェクトで %Save() メソッドを呼び出す場合、常にエラー・コードが返されます。
インデックスの追加
インデックスは、永続クラスのインスタンス全体にわたる検索を最適化するメカニズムを提供します。クラスに関連付けられたデータのうち、要求されることが多いデータの一部をソートしてインデックスが定義されます。これらは、パフォーマンス・クリティカルな検索のオーバーヘッドを削減するのに非常に役立ちます。
インデックスは、インデックスが定義されるクラスの全範囲を自動的にカバーします。Person クラスにサブクラス Student がある場合、Person で定義したすべてのインデックスでは、Person オブジェクトと Student オブジェクトの両方が対象になります。Student クラスで定義したインデックスでは、Student オブジェクトのみが対象になります。
インデックスは、そのクラスに属する 1 つまたは複数のプロパティでソートできます。これは、返される結果の順序を制御するのに大変便利です。
またインデックスは、ソートされたプロパティに基づいて、クエリで頻繁に要求される他のデータを格納できます。インデックスの一部として他のデータを含めることによって、インデックスを使用するクエリの性能が大きく向上します。メイン・データ・ストレージにアクセスしなくても、クエリがインデックスを使用して結果セットを生成できます。(以下の Data キーワードを参照してください。)
インデックス定義をクラスに追加すると同時に、そのインデックスにデータを構築するには、ALTER TABLE 文、CREATE INDEX 文、または DROP INDEX 文を使用する以外に方法はありません。クラス定義にインデックスを追加する場合は、インデックスを手動で構築する必要があります。インデックスを手動で構築する方法の詳細は、"インデックスの構築" を参照してください。
インデックスの追加情報は、"インデックスの定義と構築" の、特に "インデックスを付けることができるプロパティ" のセクションを参照してください。"クラス定義でのインデックスの構文" も参照してください。
外部キーの追加
対応する永続クラスの外部キーを定義して、テーブル間の参照整合性を強制できます。外部キー制約を持つテーブルを変更する際に、外部キー制約が確認されます。外部キーを追加する方法の 1 つは、クラス間にリレーションシップを追加することです。"リレーションシップの定義と使用" を参照してください。クラスには、明示的な外部キーも追加できます。詳細は、"外部キーの使用法" および "クラス定義での外部キーの構文" を参照してください。
トリガの追加
InterSystems SQL はトリガの使用をサポートしているので、永続クラスに関係するすべてのトリガは、クラスの SQL プロジェクションの一部として含まれています。
トリガは、特定のイベントが InterSystems SQL で発生するときに実行されるコード・セグメントです。InterSystems IRIS® データ・プラットフォームは INSERT コマンド、UPDATE コマンド、および DELETE コマンドの実行をベースにしたトリガをサポートします。トリガ定義により、指定されたコードは関連するコマンドが実行される直前、または直後に実行されます。各イベントは、実行順序が指定されていれば複数のトリガを持つことができます。
Foreach = row/object を使用してトリガが定義されている場合、トリガはオブジェクト・アクセスの特定の時点でも呼び出されます。"トリガとトランザクション" を参照してください。
トリガは、従来のストレージ・クラス %Storage.SQL によって使用されていた永続メソッドによっても呼び出されます。これは、永続の動作を内部的に実装するために SQL 文を使用しているためです。
ObjectScript からのフィールドの参照
クラス定義内には、SQL で使用される ObjectScript コードを含むことのできる場所が複数あります。例えば、SQL 計算フィールド・コードおよびトリガ・コードは、SQL 内から実行されます。これらの場合、現在のオブジェクトという概念はないので、ドット構文を使用して、特定のインスタンス内のデータにアクセスしたり、データを設定することはできません。代わりに、フィールド構文を使用して現在の行内のフィールドとして同じデータにアクセスできます。
現在の行の特定のフィールドを参照するには、{fieldname} 構文を使用します (fieldname は、フィールド名です)。
例えば、以下のコードは、従業員の給与が、50000 未満かどうかを確認します。
If {Salary} < 50000 {
// actions here...
}
UPDATE トリガ・コードでは、{fieldname} は、更新済みのフィールド値を示します。DELETE トリガ・コードでは、{fieldname} は、ディスク上のフィールドの値を示します。
SQL 計算フィールドの現在のフィールドを参照するには、{*} 構文を使用します。
例えば、以下のコードは、Compensation フィールドのための計算コードに表示され、Salary フィールドおよび Commission フィールドの値に基づいてその値を計算します。
Set {*} = {Salary} + {Commission}
トリガ固有の構文については、"特殊なトリガ構文" を参照してください。