【ACCESS】毎日続ける!新家計簿作成➀ 正規化を考える

 家計簿を長く続けていくためには、やはり簡単で使いやすいことやすぐに家計の状態を確認できることが重要だと思います。 
というのも、前回までに作成した家計簿は使い物?にはなっていると思うのですが、もう少し改良する必要があると感じるようになっていたからです。
まだ完成もしていないのに、、、と思いつつ、家計簿を見直すことに。

改善する項目

・クレジットカードを使った時や電子マネーを使った時、自動的に引落し日や引落し先が入力されるよ
 うにする
・検索機能を強力にして家計の状態を確認しやすくする

クレジットカードによって、締日や引落し日が違います。
いちいち手作業で計算して引落し日を記入するのも面倒ですので、自動的に入力できるようにします。

また検索機能を強化して、カード別の明細一覧や期間を区切って残高の確認など、家計簿の機能のレベルアップを考えます。


正規化を考える

 まず基本に戻って、テーブルから見直してみることにします。
本やインターネットで調べると、正規化という言葉によく出会いますが、これはデータベースを構築するうえで大変重要なことで、正規化をすることによって、データの整合性を保ち、データの操作やデータベースの保守が容易になり、データベースの品質を保つことができる、ということです。

 正規化の主な業はテーブルを適切に分解し、キーを設定し、冗長なフィールドを整理することです。
分解の粒度により、第1正規形、第2正規形、第3正規形、ボイスコッド正規形、第4正規形、第5正規形とありますが、一般的には第3正規形まで達成できれば十分とされています。

第1正規形
キーを設定し、繰り返しフィールドの削除、導出フィールドの削除                     
第2正規形
部分関数従属性を別テーブルへ
第3正規形
推移関数従属性を別テーブルへ


第1正規形

第一正規形の考え方としては
・繰り返しフィールドの削除
・導出フィールドの削除
・主キーの設定
になります。

スーパーで買い物をしたときのレシートから家計簿を考えてみます。

レシートの画像

このレシートから手書きで家計簿を記入するとこのような感じでしょうか。

手書き家計簿の画像


冗長性の削除
できた表から、列の冗長性を取り除きます。
表を見てみますと、品名、金額、個数、小計が横に3件並んでいますが、これが10件も20件にもなると横に何度も列が繰り返される、見苦しい長い表になってしまいます。
エクセルの表のように品名フィールド列に品名を、金額フィールド列に金額をまとめることにより、データの整合性や保守が容易になります。

冗長性のある画像


導出フィールドの削除
次に導出フィールドの削除をします。
導出フィールドというのは他のフィールドの値から計算できるフィールドのことで、この表では支出合計と残高合計になります。
支出合計は支出金額フィールド×個数フィールドでを計算することができ、残高合計は一つ上の残高合計-支出合計+収入金額で計算できます。
正規化をするためにはこのような余分なフィールドを削除する必要があります。

導出フィールドのある画像


主キーの設定
テーブルは、主キーと主キーに関数従属する列でできています。
テーブルの2つの列(または列の組み合わせ)同士で、1つの列の値が決まるともう一方の列の値も一意に決まる場合、関数従属であるといいます。
つまり、主キーの値を指定することにより、テーブル内のレコードを一意的に識別することができるということです。

そのためテーブルにおいて、主キーは必ず一つ存在しなければならず、一つしか存在しません。
この表では主キーになるフィールドが存在していません。
この状態を回避するため、一意のレコードになるような重複しないキーを割り振ります。

主キーの設定


第2正規形

第2正規形は従属関係にあるデータを別テーブルに移動します。

家計簿を記入していくと、繰り返されるデータがあるのがわかります。


同じ品名や支払方法が繰り返されています。 これらの無駄を省くため、本体から分離します。
購入店フィールドも繰り返されているように見えますが、ただこれはもし初めての店を利用した場合、新しく登録しなければならずまたNULL値も許されません。 ということで購入店フィールドは本体に残します。
しかしこのままでは主キーがありませんので、「品名ID」と「支払ID」を追加します。



第3正規形

主キーに対してすべてが従属していて、かつ推移的関数従属も存在していないテーブル状態のことです。
推移的関数とは、Aが決まるとBが決まり、Bが決まるとCが決まるとき、Aが決まるとCが決まるような推移的な関係をいいます。
例えば文房具のメーカーで次のようなテーブルを考えてみます。

IDが決まれば商品名が決まります。 商品名が決まれば販売価格も決まります。 ただ販売価格が決まってもIDは決まりません。
このような販売価格とIDを推移的関数従属といいます。
第3正規形ではこのような推移的関数従属を別テーブルに分割します。

今回作成する家計簿テーブルにおいて、支出金額は品名フィールドには従属していません。
例えば、食パンを買っても買う店や特売などによって、その都度支出金額が違います。
ということで、家計簿データベースはこれで完成です。


次回は、実際にテーブルを作成します。

【ACCESS】毎日続ける!新家計簿作成② 家計簿データベースを考える