database-design

アプリケーションを作ってみよう データベースの作成体験10項

データベースとはデータ管理の基地であることは以前まとめた。しかし、DBMSやリレーショナル・データベースといった用語が多く、初学者にはわかりにくい。ここではデータベースの概要を説明し、簡単なデータベース・アプリケーションの作成を紙上体験することで、そのイメージを理解する。

1 データベースはデータの基地

データベースとは、データ(data)の基地(base)という意味である。企業戦略において、社内のデータがあちこちに散在していたのでは、データの更新や検索に時間がかかって面倒である。社内のデータを一ヵ所の基地にまとめて整理しておけば、必要に応じて様々な部門の者が活用できる。

コンピュータの中にデータを蓄積して利用しやすいように整理するためには、データの格納形式を工夫しなければならない。手作業の業務では、伝票や名刺のように1枚の紙の中に必要な情報がまとめられている。このようなデータの格納様式をそのままコンピュータに置き換えて実現したものをカード型データベースと呼ぶ。住所録アプリケーションやWebの掲示板の書き込み記録などで、カード型データベースが使われている。

しかし、企業全体の情報を管理するような大規模なデータベースを実現するには、カード型データベースでは力不足である。なぜなら、ここのカードの間に関連性がなく「A社がB社に商品を販売した」といった情報を記録することが困難だからである。

大規模なデータベースに適しているのはリレーショナル・データベース(relational database、関係データベース)という形式である。リレーショナル・データベースでは、データを複数の表(table)に分けて整理し、関係(relationship)も記録する。こうすることで変更点があったときの保守が簡単になる。

リレーショナル・データベースは、1970年に米IBMのCodd氏によって考案された。現在ではデータベースといえばリレーショナル・データベースを意味するほど、広く普及している。これから紙上体験するデータベース・アプリケーションも、リレーショナル・データベースとして作成する。

 

2 データ・ファイル、DBMS、アプリケーション

データベース・アプリケーション(データベースを利用するためのプログラム)を作成するためには、DBMS(Database Management System、データベース管理システム)というソフトウェアを利用するのが一般的である。例えば、Microsoft Access、Oracle、SQL Server、DB2などである。データベースの実体は何らかのデータ・ファイルだが、データベース・アプリケーションでは直接データ・ファイルを読み書きせず、DBMSを仲介させて間接的に読み書きする。DBMSは、簡単にデータ・ファイルを読み書きできるようにし、データを矛盾なく安全に保つ機能(詳細は後述)を持っている。

データベース・システムの構成要素は、「データ・ファイル」「DBMS」「アプリケーション」の3つである。小規模なシステムでは、1台のPC上にデータ・ファイル、DBMS、アプリケーションがすべて配置される(スタンドアロン型システム)。中規模なシステムでは、1台のPCにデータ・ファイルを配置し、それをDBMSとアプリケーションが配置された複数台のPCから共有する(ファイル共有型システム)。大規模なシステムでは、1台(もしくは複数台)のPCにデータ・ファイル、DBMSを配置し、それをアプリケーションが配置された複数台のPCから利用する(クライアント/サーバー型システム)。データ・ファイルとDBMSが配置されたPCがサーバー(server、サービス提供者)で、アプリケーションが配置されたPCがクライアント(client、サービス利用者)である。サーバーとクライアントの間がインターネットで接続されているなら「Webシステム」となる。Webシステムでは、アプリケーションもサーバーに配置され、クライアントにはWebブラウザだけが配置されるのが一般的である。

 

3 データベースを設計する

ここでは、1台のPCでMicrosoft AccessというDBMSを使ったスタンドアロン型システムを作成する。アプリケーションは、Visual Basic 6.0を用いる。テーマは、酒屋の商品売上管理である。

データベース設計の第一歩は「何が知りたいのか?」(目的)という観点で、データを洗い出すことである。例えば、以下に示したデータを知りたいとする。

  • 商品名
  • 単価
  • 売上数量
  • 顧客名
  • 住所
  • 電話番号

次に、個々のデータの属性を考える。属性は「スキーマ(内部スキーマ)」ともいい、具体的にはデータ型(数値か文字か)、数値なら整数か浮動小数点数か、文字なら最大何文字か、NULL値(データを空にしておくこと)を許可するか、などである。

ほとんどのDBMSは、データの属性をビジュアルに設定できるツールを提供している。このツールによって、論理的にテーブルが作成され、物理的にデータを記録するデータ・ファイルが作成される。テーブルには任意の名前をつけられる。

以下にデータベース用語をまとめる。リレーショナル・データベースでは、テーブルに登録される1行のデータのまとまりをレコード(record)といい、1つのレコードを構成する商品名や単価などの項目をフィールド(field)という。レコードのことを「行」や「列(row)」、フィールドのことを「列」や「カラム(column)」と呼ぶこともある。属性の設定対象となるのは、フィールドである。フィールドには、格納されるデータを代表するような「フィールド名」をつける。

 

4 テーブルを分割して整理する正規化

正規化とは、テーブルを複数に分け、個々のテーブルの関係性を設定して、データベースの構造を整理することである。正規化をすることで、同じデータを何度も登録するムダや文字入力のミスによるミスを防ぐことができる。

正規化のポイントは、1つのデータベースの中に同じデータが重複して記録されないようにすることである。例えば、酒屋のデータベースでは「商品テーブル」「顧客テーブル」「売上テーブル」の3つに分けて設定する。これによって、同じ顧客の氏名、住所、電話番号を何度も入力する手間が省け、同じ商品の商品名を誤って入力する間違いを防ぐことができる。

 

5 テーブルを関係づける主キーと外部キー

テーブルとテーブルを関係づけるために、フィールドを追加する必要がある場合がある。このとき追加するフィールドをキー(key)と呼ぶ。まず、各テーブルにその値がわかればレコードを特定できるようなキーを追加する。このようなキーを主キー(primary key)という。顧客テーブルの「顧客ID」フィールド、売上テーブルの「売上ID」フィールド、商品テーブルの「商品ID」フィールドが主キーである。

主キーには「顧客ID」のようなフィールド名をつけるのが一般的である。これは、主キーがレコードを特定するID(identification、識別値)になるからである。そのため、主キーには他のレコードと重複しない値を記録しなければならない。DBMSは、主キーの値が同じレコードを登録しようとするとエラーにしてくれる。これは、DBMSが備えるデータを矛盾なく安全に保つ機能の1つである。

外部キー(foreign key)とは、あるテーブルの中にある他のテーブルの主キーのことである。例えば、売上テーブルの中の顧客IDや商品IDというフィールドである。同じ値の主キーと外部キーによって複数のテーブルが関連づけられ、データを芋づる式に取り出せる。

テーブル間の関係性は、レコードとレコードを関係づける。レコードの関係性の形態は、「1対1」「多対多」「1対多(多対1)」のいずれかになるが、多対多となってはならない。複数のテーブルを芋づる式にたどることが困難になるからである。関係性が多対多になってしまう場合は、2つのテーブルの間にもう1つテーブルを追加し、2つの1対多に分けることができる。このようなテーブルをリンク・テーブル(link table、結合テーブル)という。

DBMSには「参照整合性」をチェックする機能がある。これも、データを矛盾なく安全に保つ仕組みの1つである。

 

6 データの検索速度を向上させるインデックス

DBMSの機能の1つとして、テーブルの個々のフィールドに「インデックス」を設定できる。インデックス(index、索引)とは、データの検索と並べ替えの速度を向上させる内部的な仕組みに過ぎない。フィールドにインデックスを設定すると、そのフィールドのためのインデックス・テーブルが自動的に作成される。

インデックス・テーブルとは、フィールドの値と、そのフィールドを持つレコードの位置を記録したものである。例えば、顧客テーブルの顧客名フィールドにインデックスを設定すると、「顧客名」と「位置(ファイル上の位置)」という2つのフィールドを持ったインデックス・テーブルが作成される。インデックス・テーブルは、もとのテーブル(顧客テーブル)に比べてフィールド数が少ないため、高速に検索や並べ替えを行うことができる。

インデックス設定のデメリットは、登録の速度が低下することである。テーブルにレコードが登録されるたびにインデックス・テーブルの更新処理が必要になるからである。したがって、そのフィールドを対象として頻繁に検索や並べ替えが行われる場合にだけインデックスを設定するべきである。例えば、酒屋のデータベースの場合は、顧客テーブルの顧客名フィールドと商品テーブルの商品名フィールドだけにインデックスを設定すれば十分だろう。また、レコード件数が最大でも数千件程度で済むデータベースなら、まったくインデックスを設定しなくても遅いとは感じないだろう。

 

7 ユーザ・インタフェースの設計

ユーザ・インタフェースとは、データベースを操作するための窓口(境界)である。データベース設計が先で、ユーザー・インタフェース設計が後であることがとても重要である。

データベースの操作の種類は、俗に「CRUD(クラッド)」と呼ばれる4種からなる。CRUDとは、レコードの「登録(CREATE)」「取得(REFER)」「更新(UPDATE)」「削除(DELETE)」の頭文字を取った言葉である。ユーザーの要望に応じて集計や印刷などの機能を任意に追加することもあるが、主たる機能はこの4つである。

 

8 DBMSにCRUDを指示するSQL文

データベースをCRUDするためには、アプリケーションからDBMSに命令を与えなければならない。そのために使われるのが、SQL(Structured Query Language、構造化照会言語)である。SQLの規格はISO(International Organization for Standardization、国際標準化機構)が策定している。現在市販されているDBMSのほとんどは、SQLに対応している。

DBMSに1行の命令文(SQL文)を送ると、それに応じた操作がすぐに実行される。英語の命令文に似ている。以下に例を挙げる。

 

SELECT 顧客名, 住所, 電話番号, 商品名, 単価, 売上数量

FROM 顧客テーブル, 商品テーブル, 売上テーブル

WHERE 顧客テーブル.顧客名 = “日経次郎”

AND 売上テーブル.顧客ID= 顧客テーブル.顧客ID

AND 売上テーブル.商品ID = 商品テーブル.商品ID;

 

先頭のSELECTは、CRUDのRすなわち取得を行う命令である。SELECT以降にカンマで区切って取得したいフィールド名を指定する。FROM以降にカンマで区切ってテーブル名を指定する。WHERE以降に条件を指定する。ANDは、複数の条件の論理積(○○かつ△△)を意味する。「顧客テーブル.顧客名」のように、「.」(ドット)で区切られた表現は、「顧客テーブルの顧客名フィールド」という意味である。SQL文の末尾にはセミコロン(;)を置く。

DBMSは、手作業でSQL文をDBMSに送るツールや、ビジュアルな操作でSQL文を自動生成するツールを提供している。また、SQLにはCRUD以外にもデータベースを新規に作成する命令や、後で説明するトランザクション制御を行う命令などがある。

 

9 DBMSにSQL文を送るデータ・オブジェクト

WindowsアプリケーションからDBMSにSQL文を送るには、データ・オブジェクトと呼ばれるソフトウェア部品を使うのが一般的である。データ・オブジェクトは、プログラムの開発ツールなどに添付されている。Visual Basic 6.0の場合は、ADO(ActiveX Data Objects)を用いる。

ADOは、DBMSとの接続を開始するConnection、DBMSにSQL文を送るCommand、そしてDBMSから返された結果を格納するRecordsetなどのクラスの総称である。プログラムの起動時にDBMSと接続する。個々のボタンに応じてCRUDの処理を行う。プログラムの終了時にDBMSとの接続を解除する。ADOを使う場合に必要となるSQL文は、主にSELECT命令を使ったものだけである。登録、更新、削除は、Recordsetクラスが提供するAddNew、Update、Deleteというメソッド(クラスが提供する関数)で行う。これらのメソッドが、内部的にSQL文を自動生成してDBMSに送っているというイメージである。

 

10 トランザクション制御もDBMSに任せられる

トランザクション(transaction)とは、データベースに対する1つの意味のある操作が、複数のSQL文になったものである。有名な例として、銀行口座の振込処理がある。Aさんの口座からBさんの口座に10000円を振り込む場合には「Aさんの口座の残金を-10000した値で更新する(UPDATE命令)」と「Bさんの口座の残金を+10000した値で更新する(UPDATE命令)」という2つのSQL文で1つのトランザクションとなる。

1つ目のSQL文の実行後にネットワークやコンピュータのトラブルが発生し、2つ目のSQL文を実行できなかったらどうなるか。Aさんの口座の残金が-10000されているのに、Bさんの口座の残金が+10000されない矛盾が生じる。この問題を防ぐために、SQL文には次の3つの命令が用意されている。(1)DBMSにトランザクションの開始を知らせるBEGIN TRANSACTION命令、(2)トランザクションの終了を知らせるCOMMIT命令、(3)トランザクションの途中でトラブルが発生した場合に、トランザクション開始前の状態にデータベースの内容を戻すROLL BACK命令である。ADOを使ってアプリケーションを作成する場合は、ConnectionクラスのBeginTrans、CommitTrans、RollbackTransというメソッドを使う。このように、DBMSには便利な機能が備えられているのである。

 

最後に

データベースの概要を理解するために、簡単なデータベース・アプリケーションの作成過程を紙上体験した。データベース設計からユーザー・インタフェース設計の流れ、SQL文やデータ・オブジェクトの役割、そしてトランザクション制御という高度な機能も、DBMSを利用することで簡単に活用できることがわかった。

コンピュータは、入力・演算・出力の3つの動作を行うものである。これらの動作によって、何らかのデータが処理されるため、コンピュータはデータ処理装置だと言える。したがって、コンピュータの利用形態のほとんどがデータベースだといっても過言ではない。ゲーム・プログラムでもない限り、ほとんどのアプリケーションでデータベースが活用されている。データベースは、コンピュータを知るための必須課題の1つなのである。

次回は、TCP/IPネットワークについてまとめる。

コンピュータはなぜ動くのか~知っておきたいハードウエア&ソフトウエアの基礎知識~


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>