12.17.1 抽象データ型の効果と継承
HiRDBでは表を構成する列のデータ型として抽象データ型を定義できます。
抽象データ型とは,既定義のデータ型で扱えないような複雑なデータを扱いやすく表現するための構造を持ったデータ型のことです。HiRDBでは,このようなデータ型をユーザが抽象データ型として定義できます。抽象データ型では,構造を示す属性とその値に対する操作をひとまとまりとし,定義系SQLによって定義できます。
抽象データ型は,数値型や文字型などの既定義のデータ型と同様に,表を構成する列のデータ型としてを扱えます。
抽象データ型を含む表のデータ構造を次の図に示します。次の図では,社員表中の「従業員」列のデータ型を抽象データ型「t_従業員型」としています。
(1) 抽象データ型を定義した場合の効果
-
複雑な構造のデータを一つの値として扱えます。
-
データとそれに対する操作を一体化することで,オブジェクト指向のアプリケーションとマッピングしやすくなります。
-
データとそのデータに対する操作をひとまとまりとし,操作を外部的なインタフェースとすることで,データの内部情報を意識することなくデータを扱えます。
(2) 継承の概要
(a) 継承(inheritance)
HiRDBでは,既に定義した抽象データ型を基に,その型に定義された属性と操作を受け継いだ新しい抽象データ型を導出し定義できます。基になる型をスーパタイプといい,導出した型をサブタイプといいます。サブタイプがスーパタイプの属性及び関数を引き継ぐことを継承といいます。
スーパタイプ−サブタイプの関係は階層的に表現できます。これによって,複雑な概念モデルを抽象データ型を用いて階層化して表現できます。
抽象データ型のスーパタイプ−サブタイプ関係に基づく階層構造を次の図に示します。次の図では,抽象データ型「従業員」から,サブタイプ「営業部員」を導出しています。
(3) 継承を利用したときの効果
継承を利用することで,次に示す効果が期待できます。
-
上位の抽象データ型の特性(データ及び操作)を下位の抽象データ型でも利用できます。
-
サブタイプを定義することで,最初から定義し直さなくてもデータ定義を共有できます。これによって,データベースの定義の手間が省けます。
-
多重定義によって,呼び出すルーチンの名称を型によって変更する必要がありません。
(4) 抽象データ型の定義方法
抽象データ型を定義するには,定義系SQLのCREATE TYPEを実行します。CREATE TYPEでは,構造を示すための属性と,値に対する操作を定義します。また,継承を利用する場合はCREATE TYPEでサブタイプ句を指定して定義します。CREATE TYPEの定義例については,「ユーザが定義した抽象データ型を定義した表の作成」を参照してください。
(a) コンストラクタ関数の定義
抽象データ型の値を生成するための関数(コンストラクタ関数)を定義します。コンストラクタ関数の実装で,抽象データ型の定義時にHiRDBによって提供されるデフォルトコンストラクタ関数を利用できます。デフォルトコンストラクタ関数は,すべての属性がナル値である値を生成します。
(c) 隠蔽レベルの指定
抽象データ型を構成する属性及びルーチンに対するアクセスを制御するため,隠蔽レベルを指定できます。隠蔽レベルは,属性及びその抽象データ型の値に対する操作であるルーチンに指定できます。隠蔽レベルには,次に示す3種類があります。
-
その抽象データ型やサブタイプ以外の抽象データ型の定義中,アプリケーションからも属性の値へアクセスさせたい場合及びルーチンを使用させたい場合に指定します。
-
内部情報がアプリケーションによって直接変更されることを防ぎたい場合などに,その抽象データ型の定義中だけで,属性の値へアクセスさせたい場合及びルーチンを使用させたい場合に指定します。SQLで属性の値へアクセスさせたい場合及びルーチンを使用したい場合は,関数を定義する必要があります。
-
情報秘匿のため,アプリケーションから直接参照させたくない場合などに,その抽象データ型の定義中及びその抽象データ型のサブタイプの定義中でだけ属性の値へアクセスさせたい場合やルーチンを使用させたい場合に指定します。
抽象データ型の定義内でいったん隠蔽レベルを指定すると,次に別の隠蔽レベルの指定が出現するまでは直前の隠蔽レベルが有効になります。また,隠蔽レベルの指定がない場合,PUBLICが仮定されます。隠蔽レベルの違いによって,データへのアクセス,ルーチンの使用権限の範囲が異なります。
隠蔽レベルと権限を次の表に示します。
隠蔽レベル |
アクセス元 |
|||
---|---|---|---|---|
その抽象データ型の定義内 |
サブタイプの抽象データ型の定義内 |
左記以外の抽象データ型の定義内 |
アプリケーション |
|
PUBLIC |
○ |
○ |
○ |
○ |
PRIVATE |
○ |
× |
× |
× |
PROTECTED |
○ |
○ |
× |
× |
- (凡例)
-
○:属性値へのアクセス及びルーチンを使用できます。
×:属性値へのアクセス及びルーチンを使用できません(SQLエラーになります)。