---
# System prepended metadata

title: 商品テーブル周りの正規化
tags: [Emostyle]

---

# 商品テーブル周りの正規化
###### 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. 既存の価格・在庫数の入力フィールドの移し替え
> 
を加える