受発注システムで体験するオブジェクトデータベース
プログラマによって差が出ない記法
次に、注文明細部分の表示部分について説明しましょう。注文と注文明細の間には通常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 問い合わせ処理の実装 メモリにロードされるタイミングは 難しいことはデータベースで。だからプログラマは集中できる |
いま知るべきオブジェクトデータベースの世界 |
- 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」などを紹介していきます。今回は、「各種ガイドラインが示すコンプライアンス要件に、データベースのセキュリティはどのように記載されているのか」を解説します
|
|