いま知るべきオブジェクトデータベースの世界(2)

受発注システムで体験するオブジェクトデータベース

インターシステムズジャパン株式会社
テクニカルコンサルティング部 教育サービス部部長
佐藤 比呂志
2009/9/18

プログラマによって差が出ない記法

 次に、注文明細部分の表示部分について説明しましょう。注文と注文明細の間には通常1対多の関係があります。Cachéでこれを表現する方法はいくつかありますが、ここではリレーションシップという、一種のコレクション型で表現します。

For i = 1 : 1: ord.Items.Count() { 

 まず、この注文に何個の注文明細があるかを取得します。

 リレーションシップとして定義した場合、Count()メソッドが定義されていますので、リレーションシップオブジェクトはそのメソッドを呼び出して、何個のコレクション要素が含まれるか取得します。ここでは、その数の分だけ以下の処理を繰り返します。

Write ord.Items.GetAt(i).TheProductStock.TheProductSize.TheProduct.Name

 Items.GetAt(i)という表現は、明細オブジェクトコレクションのi番目のオブジェクトを取得するという意味です(正確には、GetAtメソッドが1つの明細オブジェクトの参照を返す)。それ以降は、もうおなじみのカスケード参照を繰り返しているだけです。つまり、

  • i番目の注文明細オブジェクトが参照する商品在庫オブジェクトが参照する
  • 商品サイズオブジェクトが参照する商品オブジェクトの名前を見る

ということになります。

 各オブジェクトの関連を理解してさえいれば、あとはそれをカスケード参照でどう表現するかだけで、プログラムの記述を進めていくことができます。つまり、プログラマは、ビジネスロジックに集中しながらプログラミングを進めていくことができます。

 もう1ついえることは、開発者によって差が出にくいということです。

 データを表現するものは、すべてカスケード参照が基本となりますので、この部分での表記法の違いはほとんど発生しません。誰が書いても似た形式になるということは、後々のメンテナンス作業が楽になることを意味します。

RDBではどう表現されるか

 ではこの一連の処理を、リレーショナルデータベースを使い、SQL文で処理する方法を考えてみましょう。これは、けっこう煩雑な処理で、実装者によっても処理の詳細は異なることでしょう。

 最初にヘッダの部分の表示です。

●図3 注文明細書のヘッダ部分
ヘッダー部分

 ここは、注文テーブルと顧客テーブルと住所テーブル(別テーブルにする実装であれば)を結合して、必要な情報を取得するという処理になります。検索の条件としては、

  • 注文IDが一致する注文テーブルレコード
  • 注文テーブルの顧客IDとそのIDが一致する顧客テーブル
  • その顧客IDに合致する住所テーブル(住所テーブルを別実装にした場合)

が考えられます。

 次に明細行の表示です。ここでは、必要な情報を取得するために注文明細テーブル、在庫テーブル、価格テーブル、商品テーブルを結合して、必要な情報を取得するという処理になります。検索の条件は、

  • 注文IDが一致する注文明細テーブルレコード
  • 関連付けられる在庫テーブル行(商品ID、サイズ、色が一致するもの)
  • 価格テーブル行(商品ID、サイズが一致するもの)
  • 商品テーブル行(商品IDが一致するもの)

の4つのテーブルの結合処理になりますので、その結合のための条件も4つ必要になります。明細行の取得は複数行返ってくる可能性がありますので、結果セットを繰り返し処理する必要があります。

 またこの問い合わせの結果取得されたフィールド(カラム)の値をホストプログラムの変数に一度転送して処理するケースもあると思います。そのときに、どのテーブルのどのカラムがサイズなのか、どれが色なのかということを意識しながらそのホスト変数への転送処理を考えなければなりません。これらは、難しい話ではありませんが、単純で退屈、そして面倒くさい作業です。

 SQLがあまり得意ではない開発者の場合には、結合処理ではなく、個々のテーブルにアクセスするプログラミングをするかもしれません(スケーラビリティを確保するためにあえてこういうプログラミングスタイルを採用するケースもあるそうです)。いずれにしても、いろいろな処理方法が考えられます。

 人によってやり方がばらばらだと、後々メンテナンスが困難になりやすくなります。かといって最初にSQLの記述標準を決めるといっても、いろいろな要件を考慮すると難しかったりします。

 この問題に対処するためにDAO(Data Access Object)やO/Rマッピングを使用するケースも多いことと思います。DAOやO/Rマッパーを使うことにより、ビジネスロジック部分のプログラミング作業はかなり軽減されますが、それでもSQL文から完全に解放されるわけではありません。

前のページへ 2/3 次のページへ

Index
受発注システムで体験するオブジェクトデータベース

Page 1
データモデルの構築
Cacheでのプログラミング実例
→ Page 2
プログラマによって差が出ない記法
RDBではどう表現されるか

Page 3
問い合わせ処理の実装
メモリにロードされるタイミングは
難しいことはデータベースで。だからプログラマは集中できる

いま知るべきオブジェクトデータベースの世界


Database Expert フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Database Expert 記事ランキング

本日月間