ECサイトを模した様なアプリケーションを作っております。  
商品テーブルの正規化をしたいです。

現状以下のようなテーブル構成になっております。

```

    1 id
    2 商品名
    3 定価
    4 在庫数
    5 入荷日
    6 入荷数
    7 販売数
    
```

私の考えでは5,6においては入荷日や入荷数は複数回レコードの追加が予想されるトランザクションデータのため、別テーブルで管理すべきだと思っております。そうしないと商品名や定価などの重複が起こってしまいます。

一方4,7においてはレコードの値を更新するタイプであり、トランザクションデータではないのですが、変動するデータであるのでマスタデータからは切り離して管理すべきなのではないかと考えております。

ここまでの認識で何か間違っているところはありますか？

また4,7においてはそれぞれ別テーブルでの管理をすべきでしょうか？  
販売数が増えれば在庫数が減る、常に同時に操作されるような項目に感じますが、ただ感覚値になってしまいますがデータの毛色は違うような気がしております。

ご意見、アドバイス聞かせていただけますと幸いです。
CC BY-SA 4.0
2020-06-15T13:32:54.690
67693
2022-05-15T12:04:00.527
2020-06-15T16:27:40.730
3060
question
データベース設計
ECサイトのような商品テーブルの正規化について
私であれば、おっしゃる通り以下のようにテーブルを分割するかなと思います。

  * 商品テーブル（マスター）  
・商品ID  
・商品名  
・定価  
・登録日  
・更新日

  * 入荷テーブル  
・商品ID  
・入荷日  
・入荷数

  * 販売履歴テーブル  
・商品ID  
・販売日  
・販売数

在庫数をどこかの管理画面に表示させるようなイメージでしょうか？  
それであれば、在庫数は常にDBに持っておくのではなく、SQLで集計して表示してあげる感じだと思います。  
（商品IDごとの入荷数）-（商品IDごとの販売数）で商品IDごとの在庫数は計算できるかと。

一方であまりにもデータ量が多く、都度計算に時間がかかる場合は、Batchなどで1日1回、在庫用のテーブルを作成してあげればいいと思います。
CC BY-SA 4.0
2020-06-15T18:21:33.110
67696
2020-06-15T18:21:33.110
39751
67693
answer
「要件による」というのがまず大前提です。

１：例えば想定できる業務範囲は  
・認証認可（アカウントやログイン）モジュール  
・EC受注サブシステム  
・EC発送サブシステム  
・在庫倉庫サブシステム  
・売上概算・集計サブシステム  
・会計計上または別システムへの会計連携サブシステム  
などになります。  
このうち、どこからどこまでをそのシステムがカバーするのかはっきりさせてください。

２：EC受注サブシステムに絞っても、  
・汎用的で機能を絞ったECなのか、特定の業種用に特化したシステムなのか  
・ECサイトでキャンペーンやクーポンはどうするのか  
・商品検索はどのようにできる必要があり、商品カテゴリは1軸でよいのか  
などあります。  
これらも想定を決めましょう。

ここまで理解した前提で、「商品マスタ」として考えられるのは概ね2パターンだと思います。

・EC受注サブシステムなどにおける、実際にECサイトに表示されるものに対応する商品カタログマスタ。  
要件によっては、商品販売価格マスタ、商品セットマスタなどが別テーブルとして必要になる。

・在庫管理サブシステムのための商品マスタ。  
倉庫が複数個所ある場合、大抵はこちらも考える必要が出てくる。  
在庫マスタは倉庫ID、商品ID、数量、引き当て可能数などを持つ。  
数量、引き当て可能数などは、入庫テーブル、出庫テーブル、棚卸後の訂正テーブルと整合性が必要

なお、在庫マスタの場合は入庫/出庫とは別に数量を重複させて持たせることはありますが、  
（理論上は入庫出庫棚卸訂正等から在庫は逆算できるが、複数のテーブルを参照する必要があるため）  
EC受注側の商品カタログマスタでは販売数を持たせるのはあまり一般的ではないかと思います。  
（注文テーブルのみから集計可能なため。ただし当然要件やテーブル設計による。）

繰り返しになりますが、  
・どんな業種向けの  
・どこからどこまでのシステムをカバーする  
ECサイトを作るのか、想定をしましょう
CC BY-SA 4.0
2020-06-15T18:34:59.127
67697
2020-06-15T18:34:59.127
25396
67693
answer