• ベストアンサー

テーブルを分けるべきか

下記は中古PCの商品テーブルです。中古PCと、それぞれの状態を格納したいです。 ●テーブルを分ける ・商品 商品コード, 商品名, 単価 ------------------ 0001, ThinkPadX31, 21000 0002, ThinkPadX20, 25000 0003, ThinkPadX60, 78000 ・状態 商品コード, 枝番, 状態コード ------------------ 0001, 1, 002 0001, 2, 004 0003, 1, 001 ●正規化しない ・商品 商品コード, 商品名, 単価, 状態1, 状態2, 状態3 ------------------ 0001, ThinkPadX31, 21000, 002, 004, 000 0002, ThinkPadX20, 25000, 000, 000, 000 0003, ThinkPadX60, 38000, 001, 000, 000 ●マスタ ・状態マスタ 状態コード, 状態名 ------------------ 001, 汚れあり 002, ドット欠けあり 003, OSなし 004, 充電しない 分けない方しか作ったことがありません。分けた方がすっきりして良さそうな気がしますが、扱いにくそうです。 速度や追加、更新のし易さなど、メリットとデメリットはどんなものがあるのでしょうか。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

正規化しない方のデメリットは言うまでもありません。 ・状態が4つ以上持てない(この内容だと確実に3つじゃ足らなくなりますよ) ・状態コードでの検索がしづらい(状態1='001' OR 状態2='001' OR 状態3='001') ・状態コードでの集計がしづらい(UNIONしないと集計できない) また、更新もこちらの方がしづらいでしょう。 ・同じ状態コードを重複して登録しないようにしなくてはならない、またそのような制約をかけづらい ・未登録のフィールドを探して更新しなくてはならない ・状態コードのみの更新であっても、商品テーブルの行全体をロックしてしまう テーブルを分けると単純にJOINしただけでも状態の登録数だけ商品マスタが増幅されてしまって扱いづらいと思っておられるかもしれませんが、MAXを利用してグループ化すれば正規化しないイメージのレイアウトでデータは簡単に取得できます。JOINを書くのが面倒なら、ビューなりを作成しておけばいいでしょう。 結合により件数次第で検索速度は下がるかもしれません。しかし、正規化しない例では状態マスタを3個結合しないと状態名込の情報を一発で取ってこれません。だから実際には問題にはならないと思います。 以下はDBMS次第です。 ・ウィンドウ関数をサポートしているならば、状態コードに枝番そのものを設けないことも可能です。その方が登録処理が容易になります。 ・連鎖更新をサポートしていないならば、主キー(商品コード)を後で変更しなくてはならないようなデザインにはしないことです。

xdp33829
質問者

お礼

ご回答ありがとうございます。 Accessで入力フォームを作る時に正規化しない方が作りやすかったのでそっちでやりたくなってしまいました。でも仰るとおりエラーチェックが面倒ですね。 >MAXを利用してグループ化すれば正規化しないイメージのレイアウトでデータは簡単に取得できます。 そうなんです、一行でペタッと表示したかったんです。SQLでレイアウトは何とかなるんですね。 正規化する方でやってみようと思います。 ありがとうございました。

その他の回答 (1)

noname#157743
noname#157743
回答No.1

例示されているテーブルを見るとちょっと意味不明な部分があります。 まず、商品コードというのは「中古PC1台を識別するコード」なのか「同一の商品名の複数の中古PC、つまり中古PCの機種を識別するコード」なのかということです。 次に、単価というのが「同一機種の中古PCであれば全て同価格」なのか、「同一機種であっても1台ごとに違う」のかということです。 対象商品が中古PCということなので、中古PC1台ごとに異なる属性と同一機種であれば共通の属性があるはずです。そこを上手く整理しないとデータベースとしてきちんと機能しません。

xdp33829
質問者

お礼

ご回答ありがとうございます。 曖昧ですみません。中古なので全くの同一機種でも違うものです。主キーも書くべきでしたね;。商品テーブルと状態テーブルはトランザクションです。 ・主キー 商品:商品コード 状態:商品コード, 枝番 状態マスタ:状態コード