【初心者目線】Webアプリケーションの開発 第11回

【初心者目線】Webアプリケーションの開発 第11回について書きます。

1. データベースの有効活用

前回の紙ベースの注文票をデータベース化する方法について解説しました。

このデータベースを使用して人気商品を調査してみます。

紙ベースの注文票では一枚一枚目視で確認し集計する必要がありました。


ここでは、データベースの場合の集計方法を解説していきます。

1-1. データベースを使用したデータの集計の概要

人気商品を調査する場合、売上個数が多い商品を調査する必要があります。

データベースの場合は注文明細テーブルのレコードを商品IDごとに集計すれば必要な情報を得ることができます。


しかし商品明細テーブルの情報のみでは商品名が分かりません。

そこで商品IDをもとに商品テーブルと紐付け、商品名を取得できるようにします。

このようにすると商品ごとの売上個数を把握することができます。(下図参照)


このような集計を手作業で行うのは非常に大変で現実的ではありません。

データベースでは簡単な命令を出してあげることで、短時間で実現できます。


また、注文票の情報を4つのテーブルに分けてデータベース化しましたが、1つの注文票を情報の性質ごとにテーブルを分けて管理しておくことで、このような集計を効率的に行うことができます。

1-2. SQLによるCRUD操作

データベースから人気商品の情報を取得できることは既に説明しました。

では、どのようにして取得すればよいのでしょうか。

データベースから必要な情報を得るためには、どのテーブルからどのようなデータを抽出したいのかを命令する必要があります。

今回の人気商品一覧を取得するためには、以下のような命令をデータベースに出してあげます。


https://atl2.net/webtool/sql%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%82%BF%E3%83%BCfor-web/


このような命令文は「SQL」と呼ばれ、データベースに対して必要な情報を効率よく伝えるための言語となっています。

基本的に「どの情報を」「どこから」「どのようにして」抽出することに特化しています。

ここからはSQLについて理解するための基礎的な仕組みを説明していきます。

1-3. a)「どの情報を」

データベースからどのような情報を抽出するのかは、上図1〜4行目のSELECT文で指定します。

ここでは商品テーブルから「商品ID」と「商品名」を、そして商品明細から取得した「注文数」の合計を抽出するように指定しています。

また、注文数の合計は「売上数」という別名に変えて抽出しています。


※項目の合計値を取得する場合は「SUM関数」を使用します。

項目の名称を変更する場合は「AS句」を使用します。

1-4. b)「どこから」

上図5〜8行目のFROM句では、SELECT文で抽出する項目の取得元(テーブル)を指定しています。

ここでは注文明細テーブルと商品テーブルから情報を抽出するように指定しています。

1-5. c)「どのようにして」

情報をどのような条件で抽出するのかを指定しているのが上図7〜8行目のINNER JOIN句の部分です。


今回人気商品一覧を作成するにあたって、SQL文では注文明細テーブルと商品テーブルの2つのテーブルから情報を取り出すことになります。

このように複数のテーブルより情報を取得する場合は、それらをどのように組み合わせるのか指定する必要があります。


条件を指定せずにSQL文を作成すると、全パターンの組み合わせ結果が抽出されてしまい必要な情報とは全く異なる結果になります。

よって、商品名を取得するにあたり注文明細テーブルと商品テーブルの「商品ID」が一致することが必須となりますので、8行目の「注文明細.商品ID = 商品.商品ID」のように条件を指定します。

2. Webアプリケーションとデータベース

ここまでSQL文を使用したデータベースからの情報の取得について説明してきましたが、実際のWebアプリケーションではどのようにしてSQL文を使用しデータベースに命令を出しているのでしょうか。

ここからは、その内容について解説していきます。

2-1. データベースとクライアント

一般的にデータベースは独立して動作するサービスなので、何らかの方法でSQLをデータベースに渡してデータの抽出を依頼し、その抽出結果を返してもらう必要があります。

その方法は大きく2つに分かれ、これらのプロセスを以下にまとめてみました。


まず上図の「データベースクライアント」から説明します。

これは私たちがデータベースのテーブルを画面で直接確認し、SQLを入力してデータの抽出や操作を行うものになります。

この方法は古くから利用されており、人間が直接SQLを入力してデータベースからデータを抽出する用途に適しています。

一方「アプリケーションプログラム」では人間ではなく、WebアプリケーションのプログラムがSQLを入力して(発行して)います。


「アプリケーションプログラム」の動作の仕組みを、ネットショッピングサイトを例として考えてみます。

第7回で説明したネットショッピングサイトでは、ログイン後に商品一覧画面を表示する流れになっていました。

この商品一覧画面に表示する商品は、HTMLファイルの中に直接商品名などを記載して画面表示していました。

しかし、この方法では商品の追加や削除をする際に毎回HTMLファイルを修正する作業が発生してしまい面倒なことになります。


このように変化する可能性がある情報をプログラムやHTMLに記述することを「ハードコーディング」と呼びます。

ハードコーディングを改善するためには、商品一覧はデータベースに記録しておき、商品一覧画面を表示する際に、データベースから表示するデータを取得するような仕組みにしておく必要があります。

以下はその仕組みイメージになります。


上図のようにすることにより、新商品を追加した場合や値段の修正、または商品を削除した場合などもデータベースの内容のみを変更することで対応でき、HTMLファイルを修正する必要はありません。

2-2. データベースとノード

なぜデータベースが必要か、そしてWebアプリケーションでの使用用途を説明してきましたが、実際のWebアプリケーションではデータベースはどのコンピュータで動作すべきなのでしょうか。

最も簡単な方法はWebサーバ内でデータベースを動作させる方法です。


この場合すでに存在するWebサーバにデータベース(DBMS)をインストールするだけで済み、データベース用のコンピュータを新規で用意する必要がありません。

小規模なWebアプリケーションではこのような構成となっていることもよくあります。


しかし、この構成ではデータ量が増大した際にWebサーバのディスク領域を圧迫したり、Webアプリケーションの利用者が増えCPUへの負荷が高くなった際に、システムが停止してしまう恐れがあります。

それらのトラブルを回避するため、一般的にはWebサーバとデータベースサーバは別々に用意し、各プロセスをそれぞれのコンピュータで動作させる仕組みをとっています。(下図参照)


このように役割ごとにサーバを分けることにより、各コンピュータの処理が分散されてシステムの負荷が下がります。

また、DBサーバを分離する理由として上記のようにシステムの負荷を下げる目的のほかに、既存のシステムとの結合を理由としている場合もあります。


Webアプリケーションが広く普及する前から、企業の業務システムでは顧客情報や商品情報、従業員の情報などの管理のため、データベースが使用されてきました。

そのような既存の業務システムが存在する場合、現在使用中のデータベースの情報をインターネット経由で使用できると非常に便利になります。


この場合、DBサーバは既存システムに属しているため、そのDBサーバと連携するようにWebサーバを中心とした新規のWebアプリケーションを構築することになり、必然的にWebサーバとDBサーバは分離された状態になります。

3. 第11回 まとめ

今回はデータベースから目当ての情報を抽出する手段としてのSQL、Webアプリケーションにおけるデータベースの役割を中心に解説しました。

Webアプリケーションの開発に限らず、SQLはデータベースの情報を操作する技術として必ず習得する必要があります。

今回説明した範囲は基礎中の基礎ですので、必ず理解しておいてください。


次回はアプリケーションサーバに関する技術を中心に解説予定です。