プログラム素人です。
基本情報技術者試験の問題等が面白いので、備忘録。
データベースどころか、「アクセス」も触っていないデータベース素人です。
そのため内容は中途半端な、備忘録です。ただのメモ。
データベースの問題に「正規化」というのがあるらしい。
正しいか分からないが、エクセルのパワークエリでやってみる。
今回は、基本情報技術者試験について記載しているHP
「エクセルがともだち」さんの「【データベース】正規化について理解するように努める」
の話のを例にパワークエリを使ってしました。
感謝します。(正しいかどうか分かりませんが、具体的に書いてあり分かりやすいです。)
具体的には、そちらを参照下さい。
(例は変えています。著作権等問題があれば削除します。)
============================
正規化には、
第一正規形
第二正規形
第三正規形
があるらしい。
第一正規形・・・データの冗長性や不整合を排除する。繰り返しの項目を持たない
第二正規形・・・すべての非キー属性が候補キーに完全関数従属する
第三正規形・・・すべての非キー属性が候補キーに推移的関数従属しない。
けっこうややこしい。
元データとして下記のような歯抜けデータ(非正規形データ)(繰り返しデータはなし)があるとする。
それをパワークエリで読み込む。
第一正規化:
まず、「変換」「フィル」「下」で歯抜けを埋める。
で、完成ではある(多分)が、「エクセルがともだち」さんの例では、「主キー」の設定で、
「請求No.」と「明細No.」の組合せを主キーとしている。
それでいいのだが、実際に使うには、「請求No.」+「明細No.」があるといいかなと思い、カスタム列を作る。
しかし、「列の追加」「カスタム列」だと、
[#"請求No."]&[#"明細No."]
「演算子 & を型 Number および Text に適用できません。」
のエラーが出る。
多分、「数字列」どうしを&でつなげられないのだろう。
M言語をいじるTable.TransformColumnTypes(〇〇 {{"請求No.", type text}とかは面倒なので(できない)、
カスタム列を2列用意し、それぞれ、文字列にして、「列のマージ」をした。
(すると2列のカスタム列は消えて結果1列の「請求No.」+「明細No.」カスタム列ができた。)
(注:元の「請求No.」、「明細No.」列を残さないなら、2列を選択して「変換」「列のマージ」が可能)
(でも、よく分からないから、カスタム列を追加。
この段階で、主キーが2つあるので、正規化としては、どちらかを削除するべきなのかな。)
第一正規化のクエリはこれで完成とした。
第二正規化、第三正規化:
上記のデータを用い、「商品マスター」「取引先マスター」「請求一覧」「請求明細一覧」を作成していく。
第一正規化のクエリで作成したテーブルを元に、それぞれクエリを作成していく。
手順としては「行の削除」「重複の削除」をするだけ。
例では重複データはないが、重複の削除をしておくと、今後データが増えた場合は、
クエリを更新するだけでマスター等ができる。
*************考え
ここには出なかったが、第一正規化の「繰り返しの項目」の項目の削除も、ピボットの解除などで、
「縦持ちデータ」にすれば簡単に整形できると思う。
ただ、データベース素人なので、SQLなど使い方がよく分かっていない。
元データのような歯抜けデータ(非正規形データ)が増える場合は、パワークエリでできるだろう。
リレーショナルデータベースっぽいので、とっつきやすそうなのは、「パワーピボット」なので(?)
このデータを使って何かできればいいかなとも思います。