アプリケーション開発の手引き

DB2 オブジェクト拡張を使用する理由

現代プログラミング言語技術における重要な最新開発の 1 つに、 オブジェクト指向 があります。オブジェクト指向は、アプリケーション定義域内のエンティティーを分類し、互いに関連する独立したオブジェクトとしてモデル化する概念です。オブジェクトの外部的な振る舞いおよび特性は外部に出されますが、オブジェクトの内部インプリメンテーションの詳細は隠れたままになります。オブジェクト指向により、アプリケーション定義域のオブジェクトの類似点と相違点を明らかにし、それらのオブジェクトを関連したタイプごとにグループ化することができます。同一タイプのオブジェクトは、そのタイプ固有の振る舞いの集合を共用するため、アプリケーション定義域のオブジェクトの振る舞いを反映して同じように振る舞います。

DB2 のオブジェクト拡張により、関連技術の利点の上に成り立つオブジェクト技術の多くの利点を実現化できます。 関係システムでは、データ・タイプを使用して、そのインスタンス (またはオブジェクト) が保管される表の列中のデータを記述します。このようなインスタンスでの操作は、そのような表現が許可されているすべての場所で呼び出し可能な演算子または関数によってサポートされます。

DB2 のオブジェクト拡張では、オブジェクト指向 (OO) の概念と方法論をそこに組み込むことができます。

DB2 のオブジェクト関連機能

データをオブジェクト指向でモデル化するのに役立つ以下のようなオブジェクト指向機能があります。

とても大きなオブジェクト用のデータ・タイプ
システムでモデル化する必要のあるデータが大きくて複雑な場合があります (たとえば、テキスト、音声、技術データ、またはビデオなど)。このサイズのオブジェクトでは、 VARCHAR または VARGRAPHIC データ・タイプは十分な大きさではないかもしれません。 DB2 は、このようなデータ・オブジェクトを 2 ギガバイト (GB) 以下のサイズのストリングとして保管するために、3 つのデータ・タイプを備えています。その 3 つのデータ・タイプとは、2 進ラージ・オブジェクト (BLOB)、 1 バイト文字ラージ・オブジェクト (CLOB)、および 2 バイト文字ラージ・オブジェクト (DBCLOB) です。

ユーザー定義のデータ・タイプ
ユーザー定義のタイプでオブジェクトのセマンティクスを制御できます。たとえば、ご使用のアプリケーションで "text" というタイプまたは "address" というタイプが必要になるかもしれません。これらのタイプは組み込みタイプとしては存在しません。しかし、 DB2 のオブジェクト関連機能を使用すると、これらのタイプを定義してデータベースで使用できます。

さらに、ユーザー定義のタイプは以下のように分類できます。

特殊タイプ
特殊タイプは既存の DB2 組み込みデータ・タイプに基づいたものです。つまり、特殊タイプは内部的には組み込みタイプと同様です。しかし、これらのタイプのセマンティクスを定義することができます。さらに、DB2 にはとても大きなオブジェクトを保管および操作するための組み込みタイプがあります。特殊タイプは以下の中の 1 つのラージ・オブジェクト (LOB) データ・タイプに基づいています。これらを音声またはビデオ・ストリームなどを保管するために使用できるかもしれません。

構造タイプ
構造タイプは、単一タイプのもとにオブジェクト属性の集合を集めるためのものです。

ユーザー定義の振る舞い
DB2 がオブジェクトに操作を行うことを可能にするため、 SQL または外部言語で独自のルーチンを作成することができます。ユーザー定義のルーチンには、以下の 2 つのタイプがあります。

ユーザー定義関数 (UDF)
UDF とはユーザーが定義できる関数で、組み込み関数や演算子と同様に SQL 照会でのオブジェクトの操作をサポートします。 UDF を使用して、ユーザー定義タイプだけではなくいかなるタイプの列値を操作できます。

ユーザー定義メソッド
UDF と同様、オブジェクトの振る舞いを定義しますが、特定のユーザー定義構造タイプに固くカプセル化されています。

索引拡張
索引拡張は、DB2 による構造タイプおよび特殊タイプの索引方法を指定します。索引拡張を作成するには、 CREATE INDEX EXTENSION ステートメントを発行する必要があります。 CREATE INDEX EXTENSION ステートメントは、構造タイプまたは特殊タイプの値を索引キーに変換するための外部表関数を指定して、DB2 がこれらの索引キーを検索してパフォーマンスを最適化する方法を定義します。

これらの表関数の作成方法については、 ユーザー定義関数 (UDF) とメソッドの作成を参照してください。索引拡張を使用して、構造タイプおよび特殊タイプを使用するアプリケーションのパフォーマンスを向上させるための方法についての詳細は、 管理の手引き を参照してください。 CREATE INDEX EXTENSION ステートメントの詳細については、 SQL 解説書 を参照してください

制約
制約とは、ユーザーが定義してデータベースが実施する規則のことです。以下のような 4 つの制約があります。

固有
表のキーが固有なものであるようにします。固有キーを構成する列に対して行われるどんな変更に対しても、それが固有であるかどうかの検査が行われます。

参照保全
挿入、更新、および削除操作に対して参照制約を強要します。これは、すべての外部キーの値が有効であることを示すデータベースの状態です。

表検査
表が作成または更新された際に、変更されたデータが指定された条件に違反していないかどうかを検査します。

トリガー
トリガーはある表に関連した SQL ステートメントから成り、その表に対してデータ変更操作が行われる際に自動的に活動化されます。トリガーを使用すると、業務規則などの一般的な保全形式をサポートすることができます。

固有制約、参照保全、および表検査制約についての詳細は、 管理の手引き を参照してください。トリガーについての詳細は、 活動状態の DBMS でのトリガーの使用を参照してください。

一般のアプリケーションでのオブジェクト指向機能の使用
DB2 のオブジェクト指向機能間には、重要な協同性があります。 DB2 オブジェクト指向のメカニズムは、オブジェクト指向のアプリケーションのサポートに限らず、他の目的にも使用することができます。 C++ などの一般的なオブジェクト指向プログラミング言語があらゆる種類の非オブジェクト指向アプリケーションを実行するために使用されるように、 DB2 に備えられているオブジェクト指向のメカニズムも、あらゆる種類の非オブジェクト指向アプリケーションをサポートするのに非常に役立ちます。 DB2 のオブジェクト関連機能は、あらゆるデータベース・アプリケーションをモデル化するために使用できる汎用メカニズムです。したがって、こうした DB2 オブジェクト拡張は、一般的なアプリケーションのサポートを向上する他に、非一般の、すなわちオブジェクト指向のアプリケーションにも拡張的なサポートを行います。

ユーザー定義の特殊タイプ

特殊タイプは既存の組み込みタイプに基づいています。たとえば、 USDollar および Canadian_Dollar などの様々な通貨を表すための特殊タイプがあるとしましょう。これらのタイプは、両方とも通貨を定義した組み込みタイプとして内部的に (ホスト言語プログラムでも) 表されています。たとえば、両方の通貨を DECIMAL として定義すると、それらはシステム内で 10 進データ・タイプとして表示されます。

強力タイピング
同一の組み込みタイプに基づいて異なった特殊タイプを持てますが、特殊タイプは強力タイピング の特性を持ちます。強力タイピング特性では、そのようなタイプのインスタンスを、そのタイプの別のインスタンス以外とは直接比較できないようにします。これにより、変換処理を行わずに USDollar と Canadian_Dollar を直接加算するなどの、セマンティクス的にはありえないような操作を阻止します。特殊タイプのインスタンスでどんな操作が行えるかは、ユーザーが定義します。

タイプの振る舞い
USDollar または Canadian_Dollar のインスタンスでどんな操作が許可されるかをどのように定義できるでしょうか。ユーザー定義の関数を使用して、特殊タイプで可能な振る舞いを定義します。関数を登録することによって USDollar のインスタンスを加算するような簡単な操作を行えます。この関数は、USDollar を入力として受け取る簡単な組み込み加算操作です。このような関数を定義するのにアプリケーションを作成する必要はありません。

しかし、USDollar タイプを入力として受け取り、それを Canadian_Dollar タイプに変換するもっと複雑な関数を作成したいと思われるかもしれません。ユーザー定義の関数についての詳細は、 ユーザー定義関数 (UDF) およびメソッドを参照してください。

制約を使用すると、保全性の規則を実装できます。

ラージ・オブジェクト
特殊タイプでモデル化するオブジェクトは非常に大きいものかもしれません。しかし、DB2 には非常に大きなオブジェクトを保管および操作するための新しい組み込みタイプがあります。特殊タイプは以下の中の 1 つのラージ・オブジェクト (LOB) データ・タイプに基づいています。これらを音声またはビデオなどに使用できるかもしれません。

オブジェクトの振る舞いの定義: ユーザー定義のルーチン

オブジェクトの振る舞いを定義するには、以下のようなユーザー定義関数およびメソッドを使用できます。

ユーザー定義関数
UDF とはユーザーが定義できる関数で、組み込み関数や演算子と同様に SQL 照会でのオブジェクトの操作をサポートします。 (UDF を使用して、ユーザー定義タイプだけではなくすべてのタイプの列値を操作できます。) ですから、ユーザー定義タイプのインスタンス (特殊または構造化されたもの) は、表の列または行の中に保管され、SQL 照会によって UDF で操作されます。たとえば、LENGTH という特殊タイプのインスタンスと WIDTH という特殊タイプのインスタンスを受け取って、面積を計算してから照会に戻す、以下のような AREA という関数を定義できます。

SELECT ID, area(length, width) AS area
FROM Property
WHERE area > 10000;

メソッド
UDF と同様、メソッドはオブジェクトの振る舞いを定義しますが、以下のような点で関数とは異なります。

列内に保管されている構造タイプのメソッドを呼び出すには、構造タイプの名前 (または、構造タイプに分解できる式) を呼び出しに含め、メソッド呼び出し演算子 (.. ) を続け、さらにその後ろにメソッドの名前を続けます。構造タイプの範囲参照のメソッドを呼び出すには、参照解除演算子 (->) を使用して構造タイプへの参照を含め、メソッド呼び出し演算子を続けます。それから、メソッドの名前を指定します。

DB2 のオブジェクト・リレーション機能についての詳細は、以下を参照してください。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]