フルスタックエンジニアのノウハウ
2020.10.24    2022.06.12

正規化とは何か?(データベース設計のコツ)

この記事の動画版はこちら(画像クリックでYoutubeに飛びます)

チャンネル登録お願いします!


今回は、データベース設計の際に行う「正規化」について、初心者向けに分かりやすくご説明したいと思います。


Webアプリを作る上で、データベース設計は必須のスキルです。


データベース設計を行う際に、この「正規化」という方法は頻繁に使う基本的な考え方になりますので、ここでしっかり理解しておきましょう!



正規化とは何か?


データベース設計を行う際は、


「商品情報」を保存するテーブル
「顧客情報」を保存するテーブル
「注文情報」を保存するテーブル


といったように、データの種類ごとにテーブルを作成していきます。


この辺りの基礎的な部分や、そもそもデータベースとは何か?ということが分からない場合は、別の記事でご説明していますので、まずはそちらを学習してみてください。


関連記事

データベースの基礎知識【実例を交えて説明】


例えば、ネットショップのWebアプリを作る場合は、商品テーブル顧客テーブル注文テーブル、といったテーブルが用意される訳です。




そして、ネットショップを日々運営していくと、注文が行われる度に、このように注文テーブルにデータが保存されていきます。




注文テーブルには、


注文番号や注文日といった注文に関する情報や、
氏名、メールアドレス、住所、電話番号といった購入者の情報
商品名、価格、数量、小計といった購入した商品の情報


などのデータがどんどん保存されていきます。



このような注文データが日々増えていく訳ですが、ここで見てみてください。


なんだか同じようなデータをいくつも保存していますよね。




Aさんの氏名、メールアドレス、住所、電話番号といった情報は、Aさんが注文を行う度に毎回保存されていますし、ステッカーの商品名や価格も、ステッカーが注文される度に保存されており、

とても無駄のあるデータの持ち方になってしまっています。


ちなみに、この「無駄のある状態」のことを「冗長」と言います。
冗長という表現は、システム開発ではよく出てくるので覚えておきましょう。



この無駄を無くすために、顧客のデータを外出しして、別テーブルとして持たせるようにします。




このようにしておけば、注文テーブルには「対象の顧客のID」だけを保存しておけば良いので、同じ顧客から別の注文があった際にも、顧客データをその都度作る必要がなく、同じIDを保存すれば良く、かなり無駄が無くなります。


このように、無駄なデータを持たないようにテーブルを分けることを「正規化」と言います。



商品の情報も同じように正規化してみましょう。


こんな感じで、商品データを「商品テーブル」として外出しして、注文テーブルには「購入された商品のID」だけを持たせればOKです。




これで、注文テーブルは大分シンプルになりましたね!


ちなみに、注文データのように日々増えていくデータのことを「トランザクションデータ」、正規化されたデータのことを「マスタデータ」と言います。




マスタデータを管理するテーブルは、商品マスタ顧客マスタ、といったようにも呼ばれます。



正規化を行うメリット


このように、正規化を行うと、無駄なデータを持たなくて済むメリットがあります。


データベースには大量のデータが長年蓄積されていきますので、出来るだけ無駄のないデータの持たせ方にすることは、データベース設計を行う上でとても重要なことなんです。


正規化を行う、もう1つのメリットとしては、「データの管理が楽になる」ということです。


【正規化を行うメリット】
①無駄なデータを持たなくて済む
②データの管理が楽になる


これは、もう1つ別の例を見てみましょう。


例えば、ブログのデータを管理するデータベースがあった場合、ブログの記事データを保存するテーブルはこのようなイメージになります。


記事タイトルや本文、カテゴリーなどの情報が保存されています。




ここで、このカテゴリーについては冗長なデータになっていますね。




なので、カテゴリーを別テーブルとして分け、記事テーブルには「カテゴリーID」だけを保存するようにします。


これで正規化ができました。




ここで、もし「カテゴリー名を後から変更したい」といったことが発生したらどうでしょうか?


正規化を行う前の状態だと、記事テーブルのカテゴリー欄を全て直していかなくてはなりません。

記事を何百件も登録した後ではとても大変ですね。





しかし、カテゴリーが別テーブルとして正規化されていれば、カテゴリーテーブルの名称を1箇所直すだけで済みます。




これが2つ目のメリット「データの管理が楽になる」ということです。


修正する場合だけでなく、例えばこのようにカテゴリーの一覧を表示したいような場合も、カテゴリーテーブルのデータを読み出すだけでOKです。





 この例の「カテゴリー」のように、それ自体の一覧表示を行うような場合は正規化を行うようにしましょう!



まとめ


以上が、データベース設計における「正規化」の説明になります。


慣れない内はどこを正規化すべきか判断が難しいこともあると思いますが、こういったデータは外出しするというのは大体決まってくるので、何度かデータベース設計を行っていくと、次第に感覚で出来るようになっていくと思います。


また、アプリが出来た後でもデータベース構造は変えられないことも無いので、最初はそれほど難しく考えすぎずに、データベース設計にどんどんチャレンジしていきましょう!



なお、今回は分かりやすいように全てのデータを正規化する例でご説明しましたが、例えば「注文された商品の価格」などは、後から商品マスタの価格情報を変更した場合でも、注文当時の価格を保持しておく必要があるため、その部分はあえて正規化しないというケースもあります。


こういった部分は、実際のアプリの運用に沿った設計を考えていく必要があります。


実践講座の方では実際のアプリをベースに、より高度なデータベース設計を実践しながら学んでいきますので、さらに高いレベルを目指していきたいという方は是非ご参加ください。


おすすめ記事