家計簿を正規化してみた ＆ 「YoshiTech」 のこと

#まえおき/YoshiTechのこと
「経済的に自立するためIT技能を身につけたい」
「日々考えている問題について論理的に分析できるようになりたい」
「気がかりだけれど、自分にはどうしようもない事と思っていたある問題。技能と知識を身に着けて、自分もその解決の為に貢献したい」
と思いポツポツとExcelの基礎から独学を始めていた矢先、

「経済的に自立するためIT技能を身につける」
この目標の実現に向けて、ワロさん(@kurosawa_kuro)に勉強方法についてアドバイスいただけることになりました。今後、その過程で学んだことを「YoshiTech」タグを付け、ここQiitaに記録していきます。

#データベースを学ぶ
まずはじめに、オーム社の『マンガでわかるデータベース』を4章まで進めることになりました。
この本は、商品管理を行っている主人公が、妖精からデータベースを教えてもらい実務を改善していくという構成になっています。どんなときにデータベースが役立つのかが初心者である私にも理解しやすく、データベースがぐっと身近に感じられて読みやすかったです。

#正規化
ここからは「3章:データベースを設計しよう」で重要だと思ったポイントについて書いていきたいと思います。

正規化がポイントだと感じたので、自分が使っている家計簿に置き換えて考えてみたいと思います。

##正規化とは？なぜ必要？
・「正規化」＝現状の世界をリレーショナルデータベースの表に落とし込む作業。データをリレーショナルデータベースで正しく管理するために必要な作業。
・「リレーショナルデータベース」＝「表」を使ってデータを取り扱う。数学の演算（和・差・積・直積・射影・選択・結合・商）をもとに、データの操作を行える。

つまり、「値をいじったときに矛盾が生じない表を作るために、複数の項目が存在している表を、より少ない項目の表に分割する作業。つまりデータの重複を無くす作業。」だと理解しました。

##正規化の手順（家計簿を例にして正規化してみる）
「管理番号・費目ID・店ID」は通常の家計簿では使わないと思いますが、今回は正規化を試すための便宜上、これらの項目を作りました。

###①非正規形（形の読み＝けい）
繰り返し項目が排除されていない表。リレーショナルデータベースでは、このような表ではデータをうまく管理できないとされている。
→表を分割していく正規化の作業が必要。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/34f62981-a736-1ecf-ff9b-78868899fcd0.png)

↑上の表では、「費目ID・費目・決済方法・店ID・店」が繰り返し項目です。この繰り返し項目を排除すべく正規形にしていきます。

###②第一正規形
本の説明＝**1行に1つの値が入る表**。
→今回の家計簿は既に1行に1つの値となっているためこれはOK。
本の説明＝繰り返しになっている項目に関する列を分ける。
→下記の通り分けました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/af53833b-5947-fc0d-454b-910ec5f33a25.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/f96cf3b1-28e1-d982-1600-c68da0b0feb8.png)


↑この第一正規形②表を、次の段階でさらに分割していきます。

###③第二正規形
本の説明＝データを識別できるキー（=主キー）によってほかの列の値が決まるように分割したもの。主キーにほかの列が関数従属するように表を分割する。
・「関数従属」＝ある列の値によってほかの列の値が決まること。
以下「☆＝主キー」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/02602b45-f532-3586-a359-93ace1576ef3.png)


↑ひとつの店に対して決済方法はひとつなので、この分け方でＯＫ。
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/2b86908c-b619-14cf-480f-a306d5dbe233.png) 


「店ID」は2つの表の関連がわかるように両方の表に残しておきます。

主キーの値が決まるとほかの列の値が決まるように表を分けました。
上記では【第一正規形②】を分けました。
【第一正規形①】は分けません。【第一正規形①】は「管理番号」が1つ決まると「日付・費目ID・費目」がすべて決まります。つまりすでに「**主キーの値が決まるとほかの列の値が決まる表**」となっているため、【第一正規形①】はそのままのかたちで【第二正規形③】だと考えます。(今回の表だと、【第一正規形①】＝【第二正規形③】だということ。）



###③第三正規形
各項目の値が、主キー以外の項目によっては決まらないように分割したもの。推移従属を除くように表を分割する。
・「推移従属」=関数従属のうち、ある列の値によってい間接的にほかの列の値が決まること。
つまり、「間接的に値が決まってしまう項目」を無くしていく作業をする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/a5caecc2-8ab8-b639-da40-c06cb8efb5c0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/ce48f685-6c37-42df-d306-ba140e67115d.png)


↑間接的に決まる部分がなくなるように表を分割しました。第三正規形＝**主キー以外によってそのほかの列が決まることが無いようにした表**。
因みに本の中では第三正規形までしか正規化しませんでしたが、まだ分割が必要な重複したデータがある場合は、第四、第五…とさらに正規化していく必要があるようです。（…この理解で合っているか？）

##正規化のメリット
値を変更しても、データに矛盾が生じなくなる。
つまり人間による確認作業が軽減されて業務が楽になる。

##正規化のデメリット
細分化された表と表のつながりがパッと見でわかりずらいので、「見る」ベースだと、人間が理解しずらくなる。「ここの値はこのコードを参照して、あっちの表のこの値から引っ張ってくる…」とか考えながらじっくり見る必要がある。慣れればパッと見で理解できるようになるのかな？
PCで作業する分には、問題は無さそう。

#E-Rモデル上のMとN
E=Entity(実態)
R=Relationship(関連)
E-Rモデルとは現実世界を「実態」と「関連」という概念を使って考えるモデルのこと。
本の中では、例として挙げられているデータでも、練習問題でも、「M」「N」で表されている部分がありました。最初に練習問題(事例を分析し、E-R図を書く)を解いたときにはこの「M」「N」の記載をせずにE-R図の下に「1対多、多対多」と書いてしまいました。本の解答を見て、基準となる側のデータ(多数)に「M」、その基準に対する側のデータ(多数)に「N」が使われているのだとわかりました。

#おわりに
本の中では「売上報告書」を材料にして正規化の説明がされていました。今回家計簿に置き換えて正規化をしてみましたが、この「置き換える作業」が意外と難しかったです。途中、何度か「家計簿は正規化できないのではないか！？」と、置き換える作業を投げ出しそうになりました。そして何度か非正規形～第三までを試作していく中で結局、元の家計簿には無かった項目(管理番号・費目ID・店ID）を追加しましたし、逆に削除した項目もあります。扱いやすいように元データを変えてしまいました。

本の売上報告書の項目は「報告書コード・日付・輸出先コード・輸出先名・商品コード・商品名・単価・個数」となっており、家計簿とは個々の項目の内容もさることながら、項目同士の関係性が異なり、正規化の際に注意するポイントも異なりました。家計簿に置き換えるには、それぞれの項目の性質と、第一・第二・第三それぞれの段階の目的を改めて整理し考え直す必要がありました。

正直、今回の正規化の方法が合っているのかどうか自信は無く、正規化する対象が変われば、またうんうん唸って考えるだろうし、作業時間もかかりそうです。練習問題についても誤解答してしまったし、スムーズに解くことができませんでした。まだまだ理解しきれていないのだと思います。数をこなして身に着けていきたいです。

今回、見本とは違う材料を使う事の難しさと楽しさを味わうことができました。今後もなるべく自分の興味に沿った材料に置き換えて、作業していきたいと思います。

次回は同じ本の4章(データベースを利用しよう-SQLの基本操作)について記事を書いてみます。


#参考
『マンガでわかるデータベース』高橋麻奈 著　オーム社

#編集記録
2020/9/19　[正規化の手順]について、家計簿の正規化方法が間違っていたので変更。各表も差し替え。