# 商品テーブル周りの正規化 ###### tags: `Emostyle` #### はじめに 昨日石塚(tanp.jp のエンジニア)から商品周りのテーブル構造を聞いたのでそれを参考に今回のテーブル設計の見直しを行いました。 #### 現在の問題点 Productsテーブルに在庫数と価格のカラムが存在している→ SKU管理がほぼ不可能 ER図を出力したところProductsテーブルが神テーブルと化してた(どのテーブルともリレーションが作成されている状態) => このまま拡張するとスケーラビリティに支障が出そう #### SKUで管理すべきもの・すべきでないもの `管理すべきもの` 在庫数、価格、サムネ画像 (将来的に発送元のIDは加わる可能性あり) `管理すべきでないもの` maker_id、商品の紹介文、親カテゴリID、商品タイトル、ロット数、掲載申請ステータス、おすすめステータス ![](https://i.imgur.com/s5l3D0f.png) この画像で言うと 「色」と言うのがoptionでREDと言うのがunitsだそうです。 #### 解決策 Unitsテーブル(SKUテーブル)を作成する Unitsテーブル: SKU管理のためのテーブル。購入した時に在庫数・価格を参照するのはこのテーブル |id|(product_id)|name_for_user|name_for_admin|image|stock|price_without_tax|wholesale_price_without_tax|client_id|maker_id| |---|---|---|---|---|---|---|---|---|---| |1|(1)|赤|テスト(色: 赤)|画像URL|100|1200|1500|1|2| |2|(1)|黄|テスト(色: 黄)|画像URL|120|1200|1500|1|2| Optionsテーブル: 商品がどのオプションを持っているかを管理するテーブル(色・サイズ・メッセージetc...) typeと言うのが何を意味しているのかわかりませんでした。。。 |id|type|name|product_id|message| |----|---|---|---|----| |1|hogehoge|色|1|この商品は色でSKU管理します。| options-unitsテーブル: unitとoptionは多対多の関係なので中間テーブルを作成する。 |id|option_id|unit_id|deleted_at| |---|---|---|---| |1|1|1|2019.07.19 00.00.00| #### 今回の変更で変更されるロジック - [ ] カートに商品を追加する時product_idを参照していたのが ``` session[:cart].push({ product_id: order.product_id, order_number: order.order_number, maker_id: maker_id }) ``` から ``` session[:cart].push({ product_id: order.product_id, order_number: order.order_number, maker_id: maker_id, unit_id: order.unit_id }) ``` みたいな感じ?でunit_idもカートに追加してやる必要がある。 あと在庫数の管理・価格の計算時には今までProductsテーブルを参照してたのがUnitsテーブルを参照するように変更を加える必要がある。 - [ ] 決済時の在庫のチェックのロジックと価格計算のロジック、に多大な変更が。。。 - [ ] 出品画面に > 1. optionsの入力フィールド(色・サイズ・イニシャル?) > 2. もし出来ればSKU商品ごとの画像のアップロード機能 > 3. 既存の価格・在庫数の入力フィールドの移し替え > を加える