下記は中古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, 充電しない
分けない方しか作ったことがありません。分けた方がすっきりして良さそうな気がしますが、扱いにくそうです。
速度や追加、更新のし易さなど、メリットとデメリットはどんなものがあるのでしょうか。
宜しくお願い致します。
No.2ベストアンサー
- 回答日時:
正規化しない方のデメリットは言うまでもありません。
・状態が4つ以上持てない(この内容だと確実に3つじゃ足らなくなりますよ)
・状態コードでの検索がしづらい(状態1='001' OR 状態2='001' OR 状態3='001')
・状態コードでの集計がしづらい(UNIONしないと集計できない)
また、更新もこちらの方がしづらいでしょう。
・同じ状態コードを重複して登録しないようにしなくてはならない、またそのような制約をかけづらい
・未登録のフィールドを探して更新しなくてはならない
・状態コードのみの更新であっても、商品テーブルの行全体をロックしてしまう
テーブルを分けると単純にJOINしただけでも状態の登録数だけ商品マスタが増幅されてしまって扱いづらいと思っておられるかもしれませんが、MAXを利用してグループ化すれば正規化しないイメージのレイアウトでデータは簡単に取得できます。JOINを書くのが面倒なら、ビューなりを作成しておけばいいでしょう。
結合により件数次第で検索速度は下がるかもしれません。しかし、正規化しない例では状態マスタを3個結合しないと状態名込の情報を一発で取ってこれません。だから実際には問題にはならないと思います。
以下はDBMS次第です。
・ウィンドウ関数をサポートしているならば、状態コードに枝番そのものを設けないことも可能です。その方が登録処理が容易になります。
・連鎖更新をサポートしていないならば、主キー(商品コード)を後で変更しなくてはならないようなデザインにはしないことです。
ご回答ありがとうございます。
Accessで入力フォームを作る時に正規化しない方が作りやすかったのでそっちでやりたくなってしまいました。でも仰るとおりエラーチェックが面倒ですね。
>MAXを利用してグループ化すれば正規化しないイメージのレイアウトでデータは簡単に取得できます。
そうなんです、一行でペタッと表示したかったんです。SQLでレイアウトは何とかなるんですね。
正規化する方でやってみようと思います。
ありがとうございました。
No.1
- 回答日時:
例示されているテーブルを見るとちょっと意味不明な部分があります。
まず、商品コードというのは「中古PC1台を識別するコード」なのか「同一の商品名の複数の中古PC、つまり中古PCの機種を識別するコード」なのかということです。
次に、単価というのが「同一機種の中古PCであれば全て同価格」なのか、「同一機種であっても1台ごとに違う」のかということです。
対象商品が中古PCということなので、中古PC1台ごとに異なる属性と同一機種であれば共通の属性があるはずです。そこを上手く整理しないとデータベースとしてきちんと機能しません。
ご回答ありがとうございます。
曖昧ですみません。中古なので全くの同一機種でも違うものです。主キーも書くべきでしたね;。商品テーブルと状態テーブルはトランザクションです。
・主キー
商品:商品コード
状態:商品コード, 枝番
状態マスタ:状態コード
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- Excel(エクセル) VBA でvlookup エラーなどは削除したい 8 2022/12/30 04:03
- その他(ネットショッピング・通販・ECサイト) 通販商品のふたがのりづけされていない。 通販で、ある商品を購入しました。美容化粧品の類です。 商品の 1 2022/09/22 19:30
- 日用品・生活雑貨 近所の自販機。 3 2022/08/14 16:34
- 車検・修理・メンテナンス USBポート、ヘッドライト点灯と連動するのは? 2 2022/11/13 20:02
- 郵便・宅配 佐川急便に営業所止めをしてもらう場合は、佐川急便で荷物の状態が検索できるようになってから電話した方が 3 2023/02/19 14:28
- その他(データベース) c言語の問題です。これを踏まえてコーディングしたいのでおしえていただきたいです。 3 2023/08/03 09:27
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- Excel(エクセル) ある文字を含む際に、値を返す数式についてです 5 2022/08/28 16:58
- アルバイト・パート 段ボール開封 3 2022/12/10 13:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「マスタ」と「テーブル」の違...
-
2つのテーブルから条件に一致...
-
重複するキーから一番古い年月...
-
主キーの変更
-
アクセス2000のフォームに...
-
3つのテーブルから条件に一致し...
-
ACCESS 一つのフィールドに複...
-
[Oracle] UPDATE分の副問い合わ...
-
insertの高速化?
-
Access2002 2つのテーブルのマ...
-
行方向のデータを横に並べる
-
ACCESS インポート時の重複チ...
-
accessで移動平均する方法
-
ビューで引数を使いたい
-
accessのロック
-
Access VBA [リモートサーバー...
-
SELECT時の行ロックの必要性に...
-
accessテーブル作成クエリを実...
-
SI Object Browserのテーブルス...
-
Accessのリンクテーブルについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「マスタ」と「テーブル」の違...
-
2つのテーブルから条件に一致...
-
重複するキーから一番古い年月...
-
ACCESS 一つのフィールドに複...
-
PLSQLの識別子エラー
-
主キーの変更
-
Accessでフィールドを比較した...
-
SQL 2つのテーブルとSUBSTRING...
-
続.ORACLEのSELECTのソートに...
-
行方向のデータを横に並べる
-
下記のsqlで取得されるレコード...
-
VIEWでテーブルの集計結果...
-
update文で質問です。 下記の条...
-
[Oracle] UPDATE分の副問い合わ...
-
自分自身への矢印
-
片方だけ抽出する方法(SQL)
-
Accessユニオンクエリーで2つ...
-
連番のMin, Maxを取得したい
-
Inner join と Left joinの明...
-
日付の最大値を検索条件にする方法
おすすめ情報