見出し画像

41【データ構造を正規化すること】大規模なDjangoプロジェクトにおけるパフォーマンスを最適化するための実践的な手法は?

はじめに

こんにちは!TechCommitメンバーの友季子です♬
今回は、データベース設計における「正規化」についてまとめてみます。
正規化は、一見地味に見えるかもしれませんが、システム設計の中でとても重要な概念です

特にPythonやDjangoを学んでいる方には、この考え方が役立つはずです。今回の内容が、皆さんの学びやプロジェクトに役立つことを願っています!


1.前提

この記事の前提として、Djangoフレームワークの基本的な知識があることを想定しています。また、リレーショナルデータベースの基礎知識や、外部キー(ForeignKey)を使った設計に慣れているとより理解が深まります。

2.データベースの「正規化」とは?

こんにちは!今回はデータベース設計でとても大切な「正規化」について大学生向けに解説します。特に、ECサイトの例を使って、なぜ「正規化」がシステム設計において重要なのかを説明します。

1. 正規化とは?

正規化とは、データベースの設計においてデータの重複や冗長性を避け、効率的で整った構造を作る手法です。データを整理して、情報を適切なテーブルに分け、無駄なく管理できるようにします。

まずはこちらの記事を参考がオススメです!
データベース構造の正規化

2. 正規化がなぜ重要なのか?

システム設計の最も重要な部分は「現実世界を正確にモデリングすること」だと教わりました。データベースが正確に現実世界を反映していれば、効率的にデータを管理し、操作することができますよ!
では、具体例で一緒に学びましょうね!

3. ECサイトの例で考える正規化

ECサイトを例に想像してみてください。
ECサイトのやりたいことは、顧客が商品を購入できるシステムを提供することです。そのために、商品情報やカートの情報がまず必要となりますよね!カートがないと困っちゃいます・・・

①「商品マスタ」と②「カート」

①商品マスタ:商品の名前、説明、価格など、商品そのものの情報を保存するテーブルです。これが「商品マスタ」と呼ばれるもので、正規化されたデータベースの中心的な役割を果たします。


カート:カートは、顧客が商品を購入する準備をするための場所です。カートには「商品マスタ」への参照(外部キー)が含まれ、どの顧客がどの商品を購入しようとしているかが保存されます。

4. Djangoのモデルで見る正規化

この概念をDjangoのモデルに置き換えてみます。

1.完成コード(サンプル)

以下は、ECサイトのカート機能に関連するDjangoモデルのサンプルコードです。商品管理とカート管理において、データをどのように設計し正規化するかを示しています。

# products/models.py
from django.db import models  # Djangoのデータベースモデル用モジュールをインポート

class Product(models.Model):  # 商品を表すProductモデルを定義
    # 商品の一意なIDを自動的に生成。主キーとして設定される。
    id = models.AutoField(primary_key=True)
    
    # 商品の名前を保存するカラム。最大255文字の文字列を許可。
    title = models.CharField("商品名", max_length=255)
    
    # 商品の詳細説明を保存するテキストフィールド。
    description = models.TextField("商品説明")

    # モデルの文字列表現を返すメソッド。
    def __str__(self):
        # 商品名を返す。管理画面やシェルで表示される名前。
        return self.title  # 商品のタイトルを返す

# cart/models.py
from django.db import models  # Djangoのデータベースモデル用モジュールをインポート
from products.models import Product  # Productモデルをインポートして関連付けを行う

class Cart(models.Model):  # カートを表すCartモデルを定義
    # カートに紐づくユーザーのID。Userモデルを外部キーとして参照し、ユーザーが削除されたらカートも削除される。
    user = models.ForeignKey("auth.User", on_delete=models.CASCADE)
    
    # カート内の商品をProductテーブルの外部キーとして関連付け。商品が削除されたらカートからも削除される。
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    
    # カート内の商品数量を正の整数で表すフィールド。
    amount = models.PositiveIntegerField("数量")

    # モデルの文字列表現を返すメソッド。
    def __str__(self):
        # ユーザー名と商品名を返す。管理画面やシェルで表示される内容。
        return f"{self.user.username} - {self.product.title}"  # ユーザー名と商品タイトルを返す

5. コードの概要

  1. Productモデル
    商品に関する情報を保存するテーブルです。idは一意な商品ID、titleは商品名、descriptionは商品説明です。

  2. Cartモデル
    ユーザーのカートに関する情報を管理します。userはユーザーに紐づけられ、productはカート内の商品を外部キーで参照しています。amountは商品の数量を表します。

6. コードの流れ

  1. Productモデルの作成
    商品データの基本的な情報を保存するモデルで、商品名や説明を登録します。

  2. Cartモデルの作成
    カートには、ユーザーと商品が紐づけられており、外部キーを利用してそれぞれのデータを正規化しています。この設計により、重複データを避けて効率的に商品とカートの情報を管理できます。

※私は上記のようなECサイトのプロジェクトには未参加です。

7. 正規化が生むメリット

  • データの整理:同じデータを繰り返し保存することを避け、重複を排除します。

  • メンテナンスの容易さ:データの更新や削除が簡単になり、エラーのリスクが減少します。

  • パフォーマンスの向上:無駄なデータが減ることで、検索や処理が高速になります。

8. 技術的なポイント

  • 正規化の重要性
    テーブル設計において、重複を避けて効率的にデータを保存するため、正規化が非常に重要です。外部キーを使うことで、他のテーブルと関係性を保ちながらデータを整理できます。

  • パフォーマンスの向上
    巨大なデータ量に対応するには、適切なインデックスの付与やデータ構造の正規化が不可欠です。大量のデータがある場合でも、正しく正規化されたデータベースなら、クエリのパフォーマンスを保つことができます。

9. オススメの参考文献

おわりに

データベースの設計では、正規化が大事です。一見地味に思えるかもしれませんが、効率的なシステム設計の基盤となります。商品管理とカート管理をしっかりと分け、現実世界を正しくモデリングすることで、後々のメンテナンスや拡張が簡単になりますよ。

皆さんもぜひ、データベース設計の際には正規化の考え方を取り入れてみてくださいね!


この記事が気に入ったらサポートをしてみませんか?