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

投稿更新日: 2025/6/6

サムネイル

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

1. シナリオの確認

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

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

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

2. 論理テーブル設計の手順

2.1 テーブル定義(エンティティ → テーブル化)

エンティティをそのままテーブルとして定義し、データの構造を明確にします。多対多の関係がある場合は、中間テーブルを作成します。

2.2 主キー・外部キー・制約の設定

  • 主キー(Primary Key, PK)
    • サロゲートキー(自動採番IDなど)またはナチュラルキー(業務上意味を持つID)を選択
  • 外部キー(Foreign Key, FK)
    • リレーションの参照整合性を担保
  • 制約(Constraints)
    • UNIQUE, CHECK, NOT NULL などの制約を適用

2.3 正規化の徹底と非正規化判断

  • 基本は 第3正規形(3NF)を適用
  • 性能要件 に応じて部分的に非正規化
  • 正規化のステップ
    • 第1正規形(1NF): 繰り返し要素を排除し、各列に単一値のみを格納
    • 第2正規形(2NF): 1NFを満たし、部分関数従属を排除(主キーに完全依存する)
    • 第3正規形(3NF): 2NFを満たし、推移的関数従属を排除(主キー以外の列が他の非キー属性に依存しない)

2.4 論理レベルでのデータ型選定

  • 製品依存を避け、抽象的なデータ型を選択
    • VARCHAR, INTEGER, DATE, DECIMAL など

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

3.1 User(ユーザー)

カラム名データ型制約説明
user_idINTEGERPK, 自動採番ユーザーの一意識別子
usernameVARCHAR(255)NOT NULLユーザー名
emailVARCHAR(255)UNIQUE, NOT NULLメールアドレス(ナチュラルキー)
passwordVARCHAR(255)NOT NULLパスワード

3.2 Product(商品)

カラム名データ型制約説明
product_idINTEGERPK, 自動採番商品の一意識別子
product_codeVARCHAR(100)UNIQUE, NOT NULL商品コード(ナチュラルキー)
nameVARCHAR(255)NOT NULL商品名
priceDECIMAL(10,2)NOT NULL価格
stockINTEGERNOT NULL在庫数

3.3 Cart(カート)

カラム名データ型制約説明
cart_idINTEGERPK, 自動採番カートの一意識別子
user_idINTEGERFK (User)カート所有者
created_atDATENOT NULLカート作成日時

3.4 CartItem(カート内商品)

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

3.5 Order(注文)

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

3.6 OrderItem(注文内商品)

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

3.7 Payment(決済)

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

3. 論理テーブル設計後のER図

以下のER図は、論理テーブル設計を反映したものです。

erDiagram
  User {
    INTEGER user_id
    VARCHAR username
    VARCHAR email
    VARCHAR password
  }
  Product {
    INTEGER product_id
    VARCHAR product_code
    VARCHAR name
    DECIMAL price
    INTEGER stock
  }
  Cart {
    INTEGER cart_id
    INTEGER user_id
    DATE created_at
  }
  CartItem {
    INTEGER cart_id
    INTEGER product_id
    INTEGER quantity
  }
  Order {
    INTEGER order_id
    INTEGER user_id
    DECIMAL total_price
    VARCHAR status
    DATE order_date
  }
  OrderItem {
    INTEGER order_id
    INTEGER product_id
    INTEGER quantity
  }
  Payment {
    INTEGER payment_id
    INTEGER order_id
    VARCHAR method
    VARCHAR status
    DATE payment_date
  }

  User ||--o{ Cart : owns
  User ||--o{ Order : places
  Cart ||--o{ CartItem : contains
  CartItem ||--|| Product : includes
  Order ||--o{ OrderItem : contains
  OrderItem ||--|| Product : includes
  Order ||--o{ Payment : processes

4. まとめ

本記事では、ECサイトを題材に論理テーブル設計の手順を解説しました。

  1. エンティティをテーブル化し、リレーションを定義
  2. 主キー・外部キー・制約を適切に設定
  3. 第3正規形を基本にしつつ、性能要件に応じて非正規化を検討
  4. 正規化の基本概念(1NF, 2NF, 3NF)を説明
  5. 抽象的なデータ型を選定し、製品依存を避ける
  6. ER図で論理テーブルの構造を視覚化

この設計をもとに、次は物理データベース設計を進め、最適なインデックスやパーティショニングの適用を検討していきましょう!


この記事をシェアする

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

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