このページにはプロモーションが含まれています。
はじめに
こんにちは、はなまるです。
今回はデータベースの「正規化」について、学んだことをまとめてみました。
ご参考になれば嬉しいです。
データベースの正規化がイマイチよく分からない方
IT初心者にも分かりやすい解説を求めている方
正規化をする目的
そもそも、どうして正規化をしなければいけないの?
正規化する目的は、整合性や一貫性を維持するためです。
正規化されていないと、更新時異常(異状)という不具合が発生します。
手順に沿って別の表に分解していくのが正規化です。
この記事では、第1正規化から第3正規化についてお伝えします。
非正規形
非正規形とは、繰り返し項目がある表のことです。
どんな表なのか、次表の例で見ていきましょう。
売上番号 | 日付 | 顧客ID | 顧客名 | 商品ID | 商品名 | 単価 | 数量 |
---|---|---|---|---|---|---|---|
1 | 2024/12/1 | C1 | はなまる | N01 | パソコン | 1000 | 1 |
N03 | イヤホン | 100 | 2 | ||||
2 | 2024/12/2 | C2 | とらまる | N01 | パソコン | 1000 | 1 |
N02 | マウス | 400 | 2 | ||||
3 | 2024/12/3 | C3 | ねこまる | N04 | デスク | 600 | 1 |
N05 | モニター | 800 | 2 |
売上表の水色背景の部分に注目してください。
商品コード、商品名、単価、数量が2次元の表ではなく、複数行に繰り返されています。
繰り返しを解消して、ひとつの属性にひとつのデータになるように分解します。
それが第一正規化です。
第1正規化
商品IDを複合キーにして、売上表と売上明細表に分解すると次のようになります。
売上表
売上番号 | 日付 | 顧客ID | 顧客名 |
---|---|---|---|
1 | 2024/12/1 | C1 | はなまる |
2 | 2024/12/2 | C2 | とらまる |
3 | 2024/12/3 | C3 | ねこまる |
売上明細表
売上番号 | 商品ID | 商品名 | 単価 | 数量 |
---|---|---|---|---|
1 | N01 | パソコン | 1000 | 1 |
1 | N03 | イヤホン | 100 | 2 |
2 | N01 | パソコン | 1000 | 1 |
2 | N02 | マウス | 400 | 2 |
3 | N04 | デスク | 600 | 1 |
3 | N05 | モニター | 800 | 2 |
これで、「ひとつの属性にひとつのデータ」である2次元の表(=第1正規形)にできました。
第1正規化は、繰り返し部分をなくすこと
第2正規化
例の表は第1正規形にできました。
売上明細表は主キーがふたつの属性で構成されています。
主キーの一部が関数従属していることを部分関数従属といいます。
第2正規化でこの部分関数従属を分解します。
売上明細表から商品IDをもとに部品表を参照できる形にします。
売上明細表
売上番号 | 商品ID | 数量 |
---|---|---|
1 | N01 | 1 |
1 | N03 | 2 |
2 | N01 | 1 |
2 | N02 | 2 |
3 | N04 | 1 |
3 | N05 | 2 |
商品表
商品ID | 商品名 | 単価 |
---|---|---|
N01 | パソコン | 1000 |
N02 | マウス | 400 |
N03 | イヤホン | 100 |
N04 | デスク | 600 |
N05 | モニター | 800 |
第2正規化は、部分関数従属をなくすこと
第3正規化
売上表に注目すると、顧客IDが決まれば顧客名が決まるという関数従属が成り立ちます。
非キー属性間で関数従属していることを推移的関数従属といいます。
第3正規化で推移的関数従属を分解します。
売上表
売上番号 | 日付 | 顧客ID |
---|---|---|
1 | 2024/12/1 | C1 |
2 | 2024/12/2 | C2 |
3 | 2024/12/3 | C3 |
顧客表
顧客ID | 顧客名 |
---|---|
C1 | はなまる |
C2 | とらまる |
C3 | ねこまる |
以上で、非正規形から第3正規形に分解できました。
第3正規化は、推移的関数従属をなくすこと
おわりに
今回はデータベースの正規化についてまとめました。
ここまでお読みいただきありがとうございました!
コメント