<HOME  <お願い事項  <Access2000 TOP   <Access97 TOP   <サイト内検索
 MS-Access2002チョ〜入門部屋>MS-Accessを使いこなすために・・
  (←別ウィンドウでサブメニュー)



3.テーブル設計の基本…さらに

んでは、うちのチームの勤務状況データベース、いっしょに作ってみます?
 ・みんなの毎日の勤務状況を入力して、
 ・1ヶ月の労働時間とお給料の計算をして、
 ・どこか壊して帰ってきたら被害状況の入力をする
そんなデータベースです。
まあ、こんなデータベースを実際に作る必要はないと思いますが、細かいところで、皆さんの会社の業務に通じることなどもあると思うので、いっしょに見てみましょう。

まずテーブルを作ります。
今までいろいろとごらんいただいてきた表で、だいたいまとまってはいるんですが、ここでもう一歩踏み込んで、データベースっぽい角度でまとめてみますね。

まず、こういう感じの「社員テーブル」を作ります。
このテーブルは「社員ひとりにつき1件」データが入ってくるので、主キーは「社員番号」です。

次に、こういう「労働テーブル」を作ります。

このテーブルには、「だれが、いつ働いたかで1件」のデータが入ってくるので、主キーは「社員番号」「労働日」のふたつです。また、このテーブルと「社員テーブル」は、「社員番号」で関連付けられます。

二つのテーブルから、社員番号が01001の社員のデータだけに注目して、並べてみてください。
社員番号で引っ張れば、この社員に関するデータは全部とることができますよね。
これで、あともうひとつふたつ工夫すれば、この社員が今月何時間働いたかとか、そういうことがわかるわけです。



こんなふうに、複数のテーブルがとあるフィールドの値を元にして関係を持つデータベースっていうことで、関係データベース(リレーショナルデータベース)って呼ばれるんですね。
前回、主キーというものについてけっこうしつこくお話しましたが、こうして二つのテーブル同士を結びつけて一つの情報を得るためには、それぞれにきちんと「主キー」が設定されてないとならないんです。
まあ、主キーじゃなくても結びつくことは結びつきますが、こちらの思惑通りに結びつくとは限らないです。

上の図をもう一度見てみてください。
「社員番号」同士を結びつけると、「労働テーブル」のほうは1月1日と1月2日の2レコード分のデータが存在してますよね。
1月3日に働けば、3レコードになります。もし、「労働テーブル」側に主キーの設定をしなかったとしたら、あるいは、「社員番号&労働日」以外のフィールドを主キーにしていたら、MS-Accessには二つのテーブルの関連性が理解できません。
きちんと、「社員テーブル1レコードに対して、労働テーブルに何件かレコードが入ってきますけれど、それは労働日ごとにデータを蓄積したいからであって、ダブってるわけじゃあないんですよ」って、ちゃんとあらかじめMS-Accessに約束をしないとならないんです。

だれがって、みなさんがですっ。

こういうのを「一対多の結びつき」と言います。二つのテーブルを結びつける基本形ですね。



もうひとつ、誰かがなんか壊してきたら、1件データの追加をするためのテーブルも作ります。
「被害状況テーブル」とでもつけますかね。

これは、だれも何も壊さなければ1件も増えないテーブルなのですが、こうなると逆に、どのフィールドを主キーにしていいか難しいですね。
「社員番号」と後ひとつ・・・。同じ日に何箇所も壊してくるやつもいるし・・・。
うーん、適当なのがないな・・・。じゃあ今回は、間に合わせで適当なフィールドをひとつ追加しておきましょうかね。
じゃあ、作業を開始しましょう。MS-Accessを起動しましょう。
データベースを新規に作成して、なんか適当な名前を付けてください。
私は今回、「練習台弐」っていう名前にしました。まあなんでもいいですよ。適当に。



でもって、テーブルを3つ、作りましょう。

【社員テーブル】

まず、「社員テーブル」ですが、↑こんな感じにしてみました。
このテーブルは「社員ひとりにつき1レコード入力されるテーブル」なので、主キーは「社員番号」です。

数値型のフィールドがいくつかありますので細かいことを少し考えておく必要がありそうですね。データ型を「数値型」に変更すると、画面下のほうの「フィールドサイズ」というところで、データの内容にあわせて設定をしましょう。
まず、「時給」は"金額"なので、基本的に小数点以下の値は必要ないと思います。
数値型の「長整数型」か、もし1桁2桁小数点以下の桁が必要そうなら「通貨型」にするとよいでしょう(何円何銭とか)。

「身長」は「メートル単位」で入力していくつもりです。5cmの怪獣がいるなら5ではなくて0.05と入力します。なので、もしかしたら、小数点以下の桁が発生するかもしれないですね。しかも、何桁必要になるか、今の時点でははっきりとはわからないです。2mmの怪獣とかいたら、0.0002って入力しないとならないし・・・。まあそんなやつにどうやって給料支払うのかとか言われると確かにありえない話かもわからないですが、いちおう「はっきりとはわからない」ということで。かなり広範囲に小数点以下の桁数を持つことができる「倍精度浮動小数点型」にしておきましょう。

「体重」も同じ感覚で、単位は「トン」にするつもりです。なので、10kgのやつがいたら、0.01ってなります。
これも「倍精度浮動小数点型」にしましょうかね。
「芋支給率」も、割合を入力するので、「倍精度浮動小数点型」にしておきましょう。



【労働テーブル】

「労働テーブル」はこんなふうにになります。
このテーブルには、だれがいつどれだけ働いたのか、という情報が入ります。1日7時間働いたとして、その内訳(仕事の内容とか出かけた先とか)まで細かく集計していきたい場合はもっとテーブルの構造を工夫しないとならないですが、今日はまあ練習ってことで、1日働いた時間を入力するテーブルってことでやってみようと思います。したがって、「だれの何日のデータ」という、ふたつのフィールドの組み合わせで、このテーブルの中の「データの基本単位」になります。各社員が、仕事から帰ってきて、帰り際に「今日は8時間働いたぞ、と」と、このときに1件発生するデータなわけですね。

これが、帰り際に「今日は掃除に4時間、資料整理に2時間、会議で1時間、雑用で1時間働いたぞ、と」という感じで内訳を記録していきたいなら、「だれがいつなにを」の3つのフィールドの組み合わせが、このテーブルの中の「データの基本単位」になるわけです。
時間外労働とかで時給が変わる場合とかも、こんな感じで「一日の労働時間の内訳」っぽくデータを持っておかないとならないはずです。細かくなればなるほど複雑になってきますから、今回は「だれがいつ」のふたつのフィールドの組み合わせでやってみましょう。こういうのはMS-Accessの操作とは別のことなので、いきなり超複雑なテーブル設計をやろうとせず、少しずつ理解を深めていってください。
考え方の基本は「そのテーブルの中に入ってくるデータの最小単位を見極める」です。

話を元に戻して・・・「労働時間」は、7時間30分なら7.5と入力させようと思います。なので、倍精度浮動小数点型かなぁ。
時間は24進数だったり60進数だったりするので、コンピュータで扱うのはほんとに面倒です。いつもいつもすごく大変です。
もちろん、出勤時間と退勤時間を記録しておいて、ふたつのフィールドから労働時間を求めることも可能ですが、今回はシンプルに労働時間だけを数値で入力しましょう。練習ですからあんまり難しいの挑戦しちゃうとわけわかんなくなっちゃいそうだし。



【被害状況テーブル】

次に、誰かがなんかやらかしたら1件データが入ってくるテーブルです。「被害状況テーブル」ですね。
このテーブルをどう扱うか、ちょっと悩ましいところなんですけれど・・・。
かなり不定期にデータが発生するんですよね。あまり他のテーブルと結びつけるようなこともないかも分からないし、このテーブルの中のデータをどう扱うかによっては、別に主キーなんていらないかもしれないんですけれど・・・。うーん。
いちおう、「社員番号」と、「その社員のデータをさらに細かく識別できるフィールド」の組み合わせで、このテーブルのデータの基本単位にしようかなと思うんですが・・・。「日付」はだめですよね。同じ日にあっちこっち壊すやつもいるかもしれないし。「場所」も、同じ日に同じところで朝と夕方2回暴れるやつもいるかも。
こういう場合はもう、苦し紛れに、なんか適当な「識別フィールド」みたいなのを作っちゃうのがいいのかもしれません。

特にデータの内容には意味はないがとにかく適当な番号をふってくれればそれでいいというような場合に、オートナンバー型というデータ型は便利です。別に何番がついてもかまわないけれど、後で見てみると、それぞれ違う番号がついている、という場合ですね。
また、このテーブルが、他のテーブルと関連付けて使うようなものではなくて、もうこのテーブルだけ単体で入力/参照するだけ、というような場合は、オートナンバー型のフィールドを設けて、そいつだけを主キーにしてもいいかもしれません。
もしかしたらあるいは、主キーなしのテーブルでもいいかもわからないです。
でも、「被害状況を表示するときに、社員テーブルから名前とか身長とかも持ってきたい」となると、このテーブルは「社員テーブル」と関連付けていかないとならないわけです。もちろん、関連付けるだけならお互い主キーなんてなくてもできますけれど・・・。でも、主キーとは、そのテーブルの代表フィールドという役割も果たしてますので、他のテーブルとやり取りする必要がある場合は必ずしかるべき設定をするものなんだって、そう考えていってください。
そのほうが間違いないと思いますよ。

あと、大変便利そうに見える「オートナンバー型」ですが、今回のように「何番がついてもかまわないし特に使わないけれど、何かしら番号がついてほしい」という場合にのみ、活用しましょう。たとえば、これを伝票番号とか見積番号とか、業務上意味のあるフィールドに使うのは、あまりいいことではないんじゃないかと思います。後で手入力しようと思ってもできませんし、レコードを削除するとその番号は欠番になります。まあ、これは好みの問題かもしれませんが・・・。



できました?
テーブルの名前はなんでもいいんですけれど、私はとりあえず↑こういうテーブル名で話を進めていきますので、照らし合わせながら作業していってください。

あ、そうそう、主キーを二つ以上つける場合の操作なんですけれども・・・。
各フィールドの左側の、グレーのところ、フィールドセレクタっていうところを、そっとドラッグすると(あるいはCtrlキーを押しながらクリックしていくか)、複数行を黒くすることができるんです。

黒くなったら、「主キー」のツールボタンをクリックしましょう。
複数のフィールドに対して主キーの設定をする操作です。
「労働テーブル」「被害状況テーブル」は、社員ひとりに対して複数行のデータが入ってくるテーブルなので、「社員番号」ともうひとつずつ、ふたつの主キーを設定する必要がありますね。



テーブル作成が完了したら次のステップに進みたいところなんですが、「社員テーブル」には少しデータが入ってた方が何かと作業がしやすいんで、適当になんかデータ入力しておきましょう。

「労働テーブル」にも、何件かデータがあったほうが、フォームを作ったりするときイメージがわきやすいかもわからないですね。
わたしは、13人(怪獣だけど)×3日分で39件の労働データを入力してみました。

でも、こんなに入力するのは大変ですから、ほんとになんか適当に3〜4件、入力しておけばオッケーデス。