データベース設計

データベース設計

データベースはアプリケーションの中核であり、データベースの設計で失敗してしまうと、アプリケーションの開発、保守、運用が恐ろしく難しくなってしまう。

データベース設計は大まかに以下の順序で進める。

  • 概念の抽出
  • 第1正規化
  • 第2正規化および第3正規化
  • ER図の作成
  • ①概念の抽出

    どのような流れでデータを取得するのかを具体的にイメージし、必要な項目を洗い出して表を作成する。

    ▼データ取得のイメージ

    Notion Image

    ▼作成した表

    購入ID顧客ID顧客名年齢性別商品ID商品名単価数量購入日
    1C0001山田ヤマト15P0001ランチパック13022022/03/27
    2C0002松下ゆう53P0002お茶12012022/03/28
    同上同上同上同上同上P0003おにぎり1602同上
    3C0003川下さと32P0002お茶12012022/03/29
    同上同上同上同上同上P0004プリン1001同上

    ②第1正規化

    第1正規化では、「①概念の抽出」で得られた表から空欄や結合セルを排除し、データベースで扱えるような形に変形する。

    ▼第1正規化を実施したテーブル

    購入ID顧客ID顧客名年齢性別商品ID商品名単価数量購入日
    1C0001山田ヤマト15P0001ランチパック13022022/03/27
    2C0002松下ゆう53P0002お茶12012022/03/28
    2C0002松下ゆう53P0003おにぎり16022022/03/28
    3C0003川下さと32P0002お茶12012022/03/29
    3C0003川下さと32P0004プリン10012022/03/29

    ③第2正規化および第3正規化

    第1正規化だけでは、購入しなかった顧客や購入されなかった商品の情報を格納できなかったり、年齢が変わったときに複数行に渡って変更する必要があったりと実用上の問題が発生する。そこで次に、第2正規化および第3正規化を実施していく。

    第2正規化および第3正規化では、「②第1正規化」で得られたテーブルから行が重複している列を切り出していき、これを第3正規形になるまで繰り返す。なお、第3正規形になっているかどうかは、主キーの値が決まれば非主キー列が直接一意に決まるかどうかを見れば良い。

    「②第1正規化」で得られたテーブルをよく見ると、以下の色付きで示した部分の行が重複していることがわかる。

    Notion Image

    そこで、重複している部分を切り出して、以下のように3つのテーブルに分割していく。なお、分割したテーブルを結合すると分割前の状態に戻せる(無損失分解)ことに注意されたい。


    ▼購入テーブル ※ 主キー:購入ID

    購入ID顧客ID顧客名年齢性別購入日
    1C0001山田ヤマト152022/03/27
    2C0002松下ゆう532022/03/28
    3C0003川下さと322022/03/29

    ▼商品テーブル ※ 主キー:商品ID

    商品ID商品名単価
    P0001ランチパック130
    P0002お茶120
    P0003おにぎり160
    P0004プリン100

    ▼購入明細テーブル ※ 複合主キー:購入ID、商品ID

    購入ID商品ID数量
    1P00012
    2P00021
    2P00032
    3P00021
    3P00041

    次に、これらのテーブルそれぞれに対して、主キーの値が決まれば非主キー列が直接一意に決まる(第3正規形)かどうかを見ていく。すると、購入テーブルの顧客名、年齢、性別は顧客IDに従属していて、主キーに直接従属していないことがわかる。

    Notion Image

    そこで、購入テーブルをさらに分割する。


    ▼購入テーブル ※ 主キー:購入ID

    購入ID顧客ID購入日
    1C00012022/03/27
    2C00022022/03/28
    3C00032022/03/29

    ▼顧客テーブル ※ 主キー:顧客ID

    顧客ID顧客名年齢性別
    C0001山田ヤマト15
    C0002松下ゆう53
    C0003川下さと32

    このように正規化を実施していくと、重複が排除され、一つの事実が一つのテーブルの一行の中にだけ存在するように変形できる。最終的に以下の4つのテーブルが得られる。


    ▼購入テーブル ※ 主キー:購入ID

    購入ID顧客ID購入日
    1C00012022/03/27
    2C00022022/03/28
    3C00032022/03/29

    ▼顧客テーブル ※ 主キー:顧客ID

    顧客ID顧客名年齢性別
    C0001山田ヤマト15
    C0002松下ゆう53
    C0003川下さと32

    ▼商品テーブル ※ 主キー:商品ID

    商品ID商品名単価
    P0001ランチパック130
    P0002お茶120
    P0003おにぎり160
    P0004プリン100

    ▼購入明細テーブル ※ 複合主キー:購入ID、商品ID

    購入ID商品ID数量
    1P00012
    2P00021
    2P00032
    3P00021
    3P00041

    ④ER図の作成

    上で作成した4つのテーブルをER図にまとめると以下のようになる。

    Notion Image

    参考資料


    著者画像

    ゆうき

    2018/04からITエンジニアとして活動、2021/11から独立。主な使用言語はPython, TypeScript, SAS, etc.