長谷川 裕行
(はせがわ ひろゆき)
有限会社 手國堂 代表取締役
http://www.hirop.com/
テクニカルライターとして活躍。プログラミングに関する著書多数、DB Magazineなどにも多くの記事を提供している。 |
データベース・アプリケーションを作るためには、何よりもまずデータベースに対する理解が不可欠です。今回からしばらくの間、実用的なアプリケーションを作るための基礎知識として、データベースがどのような機能を持ち、それをどう扱えばよいのかを紹介していきましょう。
業務用アプリケーションでは、データベースが重要な働きをします。データベースの扱いを、しっかり理解しておきましょう。
- テーブルは1つだけではない -
前回(第13回)まで、VBでデータベース・アプリケーションを作るための基礎知識を、一通り紹介してきました。これまでに紹介してきたのは「シングルテーブルで単純な処理を行うアプリケーション」の作り方です。
シングルテーブルとは、テーブルが1つだけの最も基礎的なデータベースです。ここまでに紹介した知識は非常に基礎的なもので、データベースを土台として業務用のアプリケーションを作るために重要なものではありますが、それだけで何でもこなせるというものではありません。
現実の業務では、実にたくさんのテーブルが互いに関連し合って1つの処理を形成しています。
- データベースの理解が先決 -
データベース・アプリケーションの作法で厄介なことは、理解すべき対象が「データベース」と「アプリケーション」に分かれていることです。データベースだけを理解しても、また逆にVBによるアプリケーションの作り方だけを理解しても、役には立ちません。それら双方の知識を組み合わせる必要があります。さらに業務用アプリケーションとなると、対象となる業務そのものに対する知識も必要になってきます。
ここで最も重要なことは、対象となる業務で処理されるデータを、どのような形でデータベースに置き換えるか――ということです。たくさんの情報を種類別に分類し、それらを目的に沿って組み合わせていかなければなりません。
従って、データベースに対する理解が最重要課題だと言えます。データベースの扱いさえ理解できれば、それを扱うプログラミングの作法は自ずと身に付いていきます。しかし、逆にVBのプログラミング作法だけを知っていたところで、データベース・アプリケーションは作れません。
- カード型とリレーショナル -
データベースというと、住所録や図書カードを思い浮かべる人も多いでしょう。Accessなどの入門書でも、大抵の場合住所録や蔵書管理などを例に取り上げています。これらがデータベースの基本であることは、間違いありません。
住所録や図書カードは先に触れた「シングル・テーブル」のデータベースで、一般に「カード型データベース」などとも呼ばれます。1件の情報が1枚のカードに収まるような形態のデータベースです。
しかし現実の処理は、常に1種類の情報、1種類のカードの束だけでまとめられるわけではありません。様々な種類のデータが複雑に絡み合っています。それをファイルとして効率的に管理する仕組みがRDB(リレーショナルデータベース)です。
ここでは、リレーショナルデータベースを「データベース」と書き表すことにしましょう。データベースとは「書式化された情報とそれを扱うための手段の集合」です。
「書式化された情報」とは、これまでに扱ってきたテーブルのことです。「それを扱うための手段」とは、クエリーやリレーションと呼ばれる機能です。データベースは、これらを統合したファイルとなります。
処理の対象となる情報は、すべてテーブルに記録されます。テーブルでは情報が書式化されているため、大量の情報を効率的に操作できるようになっています。
- 住所録はテーブルの基本 -
情報が書式化されているということは一定の様式に収まった情報が複数束ねられている状態を指します。
例えば、得意先の情報を記録した「得意先名簿」というテーブルは、おそらく以下のような要素から構成されるでしょう。
得意先番号 氏名 読みがな 住所 電話番号 FAX番号 …
これらが1件のデータ(1人の得意先)を構成し、それが得意先の件数だけ束ねられることになるはずです。
上記の構成要素を見れば、一般的な住所録と同じ項目で成り立っていることが分かります。これが商品の情報を記録する「商品台帳」だったらどうでしょう?
商品番号 品名 仕入価格 販売価格 単位
などの要素で構成されるはずです。個々の構成要素は異なりますが、基本的な形態は得意先であれ商品であれまったく変わりません。
つまり住所録は、テーブルの基本的な形態を示すのに最適な素材なのです。住所録の扱いを理解すれば、データベースの中核となるテーブルの基本的な扱いが理解できるのです。
- レコードとフィールド -
テーブル内の1件の情報(上の例なら「1人の得意先」)を表すデータ単位をレコード、レコードを構成する個々の要素(上の例なら「氏名」「住所」など)をフィールドと言います。
1件のレコードを構成する各々のフィールドのデータ型やデータ長は異なって構いませんが、1つのテーブルを構成する各レコードの、フィールド構成とサイズ(データの収容量)はすべて同じになります。
1件目のレコードの最初の6文字が得意先番号を表す整数値のデータなら、2件目も3件目も最初の6文字は得意先番号を表す整数値のデータとなります。しかし、1件のレコードの最初のフィールドと2番目のフィールドが同じである必要はありません(異なっているのが普通です)。
従って、テーブル、レコード、フィールドには以下のような関係が成り立ちます。
テーブル:同じ様式のレコードの集合
レコード:異なる形態のフィールドの集合
フィールド:1つの対象を表現するための個々の要素
図1:レコードとフィールドの関係
- 複数のテーブルをまとめて管理する -
データベースは、単に1つのテーブルだけで成り立っているわけではありません。関連する複数のテーブルを、1つのデータベースとして束ねることができます。
得意先の基礎的な情報だけではただの住所録ですが、それに商品の基礎的な情報が組み合わされば、販売の事実を記録できるようになります。
「販売の事実」とは
矢沢太郎さんが デブラボールペンを 3本 購入した
というような情報です。これもまた、テーブルとして記録できます。
データベースでは、得意先、商品などの基礎的な情報と、販売の記録のような流動的な事象の記録とをそれぞれテーブルとしてまとめ、管理できるようになっています。これが、カード型データベースと大きく異なる部分です。
いくらたくさんのテーブルがあっても、それだけでは処理は出来上がりません。テーブルに記録された情報を「ユーザーにどのように見せるか」を明確にする必要があります。
テーブルの「見せ方」には「複数のレコードを提示する方法」と「1件のレコードのフィールド構成を提示する方法」の2通りあります。
- 複数のレコードを提示する方法 -
1つのテーブルに記録された複数のレコードを、どのように見せるかということです。これには、2通りの見せ方があります。
整列
テーブルに記録されたレコード群の順序は、特に明確な規則に従っているわけではありません。通常は入力された順に並んでいます。
処理の内容によって、提示する順序は
名前の読みがな順、価格の低い順、日付の古い順
などに並べ替える必要があります。これを「整列」(ソート)と言います。
抽出
1つのテーブルにはたくさんのレコードが記録されています。が、常にすべてのレコードが必要なわけではありません。
特定の価格範囲に収まる商品だけ
特定の読み仮名に該当する人だけ
特定の日付範囲に販売された情報だけ
を抜き出して処理する必要もあるでしょう。
このように、特定の要件を満たすレコードだけを別に提示することを「抽出」と言います。
抽出は、Excelなどでいう「検索」とは異なります。検索は、単にレコード群の中から特定のデータを見つけて示すだけですが、抽出では、条件に該当するレコードを抜き出して、元のテーブルとは別に提示します。
- 1件のレコードのフィールド構成を提示する方法
-
1つのテーブルの中身を提示する場合、そのすべてのフィールドが必要であるとは限りません。例えば商品の基礎情報を提示する場合、得意先向けには「仕入れ価格」を見せる必要はありませんし、仕入れを行う処理では逆に「販売価格」は不要となるでしょう。
このように、そのときの処理に必要なフィールドだけで新たなレコード群を生成することができます。
- レコードセット -
抽出や、特定のフィールドだけに絞り込んでの提示では、元のテーブルとは別のレコード群が生成されます。これをダイナセットと呼びます。ダイナセットはディスクではなくメモリ上に存在する一時的なテーブルであり、ディスクに直接記録されないことを除けば、テーブルとまったく同じ様態です。
テーブルとダイナセットをあわせて、レコードセットと呼びます。つまり、どちらもレコードの集合という意味で、データベース上では同じように扱えるのです。
- テーブルを書き換える機能 -
先に説明した整列、抽出、フィールド構成の組み合わせという処理では、元になったテーブルの内容は一切変化しません。レコード群はダイナセットとして、元のテーブルとは別に提示されます。
しかしそれだけでは、完全な処理は作れません。テーブルの内容を書き換えなければ、事象を記録することは不可能です。テーブルの内容を書き換える処理には、以下の3種類があります。
レコードの追加、レコードの削除
フィールドの更新(データの書き換え)
これらは既存のテーブルを書き換えますが、この他に既存のテーブルから抜き出してきた情報を元に、新たなテーブルを作る処理も存在します。
- クエリー -
このように、テーブルの操作には
整列、抽出、フィールドの組み合わせ
という元のテーブルを書き換えない処理と
レコードの追加、レコードの削除
フィールドの更新、テーブルの作成
というテーブルを書き換えてしまう処理とが存在します。
これらはクエリー(query:問い合わせ)と呼ばれる機能で、前者を選択クエリー、後者をアクションクエリーと呼んで区別しています。選択クエリーはテーブルの見せ方を指示する機能なので、ビュー(view)とも言います。
これらクエリーも、データベースを構成する要素となります。 |
|
- データベースはテーブルとクエリーの集合
-
データベースは、テーブルとクエリーの集合です。テーブルは操作対象となる情報であり、クエリーはテーブルに対する操作の指示です。
Accessのmdbファイルには、テーブル、クエリーに加えて処理の手順を示すマクロやユーザーインターフェースを実現するフォーム、レポート、VBAモジュールなどが統合されていますが、これらはデータベースアプリケーションを開発するための機能であって、データベースの本質とは無関係です。
つまり、Accessのmdbファイルからフォーム、レポート、マクロなどを除いたものは、それだけで立派なデータベースファイルとして機能します。仮にそれらが含まれていても、VBからmdbファイルを扱う場合にはテーブルとクエリーしか利用できません。
いくらたくさんのテーブルが束ねられても、それらがまったく無関係なままでは意味がありません。データベースには、異なるテーブル同士を関連づける機能があります。
- 販売の事実と2つの基礎情報 -
先に「販売の事実」として
矢沢太郎さんが
1本50円のデブラボールペンを
3本 購入し
合計 150円の売り上げがあった
という例を示しました。
この情報の元になるデータは、「矢沢太郎さん」のデータを記録している得意先テーブルと、「デブラボールペン」のデータを記録している商品テーブルから導き出せます。
得意先も商品も、それぞれの情報を記録するテーブルはただの住所録と同じで、それ自体で完結した情報となっています。が、ここに上記のような「ある事実の発生」を持ち込むと、それら2つの基礎的な情報が「ある事実」の情報によって結びつけられることになるのです。
- 複数のテーブルを結びつける -
「矢沢太郎さん」という得意先は、得意先の基礎情報を記録した「得意先」テーブルから、得意先番号を頼りに導き出せます。
得意先の基礎情報
得意先番号 → 氏名:矢沢太郎さん
同じように「デブラボールペン」という商品の情報は、「商品」テーブルから商品番号を頼りに導き出せます。
商品の基礎情報
商品番号 → 品名:デブラボールペン
単価:50円
こうして、得意先番号と商品番号からそれぞれ導き出されてきた各々のレコードが、「商品を販売した」という事実によって関連づけられることになります。
- 事実を記録したテーブル -
こうして1件の得意先と1件の商品が関連づけられると、「商品を販売したという事実」もテーブルとして記録できるようになります。このテーブルは、以下のようなフィールド構成となるでしょう。
購入日付 購入者の氏名 商品名 単価 購入数量 購入額 ※便宜上、ここでは消費税は考慮しません
しかし、これらの情報をすべてフィールドのデータとして記録する必要があるでしょうか? 個々のフィールドのデータが、どこから明確になるのかを見てみましょう。
購入日付 |
→ |
購入の事実から |
購入者の氏名 |
→ |
購入の事実と得意先番号から |
商品名 |
→ |
購入の事実と商品番号から |
単価 |
→ |
購入の事実と商品番号から |
購入数量 |
→ |
購入の事実から |
購入額 |
→ |
単価と購入数量から |
- 基礎情報から新たなテーブルが生まれる -
つまり、ある得意先がある商品を購入した事実を記録するには
購入日付 得意先番号 商品番号 数量
だけが分かればよいことになります。従って購入の事実を記録するテーブルは、上記4つのフィールドだけで構成されていれば十分なのです。
ここでは、以下のような関係が成り立ちます。
得意先テーブル |
|
得意先番号フィールド |
|
|
↑ (得意先を特定) |
|
┏ |
得意先番号フィールド |
購入記録テーブル |
┫ |
|
|
┗ |
商品番号フィールド |
|
|
↓ (商品を特定) |
商品テーブル |
|
商品番号フィールド |
このように、ある事象・事実はその構成要素の一部を他の基礎的な情報から導き出し、それにその事象・事実固有の情報とを組み合わせたものと捉えることができます。
この場合の、ある事象・事実(例では販売の事実)と基礎的な情報(例では得意先と商品の情報)との結びつきをリレーション(relation:関連)といいます。
- 選択クエリーとリレーション -
リレーションも、データベースを構成する大切な要素です。リレーションは、クエリーと密接な関係があります。
選択クエリーでは、複数のテーブルから処理に必要なフィールドだけを抜き出し、新たなレコードセットを生成する機能がありますが、そのとき互いのテーブルの関連するフィールド同士を結びつけることができます。つまり、リレーションの設定機能です。
リレーションは、選択クエリーで新たなレコードセットを生成するために必要な機能なのです。上述した購入記録、得意先、商品の各テーブルの関連を図示しておきましょう。
Accessを触ったことのある人なら、この構造がクエリーのデザインビューでフィールドをドラッグすることにより、簡単に作れることをご存じだと思います。クエリーとリレーションに関しては、次回、実務を絡めてより具体的に説明します。
図2:購入記録、得意先、商品の各テーブルの関連
VBには、データベースを作成・編集するビジュアルデータマネージャというツールが備わっています。使い方を紹介しておきましょう。
- データベース作成ツール -
VBはJetデータベース・エンジンとの親和性が高いため、データベースはmdbファイルとするのが最も便利です。mdbファイルはAccessで作れます。テーブルやクエリーのデザインだけでなく、Accessなら簡単な基礎データの入力もその場で行えます。
が、開発環境によっては、必ずしもAccessが使えるとは限りません。そのような場合には、VBのアドインツールである「ビジュアルデータマネージャ」を利用するとよいでしょう。mdbファイル以外のデータベースも作成できます。
ビジュアルデータマネージャは、インストール時にアドインとして指定しておけば、メニューから「アドイン(A)」→「ビジュアルデータマネージャ(V)」で起動できます。
Access同様、テーブルとクエリーのデザイン、基本的なデータの入力などが行えます。但しAccessのような開発ツールではないので、フォームやレポート、マクロなどをデザインする機能はありません。あくまでも、VBで作るアプリケーションのためのデータベースを作成する補助ツールです。
ビジュアルデータマネージャの基本的な操作を紹介しておきましょう。
- データベースの作成 -
1. |
メニューから「ファイル(F)」→「新規作成(N)」→「Microsoft
Access(M)」を選択する
Jetデータベース・エンジンが複数バージョンインストールされている場合は、この下にさらに「Version
2.0 MDB(2)」「Version 7.0 MDB(7)」などと選択肢が表示されます。Access97と互換性のあるmdbファイルを作るなら、「Version
7.0 MDB(7)」を選びます。 |
2. |
ファイル保存のダイアログボックスがオープンするので、保存先を指定しファイル名を入力する
これでデータベース・ファイル(mdbファイル)が生成されます(画面1)。 |
画面1:データベースが新規作成された
- テーブルのデザイン -
3. |
データベースウィンドウの"Properties"を右クリックし、「テーブルの新規作成(T)」を選択する(画面2) |
画面2:テーブルを新規作成する
4. |
「テーブル構造」ダイアログボックスがオープンするので、[フィールドの追加(A)]ボタンをクリックする |
5. |
フィールド名、データ型などを入力して[OK]ボタンをクリック――の手順を、追加するフィールドの数だけ繰り返す(画面3) |
画面3:フィールドを追加する
- データ型に注意 -
ビジュアルデータマネージャで用いるデータ型は、Accessの表記ともVBの表記とも異なっています(表1)。この点に注意してください。
Accessに慣れている人はYes/No型やオートナンバー型に注意しましょう。ビジュアルデータマネージャには、オートナンバー型は存在しません。Long型を指定して「自動インクリメント」をONにすることで、Accessでいうオートナンバー型と同じ扱いになります。
データ型の表記はどちらかと言えばVBと似ており、多くのデータ型は同じ表記となっています。但し、Date/Time型とText型に注意してください。
表1:ビジュアルデータマネージャ・VB・Accessのデータ型表記比較
- テーブルの保存 -
6. |
すべてのフィールドを追加したら[閉じる(C)]をクリックする |
7. |
「テーブル構造」ダイアログボックスの、「テーブル名(N):」欄など必要箇所を設定する
これで完了です。インデックスを設定する場合は、[インデックスの追加(I)]をクリックしてフィールドを選択します。主キーの指定も可能です。 |
8. |
[テーブルの作成(B)]をクリックする
最後に[テーブルの作成(B)]ボタンをクリックしないと、デザインしたテーブルは生成されません。忘れないようにしましょう。 |
- データの入力 -
生成されたテーブルは、データベースウィンドウにツリー表示されます。
データベースウィンドウのテーブル名をダブルクリックすれば、データフォームがオープンします。ここから、生成したテーブルに対してレコードの追加や削除などが行えるようになっています(画面4)。
こうして生成されたテーブルの構造は、画面5のような形で表示されます。
画面4:フォームを通じてレコードの入力などが行える
画面5:データベースの構造が表示される
データベースの基礎知識と、ビジュアルデータマネージャによりテーブルの作り方を紹介してきました。次回は、現実の業務の流れとデータ構造を例に、クエリーとリレーションについてさらに詳しく説明します。 |