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

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

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

知っているようで知らないオブジェクトデータベース。一般的な受発注システムを構築することで、その特長を体感しましょう(編集部)

 前回の記事「オブジェクト指向の開発、そしてRDBの限界」では、オブジェクトデータベースとはどういうものであるかという話をしました。今回はもう少し具体的に、オブジェクト指向データベースを使ったアプリケーションの構築法について解説したいと思います。ここでは主に、インターシステムズのCaché(キャシエ)で記述したプログラムを使って説明したいと思います。

 今回はアプリケーションの題材として、仮想の衣料問屋の受発注システムを考えてみたいと思います。紙面の関係もあり、その受発注処理のほんの一部について取り上げます。

データモデルの構築

 まず、今回のシステムで使うデータモデルを示します。実際のシステムでは、もっとデータ項目が必要と思われますが、ここでは本格的なアプリケーションを作ることが目的ではありませんので、かなり簡略化したモデルを使うことにします。

●図1 仮想の衣料問屋の受発注システムのデータモデル
fig1

 一方で、リレーショナルデータベースを使って、SQLを駆使して開発する場合の煩雑さを際立たせるために 、逆に構造的に少し複雑な要素を取り入れています【注1】

【注1】
このモデル構造には実際のアプリケーション構築という観点からは少々問題がありますが、以下の説明には影響しないので無視します。

 具体的には、商品情報が、商品基本情報、サイズ情報、在庫情報と3つに分かれていて、それらが階層的な構造になっている点です。サイズによって同じ商品でも価格が違い、在庫は、商品/サイズ/色で別々に管理したいということを想定しています。

 こういう条件の中、すでにいくつかの注文がなされているという想定で、以下のような注文明細を表示するプログラムを考えてみたいと思います。

●図2 注文明細書サンプル
fig1

 これをCachéで実装した例を以下で示します。

OrderPrint1() {
    Read "Enter OrderID ",oid
    Set ord=##class(Sample.Order).%OpenId(oid)
    Write !,?30,"注文明細書",!
    Write "注文番号 ",oid,!
    Write "〒",ord.Customer1.Address1.Zip," ",ord.Customer1.Address1.Pref,ord.Customer1.Address1.City,ord.Customer1.Address1.Street,!
    Write "電話番号 ",ord.Customer1.Telno,!
    Write ord.Customer1.Name," 御中",!
    Write !
    Write "商品名",?30,"サイズ",?45,"    色",?55,"数量",?60,"金額",!	
    Write "--------------------------------------------------------------------",!
    For i = 1 : 1: ord.Items.Count() {
            Write ord.Items.GetAt(i).TheProductStock.TheProductSize.TheProduct.Name
            Write ?30,$J(ord.Items.GetAt(i).TheProductStock.TheProductSize.SSize,4)
            Write ?45,$J(ord.Items.GetAt(i).TheProductStock.Color,6)
            Write ?55,$J(ord.Items.GetAt(i).Quantity,4)
            Write ?60,$J($FN(ord.Items.GetAt(i).TheProductStock.TheProductSize.Price*ord.Items.GetAt(i).Quantity,","),8)
        Write !
            
    }
    Write "--------------------------------------------------------------------",!
    Write "合計",?60,$J($FN(ord.Total,","),8)
}

  このプログラムは、Cachéターミナルから起動して、上記の内容を表示するものです。見栄えなどの体裁はまったく考慮していない点、ご了承お願いします。

 Cachéターミナルは、コンソールのようなもので、キーボードからの入力が標準入力、そのターミナルのウィンドウが標準出力先となります。けっこう複雑なデータモデルを使いながら、必要なプログラム行数は、非常に少なくて済んでいると感じませんか?

Cachéでのプログラミング実例

 このプログラムを正確に理解するには、Caché ObjectScriptと呼ばれるCachéのプログラミング言語の知識が必要ですが、その知識がなくとも何らかのプログラミング言語を習得しておられる方であれば、理解できるように説明していきたいと思います。

 なお、このプログラムは、単独では動作しません。動作させるためには、このプログラムで参照しているオブジェクト(インスタンスともいいます)のクラス定義が必要です。このプログラムで使用するクラス定義については、ここでは詳細説明しません。興味のある方は、ソースコードをまとめたファイル(productorder.zip)を実際にCachéシステムに格納して、内容を確認することをお勧めします【注2】

【注2】
Cachéの評価版はこちらからダウンロードができます
http://www.intersystems.co.jp/cache/downloads/index.html

 それでは、このプログラムの内容を説明していきます。

Read "Enter OrderID ",oid

 Readコマンドは、ユーザーに入力を促すコマンドです。ユーザーがキーボード経由で入力した値がoidという変数に格納されます。

Set ord=##class(Sample.Order).%OpenId(oid)

 入力されたoidを使って、Sample.Orderクラスのインスタンスをオープンします。ここで、oidは、注文番号を表し、Sample.Orderオブジェクトの識別子です。このコマンドを実行すると、Cachéデータベースから指定した識別子に該当するSample.Orderオブジェクトを取得し、Cachéのプロセス実行空間にそのオブジェクトのメモリ実体を作成し、ディスク上の実体をそのメモリ実体にコピーします。

 そして、ordという変数にそのオブジェクトのOREF(オブジェクト参照)を設定します。これはほかの言語で「ハンドル」と表現されるものと同等です。それ以降は、このOREFを使って、そのオブジェクトのメモリ上の実体にアクセスしていきます。

 そのスタイルは、前回説明したとおり、ナビゲーショナルアクセスまたは、カスケード参照といわれる表記形式です。

Write "〒",ord.Customer1.Address1.Zip," ",ord.Customer1.Address1.Pref,ord.Customer1.Address1.City,ord.Customer1.Address1.Street,!

 ここでは、注文を行った顧客の郵便番号、県、市、番地を表示します。Caché ObjectScriptでは、カスケード参照を表現するシンタックスとして、.(ドット)を使います。つまり、ord.Customer1.Address1.Zipという表現は、この注文(ord)に関連付けられる顧客(Customer1)の住所(Address1)の郵便番号(Zip)を表しています。

 どんなに関連が複雑になろうとも、階層が深くなろうとも基本は同じです。すべての関連は.(ドット)を数珠つなぎにすることによって表現できます。


1/3 次のページへ

Index
受発注システムで体験するオブジェクトデータベース
→ Page 1
データモデルの構築
Cacheでのプログラミング実例

Page 2
プログラマによって差が出ない記法
RDBではどう表現されるか

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

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


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

注目のテーマ

Database Expert 記事ランキング

本日月間