受発注システムで体験するオブジェクトデータベース
前回の記事「オブジェクト指向の開発、そしてRDBの限界」では、オブジェクトデータベースとはどういうものであるかという話をしました。今回はもう少し具体的に、オブジェクト指向データベースを使ったアプリケーションの構築法について解説したいと思います。ここでは主に、インターシステムズのCaché(キャシエ)で記述したプログラムを使って説明したいと思います。
今回はアプリケーションの題材として、仮想の衣料問屋の受発注システムを考えてみたいと思います。紙面の関係もあり、その受発注処理のほんの一部について取り上げます。
データモデルの構築
まず、今回のシステムで使うデータモデルを示します。実際のシステムでは、もっとデータ項目が必要と思われますが、ここでは本格的なアプリケーションを作ることが目的ではありませんので、かなり簡略化したモデルを使うことにします。
●図1 仮想の衣料問屋の受発注システムのデータモデル一方で、リレーショナルデータベースを使って、SQLを駆使して開発する場合の煩雑さを際立たせるために 、逆に構造的に少し複雑な要素を取り入れています【注1】。
このモデル構造には実際のアプリケーション構築という観点からは少々問題がありますが、以下の説明には影響しないので無視します。
具体的には、商品情報が、商品基本情報、サイズ情報、在庫情報と3つに分かれていて、それらが階層的な構造になっている点です。サイズによって同じ商品でも価格が違い、在庫は、商品/サイズ/色で別々に管理したいということを想定しています。
こういう条件の中、すでにいくつかの注文がなされているという想定で、以下のような注文明細を表示するプログラムを考えてみたいと思います。
●図2 注文明細書サンプルこれを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】。
それでは、このプログラムの内容を説明していきます。
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 問い合わせ処理の実装 メモリにロードされるタイミングは 難しいことはデータベースで。だからプログラマは集中できる |
いま知るべきオブジェクトデータベースの世界 |
- Oracleライセンス「SE2」検証 CPUスレッド数制限はどんな仕組みで制御されるのか (2017/7/26)
データベース管理システムの運用でトラブルが発生したらどうするか。DBサポートスペシャリストが現場目線の解決Tipsをお届けします。今回は、Oracle SE2の「CPUスレッド数制限」がどんな仕組みで行われるのかを検証します - ドメイン参加後、SQL Serverが起動しなくなった (2017/7/24)
本連載では、「SQL Server」で発生するトラブルを「どんな方法で」「どのように」解決していくか、正しい対処のためのノウハウを紹介します。今回は、「ドメイン参加後にSQL Serverが起動しなくなった場合の対処方法」を解説します - さらに高度なSQL実行計画の取得」のために理解しておくべきこと (2017/7/21)
日本オラクルのデータベーススペシャリストが「DBAがすぐ実践できる即効テクニック」を紹介する本連載。今回は「より高度なSQL実行計画を取得するために、理解しておいてほしいこと」を解説します - データベースセキュリティが「各種ガイドライン」に記載され始めている事実 (2017/7/20)
本連載では、「データベースセキュリティに必要な対策」を学び、DBMSでの「具体的な実装方法」や「Tips」などを紹介していきます。今回は、「各種ガイドラインが示すコンプライアンス要件に、データベースのセキュリティはどのように記載されているのか」を解説します
|
|