検索
連載

イチから全部作ってみよう(35)テーブル結合はリレーショナルデータベースの肝山浦恒央の“くみこみ”な話(204)(2/3 ページ)

ソフトウェア開発の全工程を学ぶ新シリーズ「イチから全部作ってみよう」。第35回は、リレーショナルデータベースの肝となるテーブル結合について解説する。

Share
Tweet
LINE
Hatena

4.今回のお題:テーブル結合の練習

 テーブル結合の練習として、今まで例題にしてきたワインのECサイトの業務フローと画面設計書を参考にしてテーブル構造を作成すること。

 例えば、ここまで紹介してきた学生情報テーブルであれば、次のように記述します(表6)。

項目名 カラム名 データ型 制約 備考
学籍番号 student_id TEXT 主キー/必須
名前 name TEXT 必須
年齢 age INTEGER
表6 学生情報テーブルの記述例

 ワインのECサイトの業務フローと画面設計書については以下の記事を確認してください。

5.筆者の作成例

 筆者は、ワインの画面設計書を基に、下記の4つのテーブルを作成しました。

  • 商品テーブル(表7):商品の情報をまとめたテーブル
  • 顧客テーブル(表8):顧客の情報をまとめたテーブル
  • 注文テーブル(表9):注文の情報をまとめたテーブル
  • 注文詳細テーブル(表10):詳細な注文の情報をまとめたテーブル

 皆さんはどうなりましたか。

項目名 カラム名 データ型 制約 備考
商品ID product_id TEXT 主キー/必須
商品名 name TEXT 必須
商品画像 image TEXT
ビンテージ vintage INTEGER
価格 price INTEGER 必須/0以上
在庫数 stock INTEGER 必須/0以上/初期値0
表7 商品テーブル

項目名 カラム名 データ型 制約 備考
顧客ID customer_id TEXT 主キー/必須
氏名 name TEXT 必須
電話番号 tel TEXT 必須
住所 address TEXT 必須
メールアドレス email TEXT 必須
表8 顧客テーブル

項目名 カラム名 データ型 制約 備考
注文ID order_id TEXT 主キー/必須
顧客ID customer_id TEXT 外部キー/必須 顧客テーブル参照
支払方法 payment_method TEXT 必須 cod:代引き
credit:クレジット
注文日 order_date TEXT 必須
表9 注文テーブル

項目名 カラム名 データ型 制約 備考
注文詳細ID order_detail_id TEXT 主キー/必須
注文ID order_id TEXT 必須/外部キー 注文テーブルを参照
商品ID product_id TEXT 必須/外部キー 商品テーブルを参照
数量 quantity INTEGER 必須/1以上
購入価格 price INTEGER 必須/0以上
表10 注文詳細テーブル

 筆者の作成ポイントは、注文テーブルと注文詳細テーブルを分けたことです。

 注文テーブルには、顧客ID、支払方法、注文日など、1件の注文そのものに関する情報を保持し、注文詳細テーブルには、商品ID、数量、購入価格など、その注文で購入した商品に関する情報を保持します。

 例えば、1回の注文で3種類の商品を購入した場合、注文テーブルには注文情報を1件だけ登録し、注文詳細テーブルには購入した3種類の商品の情報を登録します(表11、12)。

注文ID 顧客ID 支払方法 注文日
1 5 0(代引き) 2026/8/9
表11 注文テーブルの登録例

注文詳細ID 注文ID 商品ID 数量 購入価格
1 1 5(例:シャトーマルゴー) 3 20000
2 1 3(例:ミラヴァル) 1 3000
3 1 9(例:ポメリーロゼ) 7 5000
表12 注文詳細テーブルの登録例

 このように分けることで、注文IDや顧客ID、支払方法、注文日などの注文に関する情報を商品ごとに繰り返し登録する必要がなくなり、データの重複を抑えられます。

 さらに、注文に関する情報と、注文した商品に関する情報を分離することで、それぞれの情報を適切な単位で管理できます。例えば、支払方法を変更する場合も、注文テーブルの1件を変更するだけで済みます。

 また、注文詳細テーブルには注文時点の購入価格を保持しています。商品テーブルの価格は現在の販売価格として管理するため、将来商品の価格が変更された場合でも、注文詳細に保存した購入価格から、過去の注文を当時の価格で確認できます。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る