🐾

ER図 テーブルについての理解

2023/05/12に公開

はじめに

今日からいよいよチーム開発が始まりました〜〜
予習はしていたもののいざ1から自分たちで作るとなると、やっぱり理解しきれていなくて頭抱えました。

なぜこのテーブルが必要なのか?
https://zenn.dev/goldsaya/articles/c5377305c06929
合わせて復習にはなりますが、理解を深めていきたいと思います。

今日作ったやつ載せちゃうと答えになってしまうかもなので、違うECサイトの例で考えます💡

🌱こちらの記事を参考にしています
https://zenn.dev/farstep/books/7f169cdc597ada/viewer/4b4298

各テーブルの役割

ER図を見て全体を把握 ! 今回作成するテーブルは全部で6つです。

各テーブルを一つずつ見ていきましょう👀

管理者テーブル

管理者ユーザーのデータを格納するためのテーブル。
今回の例では、管理者ユーザが商品、ユーザの注文情報の管理を行う。
管理者ユーザーはメールアドレスとパスワードを使ってログインするので

  • メールアドレス
  • パスワード

というカラムを持たせている!

⚠️なぜ他のテーブルとアソシエーションが必要ないのか?
管理者側は1つのアカウントしかないため、誰が何を作ったなどの情報は必要ない!
管理者が2人以上とかで、誰が何を作ったなど記録したい場合は繋げるのもあり💪🏻

会員テーブル

会員のデータを格納するためのテーブル。
会員はユーザー名を登録した上で、メールアドレス・パスワードを使ってログインするため、

  • 名前
  • メールアドレス
  • パスワード
  • ステータス

というカラムを持たせている!

ステータスカラムは

  • 通常
  • 退会済み
  • 停止

のいずれかの状態を表すもの。
enumを使って管理するため、statusのデータ型はintegerになる。
(enumについても後日勉強しなくては!)

カート商品テーブル

会員がカートに入れた商品のデータを格納するためのテーブル。
カート機能を実現するためには、

  1. 誰がカートに商品を入れたのか
  2. どの商品をカートに入れたのか
  3. 商品を何個カートに入れたのか

上記3つの情報を保持する必要がある!
なので、

  • 会員_id(誰が)
  • 商品_id(何の商品を)
  • 個数(いくつカートに入れたのか)

というカラムを持たせている!
会員_idと商品_idは外部キー📝

商品テーブル

商品のデータを格納するためのテーブル。

今回の例では、商品の情報として

  • 名前
  • 商品の説明
  • 価格(税込)
  • 在庫数

を持たせている。
在庫数カラムがあることで、在庫数が0のとき、「カート内に追加するボタン」を非表示にすることができる!

商品の画像についてはActiveStorageを使用するため、画像の情報を格納するカラムは不要!!

注文テーブル

顧客の注文データを格納するためのテーブル。
「どんな商品を何個購入したのか」という情報は、注文詳細の方に持たせています。

なので注文テーブルには、

  • 会員_id
  • 名前
  • 郵便番号(宛先)
  • 都道府県(宛先)
  • 住所1(宛先)
  • 住所2(宛先)
  • 送料
  • 請求金額
  • 注文ステータス

というカラムを持たせている!

注文ステータスには

  • 入金待ち
  • 入金確認
  • 出荷済み
  • 配送中
  • 配達済み

のいずれかを指す状態。
これもenumを使って管理するためデータ型はintegerになる!

注文詳細テーブル

顧客が注文した商品のデータを格納するためのテーブル。
「どの注文において、どんな商品を何個購入したのか」という三つの情報を保持するために、

  • 注文 _id(どの注文において)
  • 商品_id(どの商品を)
  • 個数(何個購入したのか)
  • 価格

というカラムを持たせている。

ここで、なぜ価格というカラムがあるのかというと、、
顧客が注文を確定させた時点での、商品の値段を保持しておく必要があるから!!

商品の値段は、今後セール等で変動する恐れがある!
もしも、注文の履歴を表示する際、商品の値段に商品_idをもとに取得した商品価格を使ってしまった場合、商品の値段が変わるたびに、注文履歴の表示も変更されてしまう。
つまり、注文の請求金額 と 商品の値段×個数の合計値 + 送料 が合致しなくなってしまう、、!
注文履歴の値段に関する部分は永久的に変わってはいけない。そのため、注文された一つ一つの商品の値段は保持しておく必要がある。

アソシエーションについて

1.カート機能

会員がカート内に商品を入れるという行為は、会員と商品同士を紐づける と言い換えることができる。
この会員と商品の関係はN対Nとなる。

なぜN対Nなのか?
会員は0個以上の商品をカートに入れる可能性があり、
商品は0人以上の会員にカートに入れられる可能性があるから!

そこで、カート商品という中間テーブルを作成し、N対Nの関係を二つの1対Nに変換している!
カート機能は、いいね機能やフォロー機能にも似ている🙆🏻‍♀️

2. 注文機能

この注文機能も、カート機能とほぼ同じ!

注文機能とカート機能とで異なるのは、会員と注文が 1対N で結ばれているという点。
(顧客と注文が 1対N なのは、顧客が複数回注文を行う可能性があるから)

注文する際にどの商品を何個購入したのかという情報を保持するために 商品詳細テーブルを中間テーブルとして用意しました!(カート商品テーブルと役割は同じ)


なぜこのテーブルやカラムが必要なのか?を考えるのが大事!
経験を積んでいかないと難しいな〜🤔

みんなまだわからないことも多く手探り状態だから、少しでも早く進められるようにこれからはもっとちゃんと予習して取り組みたいと思った一日でした🌱

協力しあって頑張ろう🏋🏻

Discussion