イチから全部作ってみよう(35)テーブル結合はリレーショナルデータベースの肝:山浦恒央の“くみこみ”な話(204)(2/3 ページ)
ソフトウェア開発の全工程を学ぶ新シリーズ「イチから全部作ってみよう」。第35回は、リレーショナルデータベースの肝となるテーブル結合について解説する。
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 | 必須 | |
| メールアドレス | 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.