正規化とは、データなどを特定のルールに基づき変更して利便性を向上させる手法である。
データベースの正規化
※当解説ではサロゲート・キーを使用して解説をおこなっていることと、第3正規形まで解説しています。
第4および第5はワケがわからないよ・・・
非正規的なデータ
まずは正規化が行われていない下のデータを見てほしい(消費税は5%)
商品名 | 値段 | 税込価格 | 売先 | 売却個数 |
テレビ | 1000円 | 1050円 | ニコニコ本社 | 10個 |
パソコン | 3000円 | 3150円 | 5個 | |
大百科ニュース | 3個 | |||
洗濯機 | 1500円 | 1575円 | 2個 | |
冷蔵庫 | 2000円 | 2100円 | ドワンゴ | 2個 |
データの正規化を行う上で重要なことは、「重複性の排除」と「関係性の明確化」である。
よくExcelで見られるクソみたいなデータ形式だがなんとかして利便性を向上する必要がある。
それが後述する第3正規形までの方法である。
第1正規形
まずは関係性を明確にするため計算により求められる要素の排除と、繰り返し要素の排除を行う。
商品名 | 値段 | 売先 | 売却個数 |
テレビ | 1000円 | ニコニコ本社 | 10個 |
パソコン | 3000円 | ニコニコ本社 | 5個 |
パソコン | 3000円 | 大百科ニュース | 3個 |
洗濯機 | 1500円 | 大百科ニュース | 2個 |
冷蔵庫 | 2000円 | ドワンゴ | 2個 |
第2正規形
次に、項目と関連する値の要素を抜き出す。
ここでは「商品名」と「値段」が関連しているためこれを個別に抜き出し、「商品」テーブルに。
元のテーブルを「取引」テーブルとする。
その際に「商品」テーブルで一意な番号として商品番号を付与する。
「商品」テーブル
商品番号 | 商品名 | 値段 |
0001 | テレビ | 1000円 |
0002 | パソコン | 3000円 |
0003 | 洗濯機 | 1500円 |
0004 | 冷蔵庫 | 2000円 |
「取引」テーブル
商品番号 | 売先 | 売却個数 |
0001 | ニコニコ本社 | 10個 |
0002 | ニコニコ本社 | 5個 |
0002 | 大百科ニュース | 3個 |
0003 | 大百科ニュース | 2個 |
0004 | ドワンゴ | 2個 |
第3正規形
「取引」テーブルではまだ重複性が残っているため、これを解消する。
売先の情報を「売先」テーブルとして取り出すことにより解決できるため実行する。
なお、「商品」テーブルには変化がないためここでは割愛する。
「売先」テーブル
売先番号 | 売先名 |
0001 | ニコニコ本社 |
0002 | 大百科ニュース |
0003 | ドワンゴ |
「取引」テーブル
商品番号 | 売先番号 | 売却個数 |
0001 | 0001 | 10庫 |
0002 | 0001 | 5個 |
0002 | 0002 | 3個 |
0003 | 0002 | 2個 |
0004 | 0003 | 2個 |
最終的な関係性
第3正規形まで整えることによりデータの関係性や繰り返し要素の排除が行えるため、考え方としては中々に便利である。
各テーブル間の関係性は下のとおりである。
- 売先:取引=1:多
- 商品:取引=1:多
Unicodeの正規化
Unicodeでは、文字の合成という概念があり、複数の文字を1つの文字として扱う手段がある。また、すでに合成された文字の一部については、それ独自で文字コードを持っている。また、一部の文字は互換性のための文字の形の変化であり、いざとなればフォントやリッチテキストで代用可能である。ここでいくつか問題が発生する。
それらを解決するのが正規化である。正規化には以下の3つの概念を覚えておく必要がある。
- 正準分解 - 文字の形を崩さない限りにおいて、可能な限り分解し所定の順序に並び替える
- 正準合成 - 隣接した合成文字を可能な限り合成する
- 互換分解 - 文字の形の変化を取り除き、さらに可能な限り分解し所定の順序に並び替える
そのうえで、以下の4つの正規化形式が定義されている。
- NFD(正規化形式D) - 正準分解を行う
- NFC(正規化形式C) - 正準分解後、正準合成を行う
- NFKD(正規化形式KD) - 互換分解を行う
- NFKC(正規化形式KC) - 互換分解後、正準合成を行う
例を挙げる。
元の文字 | NFD | NFC | NFKD | NFKC |
---|---|---|---|---|
ガ(U+30AC) | U+30AB U+3099 | U+30AC | U+30AB U+3099 | U+30AC |
⑨(U+2468) | U+2468 | U+2468 | U+0039 | U+0039 |
U+30ABはカタカナのカ、U+3099は合成用濁点、U+0039は半角数字の9である。並び替えの例がないが、要するに複数のダイアクリティカルマークがある場合、所定の順序に並び替えないといけないという規則があるためである。
関連項目
- 1
- 0pt