20221225基本情報技術者試験の問題っぽいものを備忘録(正規化をパワークエリしてみる)

プログラム素人です。
基本情報技術者試験の問題等が面白いので、備忘録。


データベースどころか、「アクセス」も触っていないデータベース素人です。


そのため内容は中途半端な、備忘録です。ただのメモ。

 

データベースの問題に「正規化」というのがあるらしい。
正しいか分からないが、エクセルのパワークエリでやってみる。

 

今回は、基本情報技術者試験について記載している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など使い方がよく分かっていない。
元データのような歯抜けデータ(非正規形データ)が増える場合は、パワークエリでできるだろう。

リレーショナルデータベースっぽいので、とっつきやすそうなのは、「パワーピボット」なので(?)
このデータを使って何かできればいいかなとも思います。