商品マスタ設計を誤ると、運用・保守が重くなると思っている
小売業の業務システムで、最も頻繁に参照されるマスタが「商品マスタ」だ。初期設計のミスは、後々の運用・保守に深刻な影響を与える。特によくある設計ミスが「バーコードを主キーにすること」だ。
なぜそれが問題なのか、どう設計すべきかを整理したい。
バーコードを主キーにしてはいけない
小売業の現場では、商品の識別にバーコード(JAN/UPCコード、インストアコード)を使うことが多い。そのためシステム設計の初期段階で「バーコードを商品マスタの主キーにしよう」という発想になりやすい。
しかしこれは誤りだ。バーコードは「商品そのもの」ではなく、「運用上のラベル」に過ぎないからだ。
バーコードが変わる現場の実態
同一商品でも、バーコードが変わることは珍しくない。
- パッケージリニューアルに伴うJANコード変更
- 規格・内容量変更による新コード発行
- インストアコードの店舗間統一・再割当
- セルフレジ導入で独自コードが増加
- バーコードの印刷ミスによる再発行
バーコードが変わるたびに、主キーが変わることになる。これは外部キーを持つすべての関連テーブルに連鎖的な影響を与え、データの整合性が崩れるリスクを生む。
商品ID と コード を分離する設計
解決策はシンプルだ。「商品そのもの」を示す不変のIDと、「コード(バーコード等)」を別テーブルで管理する設計にすることだ。
| テーブル | 役割 | 変更頻度 |
|---|---|---|
| 商品マスタ | 商品の実体(ID・名称・カテゴリ等) | 低い(商品廃番以外は安定) |
| 商品コードマスタ | 商品に紐づくコード一覧(JAN・インストア等) | 高い(追加・変更が頻繁) |
このように分離すると、コードが変わっても商品マスタ側は変更不要になる。関連テーブルは商品IDで紐づけるため、コード変更の影響が商品コードマスタだけに留まる。
設計イメージ
商品マスタ(products):product_id(PK)/ 商品名 / カテゴリ / 単位
商品コードマスタ(product_codes):code_id(PK)/ product_id(FK)/ コード種別 / コード値 / 有効期間
1つの商品に対して複数のコードを持てるため、JANコードとインストアコードの両方を管理したり、コード変更の履歴を残したりすることも可能になる。
セルフレジ時代のコード増殖問題
近年、セルフレジの普及でこの問題がより深刻になっている。セルフレジ対応では、独自のインストアコードを新たに発行するケースが多い。
バーコードを主キーにした設計では、コードが増えるたびに商品マスタのレコードが増殖する。同じ商品なのに、JANコード版・インストアコード版・セルフレジ版と、複数のマスタレコードが存在するという状態になりやすい。
こうなると、「この商品の正しい在庫数はどれか」「どのレコードが最新の情報か」という整合性問題が常に発生するようになる。
集計・保守が重くなる理由
バーコード主キー設計の商品マスタで運用を続けると、以下のような保守負荷が積み上がっていく。
- コード変更のたびに、紐づく販売履歴・在庫データの整合確認が必要になる
- 「商品Aの年間売上」を集計するとき、複数コードのデータを合算する処理が必要になる
- 廃番商品のコードが別の商品に再利用されると、過去データとの混乱が起きる
- マスタのメンテナンス工数が増え続け、担当者の暗黙知に依存するようになる
設計時に問うべきこと
商品マスタを設計するとき、私は必ず「この商品の"同一性"をどこで判断するか」を問うようにしている。
パッケージが変わっても同じ商品か?内容量が変わったら別商品か?仕入先が変わっても同じ商品として扱うか?これらの業務上の判断が、テーブル設計の前提になる。
バーコードは「識別のための手段」であり、「商品の同一性の定義」ではない。この違いを意識することが、長く使えるマスタ設計への第一歩だと思っている。
まとめ
- バーコードは「商品そのもの」ではなく「運用上のラベル」——主キーにしてはいけない
- 商品マスタ(不変ID)と商品コードマスタ(可変コード群)を分離する設計が基本
- セルフレジ普及でコード増殖が起きやすくなっており、設計の影響がより大きくなっている
- コード変更が商品マスタ全体に波及しない構造にすることで、保守コストを抑えられる
- 「この商品の同一性をどこで判断するか」を設計前に業務側と合意しておくことが重要
Related Service
小売現場の商品管理・棚卸・在庫確認をモバイルで完結する「クラシス」。バーコードスキャンと正しいマスタ設計の組み合わせで、現場の混乱を防ぎます。