n階層システム設計の考慮点

第7回 データレイヤの設計について

この記事を読むのに必要な時間:およそ 6.5 分

今回はデータベースやその他のデータソースおよび各種サービスへの接続,データ取得を行うデータレイヤの設計について説明します。

データレイヤ

データレイヤは,データソースやサービスとのデータやり取りや接続の手順・管理・制御を行います。この階層にはデータアクセスロジックコンポーネントやサービスエージェントが含まれます。

データアクセスロジックコンポーネントは,データソースとの接続の手順,データのやり取り,接続資源の管理などを行います。この際,接続するデータソースはDBであったり,ファイルであったりします。接続先によって接続手順は異なるため,これらの煩わしさをビジネスレイヤに意識させないようにデータレイヤに隠ぺいします。サービスインターフェイスもデータアクセスロジックコンポーネントと同様ですが,接続先がCOM+サービスであったり,Webサービスであったりします。そのため,それぞれのサービスのインターフェイスにあった方法で接続する必要があります。

それでは,各コンポーネントの設計について説明します。

1. データアクセスロジックコンポーネントの設計について

n階層アプリケーションではデータストアへの接続はデータアクセスロジックコンポーネントに集約するように設計します。これにより,ビジネスレイヤではデータストアごとの固有の設定や接続,トランザクション制御(ただし,ほとんどの業務ロジックはこの方式が多いと思われますが,複数のデータストアに対する操作が発生する場合はビジネスレイヤでトランザクション制御を行う必要があります),データ取得等を意識することなく,設計することができます。

① データアクセスロジックコンポーネントの設計の注意点

データアクセスロジックコンポーネントは以下の点に注意して設計します。

一つのデータストアに対する操作は一つのデータアクセスロジックコンポーネントに集約する

一つのデータストアに対する操作を集約することのより,リソースの有効利用を図ることができます。

データソースへの接続はリソースと時間がかかります。そのため,できるだけ接続したコネクションをうまく共有して使用する方式を検討します。データベースであればコネクションプールをうまく活用します。ADO.NETを経由し,各種データベースの.NETネイティブプロパイダを使用している場合,ほとんどの.NETネイティブプロパイダではコネクションプールでの接続は標準で保持されている設定になっていると思います。使用するデータベースの.NETネイティブプロパイダの設定を調べてください。

また,ファイルであれば,接続状態を維持しながら排他に注意して共有します。

データアクセスロジックコンポーネント内にはデータを保持しない

データアクセスロジックコンポーネントはビジネスレイヤの変更に影響されないように設計する必要があります。また,データアクセスロジックコンポーネントは再利用されることを前提に設計する必要があります。そのため,内部でデータの保持はしないように設計します。もし,検索結果の再利用が検討される場合はデータストア側のキャッシュ機能を利用するように設計します。

データアクセスロジックコンポーネントの内部はできる限りシンプルにする

前記しましたが,データアクセスロジックコンポーネントは再利用されることを前提に設計します。そのため,内部構造をシンプルにし,できるだけ処理ロスをなくすようにします。また,データアクセスロジックコンポーネント内でのデータの入れ替えやソート,結合などはせずに,データアクセスロジックコンポーネントの呼び出し元のインターフェイスの構造・データ型にあったデータを取得・引き渡しするようにします。

データストアがデータベースである場合,SQL文などでデータ構造およびソート・結合等は指定することができます。また,データ型についてもデータベースのデータ型をそのまま使用できる場合もあります。これらを使用することによりデータの入れ替えや型変換に費やされるリソースおよび処理時間を短縮できます。

データアクセスロジックコンポーネントでは複数データストアへのデータの更新・削除・作成などの操作を行うトランザクションを開始しない

複数データストアへのデータの読み取り以外の操作を行う場合は,業務ロジックに依存する部分が多いと思われます。そのため,業務ロジックと切り離して設計するデータアクセスロジックコンポーネントではこれらの機能を盛り込まないようにします。また,システムエラーや例外処理が発生した場合など,データアクセスロジックコンポーネント内で解決できない場合も多いため,これらの機能を盛り込まないようにします。

データアクセスロジックコンポーネントでトランザクションを開始しない場合,呼び出し元がトランザクションルートとなれるためのインターフェイスを用意する

前記の複数データソースへの操作が業務ロジック上必要な場合は,トランザクションルートをビジネスレイヤにする必要があります。そのため,データアクセスロジックコンポーネントではデータストアへの接続とデータのやり取りのみとし,呼び出し元がトランザクションを開始するためのインターフェイスを公開するように設計する必要があります。

プレゼンテーションレイヤからのデータアクセスロジックコンポーネントへの呼び出しは原則避ける

プレゼンテーションレイヤからの呼び出しは原則的にないようにします。これはセキュリティホールになる可能性があります。また,ビジネスレイヤを通らないデータ操作が行われることとなるため,入力チェックなどの機能が働かず,SQLインジェクションなどの脅威に晒される可能性があります。

著者プロフィール

露木敏博(つゆきとしひろ)

1966年神奈川県横浜市生まれ。1990年,株式会社日立システムアンドサービス(旧日立システムエンジニアリング株式会社)に入社。

流通系SE,営業所駐在SEなどを経て,2003年から生産技術部門で.NET技術に関する技術支援業務に携り,.NET技術に関する各種基準書および標準化,設計ガイドなどを作成。

マイクロソフトMVPアワードプログラムよりDevelopment Platforms - ASP/ASP.NETのカテゴリで2008年7月よりMVPアワードを受賞。

コメント

コメントの記入