はじめに
警告この拡張モジュールは、
実験的 なものです。この拡張モジュールの動作・
関数名・その他ドキュメントに書かれている事項は、予告なく、将来的な PHP
のリリースにおいて変更される可能性があります。
このモジュールは自己責任で使用してください。
SDO でリレーショナルデータアクセスサービスを使用するには、
SDO の元となっている概念を理解しておく必要があります。例えば
データグラフ、データオブジェクト、切断された動作、変更履歴、
XPath およびプロパティの表現方法などです。これらの考え方に
なじみがない場合は、まず最初に
SDO の節 を参照したほうがよいでしょう。
さらに、リレーショナル DAS では、バックエンドのデータベース固有の
実装を意識せずに使用させるために PDO 拡張モジュールを使用しています。
リレーショナル DAS を使用するには、PDO データベース接続を作成して
渡す必要があります。そのため、
PDO の節 も参照したほうがよいでしょう。
リレーショナル DAS の役割は、リレーショナルデータベースと
アプリケーションの間でのデータのやり取りを行うことです。
これを行うためには、データベースのエンティティ
- テーブル、カラム、主キー、外部キー -
および SDO モデルの要素
- 型、プロパティ、包含関係など
の対応関係をリレーショナル DAS が知っておく必要があります。
リレーショナル DAS を作成する際に、これらの情報をメタデータとして
指定します。
操作の概要
-
まずはじめに リレーショナル DAS のコンストラクタをコールし、
データベースと SDO モデルの関連付けを定義したメタデータを渡します。
以下でいくつかの例を示します。
-
次に行うことは、リレーショナル DAS の
executeQuery() メソッドをコールして
実行する SQL 文を渡すか、あるいは
executePreparedQuery() メソッドをコールして
プレースホルダつきのプリペアドステートメントと挿入する値のリストを
渡すことでしょう。また、実行するクエリ自身についてのメタデータも
指定する必要があります。DAS は、このメタデータによって
データベースからどんなカラムがどんな順番で返ってくるのかを
知ります。そのほか、PDO データベース接続も渡さなければなりません。
executeQuery() あるいは
executePreparedQuery() から返される値は、
結果セットのすべてのデータを含む正規化されたデータグラフです。
複数のテーブルから取得したデータを返すクエリの場合、このグラフには
複数のデータオブジェクトが含まれ、それらは SDO の包含関係で
連結されています。データの中には、SDO の (包含関係ではない)
参照も含まれるかもしれません。
クエリが実行されてデータグラフが作成された後は、リレーショナル
DAS やデータベース接続のインスタンスは必要ありません。
データベース上でロックを保持することはありません。
リレーショナル DAS および PDO データベース接続は、それぞれ
メモリから削除されます。
-
データグラフの中のデータに変更が加えられることも大いにありえるでしょう。
データグラフは PHP のセッション内にシリアライズすることが可能で、
いちどきりのクライアント - サーバーのやり取りだけではなく複数に
またがって使用できます。データオブジェクトを作成してグラフに
追加する・グラフ内の既存のデータオブジェクトを削除する・
グラフ内のデータオブジェクトを変更するなどが可能です。
-
最後に、リレーショナル DAS の applyChanges()
メソッドを使用して、データグラフに対する変更内容をデータベースに
書き戻します。そのためには、先ほどと同じメタデータを使用して
リレーショナル DAS の新しいインスタンスを作成する必要があります。
また、データベースへの接続も確立しなければなりません。
接続およびデータグラフが、applyChanges()
に渡されます。ここで、リレーショナル DAS は変更の内容を吟味して
INSERT、UPDATE および DELETE のうち適切な SQL 文を作成します。
UPDATE および DELETE 文を実行するには、データベース内のデータが
もとのままでなけれあbなりません。そのため、もしデータベース内の
データが変更されていた場合は、それが検出されます。ここでは
そのような衝突は発生しなかったことにしましょう。これにより、
変更内容がデータベースに適用されました。この後は、
データグラフにさらに変更を加えて再度適用することもできますし、
あるいはデータグラフを削除することもできます。
別の方法でデータベース内のデータを扱うこともできます。
例えば、事前に executeQuery() をコールせずに、
単にデータオブジェクトを作成してそれをデータベースに書き戻すことができるのです。
この方法については、下の
例
で説明します。