• ベストアンサー

テーブルを分けるべきか

下記は中古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
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ACCESS2000のテーブル構造

    ACCESS2000のテーブルの作り方について質問します。 伝票フォームを作り「取引先コード」「商品区分コード」「商品コード」3項目を入力したら単価が表示されるようにしたいのですが、うまくいきません。 (同じ商品でも取引先により単価が違うので、3つの情報がそろったときにはこの単価になるという形にしたいのです) 現状は「商品区分テーブルの区分コード」と「商品マスターテーブルの区分コード」  「商品マスターテーブルの商品コード」と「単価テーブルの商品コード」をそれぞれ1対多リレーションし、 そして「単価テーブルの単価コード.商品コード取引先コード,単価」で選択クエリを作り、それを伝票のサブフォームにしてみたのですが、商品コードが入力できませんでした・・・ 何冊か本を参考にして作ってみたのですがうまく出来ませんでした お分かりになる方がいらっしゃいましたら教えてくださいよろしくお願いいたします。

  • Access2010 レポートについて

    商品というテーブルと商品マスターというテーブルがあります。 商品テーブルに入力した商品コードをもとに、商品マスターから直接レポート上に単価の項目を呼び出したいのですが、どうすれば良いのですか? (両テーブルの商品コードが一致した場合、マスターテーブルの単価の項目を呼び出す) クエリで必要な項目を表示させ、レポートにするしか方法はないのでしょうか? 【商品テーブル】 商品コード   商品名      個数  123     りんご        10  456     みかん       20  789     バナナ       30 【商品マスター】 商品コード   商品名      単価  123     りんご       100  456     みかん       200  789     バナナ       300 【レポート】※商品テーブルをもとに 123   個数    単価 りんご    10    100 ←商品マスターから直接表示したい

  • Access2010 レポートについて

    商品というテーブルと商品マスターというテーブルがあります。 商品テーブルに入力した商品コードをもとに、商品マスターから直接レポート上に単価の項目を呼び出したいのですが、どうすれば良いのですか? (両テーブルの商品コードが一致した場合、マスターテーブルの単価の項目を呼び出す) クエリで必要な項目を表示させ、レポートにするしか方法はないのでしょうか? 【商品テーブル】 商品コード   商品名      個数  123      りんご        10  456      みかん       20  789      バナナ       30 【商品マスター】 商品コード   商品名      単価  123      りんご       100  456      みかん       200  789      バナナ       300 【レポート】※商品テーブルをもとに 123    個数    単価 りんご    10     100 ←商品マスターから直接表示したい

  • アクセス2003 テーブルについて

    昨日も別の質問でお世話になりました。 回答いただいたやり方で作業を進めているのですが、もうひとつ伺いたいことが出来ましたので、新たに質問させて頂きます。 会社の商品データを作っているんですが、下記のようなことは出来るんでしょうか? <商品マスター> ID 商品名 商品説明 備考 <仕入記録> ID (商品マスターとリンク) 商品名  仕入数量 仕入単価 この二つのテーブルを作り、<仕入記録>のIDに入力した時点で<仕入記録>の商品名に<商品マスター>の該当する商品名が自動で入るようにしたいのですが。 これは可能でしょうか?

  • マスタテーブルの変更履歴について

    データベースについて質問させていただきます。 例えば、飲食店で発行されるレシートには以下が記載されています。 ・店舗名、電話番号、担当者名 ・購入した商品名、値段、会計 これらを後に会社の業務で画面にレシートのような情報を表示したり、データの分析に使う場合、データベースを作成すると思います。 そのデータベースとしては、 以下のようなものが必要だと、私は考えました。 ・店舗テーブル…属性:店舗コード、店名、電話番号、住所など ・従業員テーブル…属性:従業員ID、名前、所属の店舗コード ・顧客テーブル…顧客ID、顧客名、住所、電話番号 ・商品テーブル…属性:商品ID、商品名、単価 ・売上履歴テーブル…属性:購入履歴ID、商品ID、個数、購入日時、顧客ID、購入した店舗コード、従業員ID これらを踏まえて、以下の質問をさせていただきます。 ・マスタの更新や別途、変更履歴テーブルが必要なのか…商品テーブルは日々属性の情報が変更されると思います。例えば、不況によって、単価が変わるなど。これをマスタテーブルの単価だけ変更する対応だとすると、購入履歴テーブルは商品テーブルを利用するので、単価の変更前に購入した履歴も値段が変更されてしまいます。この対応策として、別途、商品マスタの履歴テーブルを作って購入日時などを元に正しい単価を判断するような感じで対応すると良いのでしょうか? ・テーブルの作成や検索の都度、毎回結合するのか…例えば、Aさんの購入履歴を画面に表示する場合、画面にAさんの名前を入力して検索ボタンを押すと、購入履歴テーブルから必要なレコードを取り出して、Aさんの購入履歴を画面に表示するイメージをしています。この際、購入履歴テーブルは、商品IDを元に商品テーブルと結合したり、他には顧客テーブルと従業員テーブルとも結合する必要があります。検索をする際は、毎回テーブル結合を行うのでしょうか?それならば、見にくいイメージがありますが、購入履歴テーブルの顧客IDを名前にしておいたり、従業員IDを従業員の名前にしておくと、テーブルの結合が必要なくて良いのではないでしょうか? 大変文章が長く、また、読みにくいもので申し訳ございません。 たくさんの回答、よろしくお願いいたします。

  • 細かく商品を管理できるテーブルとは

    商品情報を格納しているテーブルがあります。 現在の商品マスタのフィールド構成は以下の通りです。 ・商品コード ・商品名 ・カテゴリ ・備考 ・削除フラグ ・作成日 ・作成者 ・更新日 ・更新者 ※カテゴリは商品毎をまとめる為に付けています。  例えば「衣服」とか「小物」などです。 今までは1社のみの商品を管理をしていましたがもう1社増える事になったので新しく商品テーブルを作成する事になり、どうか皆さんのお知恵を借りたいと思い投稿しました。。 これからは1社のみで扱っている商品や共通(2社)で扱っている商品など、さまざまです。 なので細かく商品を管理できるようなテーブルを作成したいと思っています。 些細な事でも何でも構いませんのでアドバイスいただけたら嬉しいです。 宜しくお願いします。

  • テーブルデータの並び替えについて。

    テーブルデータの並び替えについて。 環境:ACCESS2000 状況:テーブル2つ(マスターテーブル、マスターコピー)    メインフォーム上にサブフォームを置き、マスターコピーのデータを    表示させているのですが、そこで並び替えをする予定。    マスターテーブルのフィールド     種類  /  サイズ  /  商品名    ※マスターコピーも同様(マスターテーブルを全てコピーのため) 現在のコード: Dim db As Database Set db = CurrentDb db.Execute "DELETE * FROM マスターコピー" db.Execute "INSERT INTO マスターコピー SELECT * FROM マスターテーブル" SELECT 種類, サイズ, 商品名 FROM マスターコピー ORDER BY 種類, サイズ ←ここでエラー エラー内容・・・構文エラー まだACCESS未熟のため完全には理解できておらず ネット検索等で調べてコードを組んでいるため 何が間違っているのかわからず、ご質問させて頂きました。 お手数お掛けしますが、何卒ご教授の程宜しくお願い致します。

  • マスタテーブル使用時のデータテーブル設計について

    皆様こんにちは、失礼致します。 現在、ASP.NET+SQLServerで業務用帳票アプリの開発を行っています。 DBを使用した開発は初めてで、テーブルの設計手法について 経験者様のご指導を頂きたく、宜しくお願い致します。 まず、マスタテーブルは以下とします。 【顧客マスタテーブル】 ・顧客マスタID ・顧客名 ・顧客名(英語名) 帳票データ入力画面で、顧客マスタ検索ボタンから別画面を起動し、 そこで選択した顧客名を帳票データ入力画面に反映させます。 そして、帳票データ入力画面のデータをデータテーブルへ格納する のですが、その際には顧客名そのものか、マスタIDのどちらを 格納するのが好ましいのでしょうか? 要件としては以下を満たす必要があります。 1.帳票データ入力画面で格納したデータは   別の帳票データ入力画面でも使い回す。 2.帳票印刷時にのみ、顧客名を対応する顧客名(英語名)で   出力する。 3.データテーブルに格納されたデータは後々参照して使い回す。 顧客名で格納しておけば使い回しは楽ですが、2.のケースで 顧客名から顧客名(英語名)をselectした場合に、顧客名は一意でも 顧客名(英語名)が一意ではなかった場合に問題が起きます。 マスタIDで格納しておけば、対応する顧客名(英語名)は検索 できますが、マスタを修正した場合には3.で過去データを 参照する時に修正後のマスタ情報が表示されてしまいます。 結論としましては、両方とも格納しておくのが好ましいのでは、 と考えておりますが、メンテナンス性の観点から、データテーブルの カラム数はできるだけ少なくしたいとも考えております。 周囲に経験者がいなくて困っております。 ご指導頂けますと幸いです。 以上、宜しくお願い致します。

  • ACCESS2000で質問ですが(初心者です)

    グループ(コード、グループ名など) 商品のマスター(コード、単価など) のマスターを作成して 入力マスターとリレーションシップで結び付けました。 商品のコードが決まっていて単価が固定でないものが 混在しているときに 単価部分をスペースでマスターに登録したのですが 入力するときにコードで単価を手で入力しようと すると指定した項目はリストにありませんとなってしまいました。入力で変更することはできないのでしょうか・・? わかりにくいかもしれませんがよろしくお願いします。

  • エクセルからSQLサーバをアクセス

    OS:Win2000,Office2000,SQLサーバ2000という環境で、エクセルとSQLサーバの連携をしたいと思っています。 SQLサーバ内に商品コード、商品名、単価と格納されていたとして、エクセル上でセルのA列に商品コードを入れると、SQLサーバの商品マスタを検索して、B列に商品名、C列に単価を表示させる、といった事は可能なのでしょうか? 宜しくお願い致します。