Accessでクレジット支払情報を管理 -3-

前回は Accessへのデータ取り込みと、簡単にクエリを作ってみました。

今回は「正規化するには?」として、Accessの支援機能を説明したいと思います。

#いや本当は「繰り返し処理するには?」も書きたいのですが長くなるのでまた次回!

正規化してみる

正規化って?

正規化についての説明は下記のようなサイトで詳しく説明されているので、参照してもらえればと思います。

新入社員必読、データベースの基本を理解しよう – テーブル設計の正規化ってなに?:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20130416/471174/

できるエンジニアになる! ちょい上DB術・基礎編(7):【DB概論】正規化の手順 (1 2) – @IT
http://www.atmarkit.co.jp/ait/articles/1109/07/news124.html

データの一貫性を維持するため」と言う理由が一番シックリくるかなと思います。

ただ、正規化を進めることでパフォーマンスが劣化していく(ことがよくある)のと、データへのアクセス方法を簡易にするために 、あえて非正規化する場合も(よく)あります。

このあたりは実際に作ってみて実感しないと分からないので、説明が難しいのですね・・・

最初は「第3正規化までのルールを覚えて適用させていく」を徹底し、パフォーマンス問題やデータアクセスの不便さ(特にExcel等他のツールから接続して利用しやすいか)が出るようであれば非正規化を検討してもいいと思います。

設計段階ならともかく、稼働しているシステムで正規化・非正規化を行う際には要注意です。当たり前ですが、影響範囲が非常に広いです。クエリ、フォーム、レポート等すべての元になるのがデータ(テーブル)なので。

Accessの正規化”支援”機能

Accessだろうが、なんだろうが リレーショナルデータベースであれば方法/手法は変わらないのですが、Accessならではの機能があるので紹介したいと思います。

作業の前にバックアップを取っておいてください。

エクスプローラー上でコピー/貼り付けを行うことで、ファイルを複製してお手軽にバックアップできます。

正確には「バックアップ」というか単なるファイルコピーですね。

サイズが大きい場合でも、一つのファイルにまとめているのであれば、ファイル単位でバックアップしておいてください。

余談ですが、「データサイズが大きくなる」、「多人数で利用したい」等の理由がある場合、テーブル(とデータ)だけ別のAccessファイルやSQL Server等のデータベースに格納したりします。

この場合、(クエリーやフォームだけの)Accessファイルを複製しても、テーブルは別のところにあるためテーブル(とデータ)はバックアップされていないことに注意してください。

テーブルの正規化ウィザード

[データベース ツール]-[解析]-[テーブルの正規化]を選択します。

image

テーブル正規化ウィザードが表示されますので、[次へ(N)]を選択します。

image

ここで「説明を見る」を選択すると左に表示されている「商品とその仕入先」テーブルについての説明が表示されます。次の画面でも同様です。

簡単に正規化についての説明が表示されるので、初めて起動した際には一読してみてください。

image

最初の2ページは正規化ウィザードについての説明でした。次の3ページ目からが設定です。

まず、正規化を行うテーブルを選択します。[次へ(N)」を選択します。

image

せっかくなので「ウィザードを使う(Y)」を選択してみたいと思います。
[次へ(N)」を選択します。

image

少し見にくいので、テーブルの高さを調整しましたが・・・

image

いまいち自分の想定した結果にならないですねぇ・・・

どういった想定をしていたかと言うと、明らかに何度も出てくる「利用先」を切り出して、後は「支払回数」も切り出すかどうか、くらいで十分かなぁと思っていました。

なにがイマイチなのか・・・

上記の形だと、確かに「利用先」は切り出されていますが、一緒に「回数」や「支払回数」が付いてきています。このままでは「同じ支払先でも支払回数が違えば別マスターデータ」として扱われるのでイマイチです。

また、そこから「手数料」が切り出されていますが、それなりにパターン化(金額パターンが2~3つ以上)されるのであれば分けてもいいですね。ただ、今回自分の場合は分けることの良さが特にありません。

残念ながら精度はそれほど高くないのが現状です。あくまで参考程度で実行するくらいです。(このウィザードの規定値も「独自に指定する(O)」だったりしますし)

独自に指定する方法でやり直し

仕方がないので一旦戻って独自指定をします。

戻る(B)」を選択し、今度は「独自に指定する(O)」を選択「次へ(N)」を選択します。

image

利用先」を切り出したいと思います。

表示されたテーブルの「利用先」フィールドを右の何もない空間(テーブル1の横あたり)にドラッグします。すると新しいテーブルが作成され、テーブル名の入力が促されます。

今回は「T_M利用先」としておきます。

image

少し見やすくテーブルサイズを変更しました。

左の元テーブル「テーブル1」に「ルックアップとして~」フィールドが追加され、新しい右のテーブル「T_M利用先」には「固有のID~」と「利用先」フィールドがあることが見て取れます。

これで「利用先」のデータ(今回は利用先の名称)は「T_M利用先」テーブルで管理され、そのIDでもって元のテーブルと関係(リレーション)が設定されました。

image

もう少し細かく見ると、テーブル間の線に記号が書かれています。
テーブル1」側には「」マーク、「T_M利用先」側には数字の「1」。

T_M利用先」には、利用先に関する重複しないデータが登録され、「テーブル1」には利用先データ(ID)が重複して登録されます。

このような関係を「一対多リレーションシップ」といいます。

とりあえず今回はこれだけでいいので、「次へ(N)」を選択します。

利用先の重複データから候補を自動的に表示してくれるのですが・・・これもまた精度がそれほど高くありません・・・残念!

仕方がないので、修正を行っています。下記の画像は適当に選択しているのであり得ない内容になっていますが、利用先としてまとめる候補があるようであれば設定してください。

image

せめて「候補」を手入力できれば使えるのですが、あくまで自動で取得された値をドロップダウンから選択するだけです・・・やっぱり残念!

最後に、クエリを作成するかどうか選択します。
が、「完了(F)」を選択するのはお待ちください。先に下を読んでからで。

image

クエリを「作成する(Y)」を選択すると面白い動きをします。

画面の説明通りになりますが
元のテーブルと同名で、元のフィールドで表示できるクエリを作成」します。

作成する(Y)」を選択「完了(F)」を選択した場合のオブジェクト一覧の画像が下記です。

image

これは、下記のような処理が行われています。

  1. ウィザードで指定された「テーブル1」と「T_M利用先」テーブルを作成
  2. 元の「T_201501」テーブルを「T_201501_OLD」という名称に変更
  3. クエリ「T_201501」を作成

作成されたクエリを編集画面で表示すると、リレーションの設定が行われ、フィールドに「T_M利用先」-[利用先]が含まれているのが分かります。

image

これで「T_201501」という名称を利用してデータにアクセスしていた処理は、特に修正を行うことなく引き続き利用が可能になります。

アクセスする先がテーブルからクエリに変わっていますが、どちらも単なる「データの箱」として扱われるため、引き続きそのまま利用が出来るという理屈になります。

Accessには名前の自動修正情報を追跡し、名前の自動修正を行う機能も付いていますが(規定では追跡も修正もON)、このウィザードで修正される場合はちゃんと自動修正されないようになっているようです。

そうでないと、テーブル名を変更した際に、そのテーブルを参照しているクエリも修正後のテーブル名を参照することになってしまいます・・・

作成したリレーションシップ情報

切り出した情報で、どういうリレーション設定が行われているのか表示することが出来ます。

[データベース ツール]-[リレーションシップ]-[リレーションシップ]を選択します。

image

じゃーん。正規化ウィザードで表示されていた内容と同じですね。

image

今回は2テーブルだけなのでシンプルですが、実際にシステム構築していくとテーブルだけでもすぐに20以上になったり、クエリも含めた設定が可能なので巨大なリレーションマップが出来上がってきたりします。

ちゃんと作成しておくと、ここからレポートをワンボタンで出すことも出来るので重宝する画面だったりもします。

正規化のまとめ

と、ここまで書いておきながら、Accessの正規化ツールはおまけ程度ととらえた方がよく、結局は自分で考える必要があるということだと思います。

ただ、もっとサンプル数が多く、より定型的なデータな場合はウィザードを使う価値があるかもしれませんし、自動で元テーブルを置き換えるクエリを作成する機能は、フォーム等を作成しながら正規化するのであればそれなりに使える機能だと思います。
要は使いどころなので、色んな機能があることを理解してもらえればいいかと思っています。

#少なくとも、リレーションシップの一覧を表示しレポートを出す機能は有用ですしね

頑張って第3正規化までの考え方と適用方法は覚えてみましょう!
(あれ?こんなまとめでいいのか・・・?)

Akira Fukami

  • このエントリーをはてなブックマークに追加

コメントをどうぞ

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

CAPTCHA