【データモデリング】物理テーブル設計のチュートリアル

投稿更新日: 2025/6/9

サムネイル

データモデリングにおいて、論理テーブル設計が完了したら、次のステップとして物理テーブル設計を行います。本記事では、ECサイトを題材にして、MySQL を使用した物理テーブル設計の手順を詳しく解説します。

1. シナリオの確認

ECサイトにおける主要な機能を整理します。

  • 商品一覧の表示
  • カートへの追加・削除
  • 注文処理
  • 決済処理

この機能をもとに、エンティティ抽出とER図を作成し、論理テーブル設計を行いました。これを基に物理テーブル設計を進めます。

2. 物理テーブル設計の考慮点

物理テーブル設計では、以下の観点を考慮して実装を進めます。

2.1 DB 製品特性・インフラ要件

  • データベースの種類
    • MySQL, PostgreSQL, Oracle, SQL Server など、製品ごとに特性や制限が異なる。
    • 本記事では MySQL を前提とする。
  • インフラ環境の違い
    • オンプレミスかクラウド(AWS RDS, GCP Cloud SQL など)かで運用が異なる。
    • クラウド環境では、自動バックアップやスケーリング機能を考慮。

2.2 具体的なデータ型マッピング(MySQL)

論理データ型MySQL データ型説明
VARCHARVARCHAR(n)文字列(可変長)
INTEGERINT整数
DECIMALDECIMAL(p,s)小数点を含む数値
DATEDATE日付
DATETIMEDATETIME日時
BOOLEANTINYINT(1)真偽値(MySQL では TINYINT を使用)

2.3 インデックス設計

  • 主キー(Primary Key, PK): AUTO_INCREMENT を設定して一意性を担保。
  • 外部キー(Foreign Key, FK): ON DELETE CASCADE などの制約を検討。
  • 検索性能向上のためのインデックス
    • よく検索されるカラムに INDEX を設定。
    • ORDER BY でよく使用されるカラムには BTREE インデックスを検討。
    • 複数の検索条件を考慮して 複合インデックス を適用。

2.4 パーティショニング / シャーディング

  • パーティショニング: 大量のデータを保持するテーブルは RANGE PARTITIONLIST PARTITION を適用。
  • シャーディング: ユーザー数が多い場合、user_id を基準に水平分割を検討。

2.5 可用性・セキュリティ・運用設計

  • レプリケーション / クラスタリング
    • MySQL の Master-Slave レプリケーションを設定し、読み込み負荷を分散。
  • ユーザ権限
    • GRANT SELECT, INSERT, UPDATE ON database.* TO 'app_user'@'%' IDENTIFIED BY 'password';
  • バックアップ / 監査ログ
    • mysqldump による定期バックアップ。
    • binlog を有効化し、データ変更履歴を保持。

3. 物理テーブル定義の例

3.1 User(ユーザー)

カラム名データ型制約説明
user_idINTPK, AUTO_INCREMENTユーザーの一意識別子
usernameVARCHAR(255)NOT NULLユーザー名
emailVARCHAR(255)UNIQUE, NOT NULLメールアドレス(ナチュラルキー)
passwordVARCHAR(255)NOT NULLパスワード
created_atDATETIMEDEFAULT CURRENT_TIMESTAMP作成日時

3.2 Product(商品)

カラム名データ型制約説明
product_idINTPK, AUTO_INCREMENT商品の一意識別子
product_codeVARCHAR(100)UNIQUE, NOT NULL商品コード(ナチュラルキー)
nameVARCHAR(255)INDEX, NOT NULL商品名
priceDECIMAL(10,2)NOT NULL価格
stockINTNOT NULL在庫数
created_atDATETIMEDEFAULT CURRENT_TIMESTAMP作成日時

3.3 Cart(カート)

カラム名データ型制約説明
cart_idINTPK, AUTO_INCREMENTカートの一意識別子
user_idINTFK (User), NOT NULLカート所有者
created_atDATETIMEDEFAULT CURRENT_TIMESTAMPカート作成日時

3.4 CartItem(カート内商品)

カラム名データ型制約説明
cart_idINTPK, FK (Cart)カートの識別子
product_idINTPK, FK (Product)カート内の商品
quantityINTNOT NULL商品の個数

3.5 Order(注文)

カラム名データ型制約説明
order_idINTPK, AUTO_INCREMENT注文の一意識別子
user_idINTFK (User)注文したユーザー
total_priceDECIMAL(10,2)NOT NULL合計金額
statusVARCHAR(50)NOT NULL注文ステータス(例: 確定, 発送済み)
order_dateDATETIMEDEFAULT CURRENT_TIMESTAMP注文日時

3.6 OrderItem(注文内商品)

カラム名データ型制約説明
order_idINTPK, FK (Order)注文の識別子
product_idINTPK, FK (Product)注文内の商品
quantityINTNOT NULL商品の個数

3.7 Payment(決済)

カラム名データ型制約説明
payment_idINTPK, AUTO_INCREMENT決済の一意識別子
order_idINTFK (Order)関連する注文
methodVARCHAR(50)NOT NULL決済方法(クレジットカード, 銀行振込など)
statusVARCHAR(50)NOT NULL決済ステータス(成功, 失敗など)
payment_dateDATETIMEDEFAULT CURRENT_TIMESTAMP決済日時

※パーティショニング / シャーディング、可用性・セキュリティ・運用設計についてはこのチュートリアルでは設計しない。

4. まとめ

本記事では、ECサイトを題材に MySQL を使用した物理テーブル設計を行いました。

  1. データベース製品特性とインフラ要件を考慮
  2. 論理データ型を MySQL の物理データ型へマッピング
  3. インデックス設計、パーティショニング、シャーディングの適用
  4. 可用性・セキュリティ・運用設計を考慮
  5. 実際の物理テーブル設計の例を表形式で記述

この設計をもとに、最適なクエリ設計やパフォーマンスチューニングを検討し、運用しやすいデータベースを構築しましょう。


この記事をシェアする

合同会社raisexでは一緒に働く仲間を募集中です。

ご興味のある方は以下の採用情報をご確認ください。