質問: ### jan テーブル | id(int) | item_id(int) | client_id(int) | jan(varchar) | price(int) | rate(int) | | --- | --- | --- | --- | --- | --- | | 1 | 1 | 1 | 1234567890 | 100 | 60 | item_idからjanやprice, rateを取得するような形になっていましたが、 新たに品番(product_number)からも取得できるようにする必要が出てきました。 そこで以下のようにテーブルを変更してitem_idで取得する場合とproduct_numberで取得する場合を切り分け用としているのですが、とてもいい案とは思えません。 もし良い方法があれば教えていただけると助かります。よろしくお願いします。 ### 検討している変更 | id(int) | item_id(int) | client_id(int) | jan(varchar) | price(int) | rate(int) | product_number(varchar) | | --- | --- | --- | --- | --- | --- | --- | | 1 | 0もしくはnull | 1 | 1234567890 | 100 | 60 | ABC-0001 | ### 経緯 itemテーブルとproductテーブルが存在していて、itemテーブルは商品のカテゴリーのような役割になっています。 もともとproductの種類数が多い為、janコードをすべてitem(カテゴリー)毎に統一しているという珍しい管理方法をしています。なのでproduct毎にjanを設定していませんでした。 そして今回必要な場合はproduct毎にもjanを設定しなければならなくなったという状況です。 #### itemテーブル | id(int) | name(varchar) | | --- | --- | | 1 | アイテム1 | #### productテーブル | id(int) | name(varchar) | item_id(int) | product_number(varchar) | | --- | --- | --- | --- | | 1 | 商品1 | 1 | ABC-001 | #### 追記 #### clientテーブル 取引先ごとにJANが違う場合があるのでJANテーブルが必要でした。 | id(int) | name(varchar) | | --- | --- | | 1 | 取引先1 |
回答: item_idとproduct_numberの相関関係による * item_idおよびproduct_numberの両方がすべてのitemにユニークに付加されている場合 →正規化のしようもないので、それぞれ別にカラムを持てばいい →ただしテーブルに二重にユニーク制限をかけるのでどちらか一つにして運用でカバーするのもありかも * item_idもしくはproduct_numberのいずれか片方がユニークで全てに付加され、もう片方はユニークではないか抜けがある場合 →ユニークな方を軸に正規化すればよい * item_idおよびproduct_numberの両方とも、ユニークでもなければ全てに付加されるわけでもない →idを元に両方ともバラバラに正規化する