ストレージ定義
ほとんどの場合、永続クラスにはグローバル構造を記述するストレージ定義が含まれます。InterSystems IRIS® データ・プラットフォームでは、クラスのデータを保存するときや、クラスの保存データを読み込むときに、この構造を使用します。
このページでは、ストレージ定義の役割、およびストレージ定義で使用されるストレージ・クラスの役割について説明します。また、クラス定義が変更されるとどうなるかについても説明します。
ストレージ定義の概要
永続クラスを定義してコンパイルすると、InterSystems IRIS は永続クラスのストレージ定義を生成し、クラス定義の最後にストレージ定義を追加します。以下に、ストレージ定義の例を示します。
Storage Default
{
<Data name="PresidentDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>Name</Value>
</Value>
<Value name="3">
<Value>BirthYear</Value>
</Value>
<Value name="4">
<Value>Bio</Value>
</Value>
</Data>
<DataLocation>^GlobalsTest.PresidentD</DataLocation>
<DefaultData>PresidentDefaultData</DefaultData>
<IdLocation>^GlobalsTest.PresidentD</IdLocation>
<IndexLocation>^GlobalsTest.PresidentI</IndexLocation>
<StreamLocation>^GlobalsTest.PresidentS</StreamLocation>
<Type>%Storage.Persistent</Type>
}
ストレージ・クラス (この例では、%Storage.Persistent) を指定する <Type> 要素に注意してください。
ストレージ定義によって参照されるグローバルについては、別のページで詳しく説明します。ここでは単に、ストレージ定義がグローバルの編成方法 (各プロパティのデータがどの添え字に含まれるかなど) を記述する点に注意してください。
永続クラスは、実際には複数のストレージ定義を含むことができますが、一度に 1 つしかアクティブになりません。アクティブなストレージ定義は、クラスの StorageStrategy キーワードを使用して指定されます (ここでは説明しません)。既定では、永続クラスは Default と呼ばれるストレージ定義を 1 つ持っています。
ストレージ・クラス
%PersistentOpens in a new tab クラスは、データベースでのオブジェクトの保存と取得に使用する高レベルのインタフェースを提供します。オブジェクトの保存とロードの実際の作業は、ストレージ・クラスによって制御されます。前の例で示したように、ストレージ定義 (クラス定義の一部) は使用するストレージ・クラスを指定します。
ストレージ・クラスは、データベース内でオブジェクトを格納、ロード、削除するために使用される実際の内部メソッドを生成します。これらの内部メソッドはストレージ・インタフェースであり、%LoadData()、%SaveData()、%DeleteData() などの内部メソッドが含まれます。これらのメソッドはアプリケーションから直接呼ばれることはなく、永続インタフェース (%OpenId() や %Save() など) のメソッドによって適宜呼び出されます。
以下の 2 つのストレージ・クラスがあります。
-
%Storage.Persistent。永続オブジェクトから使用される既定のストレージ・クラスです。これは、永続クラスに対する既定のストレージ構造を自動的に作成し、保持します。
新しい永続クラスは、自動的に %Storage.Persistent ストレージ・クラスを使用します。%Storage.Persistent クラスでは、ストレージ定義のさまざまなキーワードを使用して、クラスに使用されるストレージ構造の特定の機能を制御できます。
さまざまなストレージ・キーワードに関する詳細は、"クラス定義リファレンス" を参照してください。
また、MANAGEDEXTENT クラス・パラメータの詳細は、"エクステント定義" を参照してください。
-
%Storage.SQL。生成された SELECT、INSERT、UPDATE、および DELETE の各 SQL 文を使用してオブジェクトの永続性を提供する特別なストレージ・クラスです。%Storage.SQL は一般的に、以下の用途で使用されます。
-
従来のアプリケーションによって使用された、以前に存在したグローバル構造へのオブジェクトのマッピング
-
SQL ゲートウェイを使用した、外部リレーショナル・データベース内のオブジェクトの保存
%Storage.SQL は、複数のクラスのエクステントでのスキーマ進化の自動的なサポートを行いません。
-
スキーマ進化
クラスのストレージ定義は、クラスを初めてコンパイルしたときに生成されます。既定の %Storage.Persistent ストレージ・クラスを使用する永続クラス (シリアル・クラス) をコンパイルするとき、クラス・コンパイラはクラスによって定義されたプロパティを解析し、これを自動的にストレージ定義で使用します。
同様に、プロパティを追加すると、クラス・コンパイラはストレージ定義を更新して、これらのプロパティへのアクセスを提供します。プロパティを削除した場合、ストレージ定義内のそれらの記述は変更されずに残されます。
この自動プロセスがスキーマ進化であり、データへのアクセスを安全に維持することを目的としています。スキーマ進化は、%Storage.SQL を使用するクラスには適用されません。
ストレージ定義の再設定
開発プロセス中に、以下のような理由で、クラスのストレージ定義を再設定する必要が生じることがあります。
-
永続クラスにプロパティの追加、変更、および削除などの変更をいくらでも加えることができます。クラス・コンパイラは互換性構造を維持しようと試みるため、ストレージ定義はより複雑になっていきます。
-
SQL などのためのクラス・プロジェクションは、コンパイル後に実行されます。クラスが正しくコンパイルされ、その後、プロジェクションに失敗した場合、InterSystems IRIS は、ストレージ定義を削除しません。
ストレージ定義を再設定するには、クラスからストレージ定義を削除してから、そのクラスをリコンパイルします。
また、クラスのサンプル・データもすべて削除します。保持する必要のある既存データがある場合は、それらを新しいグローバル構造に移行する必要があります。
データを格納した永続クラスの再定義
開発プロセス中にクラスを再定義することはよくあることです。既にクラスのサンプル・データを作成している場合は、以下の点に注意してください。
-
コンパイラはクラスのデータを格納するグローバルに影響しません。
(実際には、クラス定義を削除してもクラス定義のデータ・グローバルはそのまま残されます。これらのグローバルが不要になった場合は、手動で削除してください。)
-
クラスのプロパティを追加または削除して、クラスのストレージ定義は変更しない場合、そのクラスのデータにアクセスするコードはすべて、これまでと同様に機能します。"スキーマ進化" を参照してください。
-
クラスのストレージ定義を変更する場合、データにアクセスするコードがこれまでと同様に機能するかしないかは、変更の種類によって異なります。
-
シャード化されていないものからシャード化されているものに、またはその逆にクラスを変更した場合、既存のデータにアクセスできなくなることがあります。
-
プロパティ検証がより制限的になるようにプロパティ定義を変更した場合、検証に合格しなくなったオブジェクト (またはレコード) で作業するとエラーが発生します。例えば、プロパティの MAXLEN パラメータを小さくすると、長すぎることになったそのプロパティの値を持っているオブジェクトで作業したときに、検証エラーが発生します。