• 締切済み

アクセスのテーブルを分ける理由に関して質問です。

アクセスのテーブルを分ける理由に関して質問です。 現在参考書を利用してデータベースの勉強をしてます。 試行錯誤中で弱っています。 受注テーブル(受注コード、受注日、締切日、出荷日、顧客コード) 受注明細テーブル(受注コード、商品コード、数量) とテーブルが分かれている例題がありました。 テーブルを2つに分ける理由がよくわかりません。 もし1つのテーブル (受注コード、受注日、締切日、出荷日、顧客コード、商品コード、数量) などとまとめたら何か問題があるのでしょうか? どうぞよろしくお願いします。

みんなの回答

  • layy
  • ベストアンサー率23% (292/1222)
回答No.5

補足) システムの核となるテーブルは分ける 受注テーブル(受注コード、受注日、締切日、出荷日、顧客コード) 受注明細テーブル(受注コード、商品コード、数量) 入力用の1次的なテーブルは1つにする。 (受注コード、受注日、締切日、出荷日、顧客コード、商品コード、数量) という使い方はあります。 更新に必要な情報は1テーブルに格納し、個々のテーブルへはこの情報から更新させる。 別々で 更新用受注テーブル(受注コード、受注日、締切日、出荷日、顧客コード) を入力した2日後に 更新用受注明細テーブル(受注コード、商品コード、数量) を入力とすると同期がとれませんので (受注コード、受注日、締切日、出荷日、顧客コード、商品コード、数量) を一度に入力させるという意味です。 基本的には無駄のないよう正規化します。 テーブルというものなんでもかんでも分けるかというとそうでもないです。 用途によって、どういう構造にするかは変わります。

  • riveron77
  • ベストアンサー率48% (180/370)
回答No.4

顧客コードという項目があるので、顧客情報が入るテーブルがあると思いますが、いかがでしょうか? あるとしたら…どうして顧客情報を別テーブルに入れるのか。 受注ごとに顧客の名前や住所、電話番号を受注テーブルとかに入れるのは、入力者も、また処理的にも負担がありますよね。 でも顧客コードで紐付けられれば、入力者も処理的にも楽ですよね。 #2さんとかぶりますが、要するに「また住所を入力するのかョ…」といった面倒くささが解消されますよね、入力者も処理的にも。 また顧客コードで紐付けられれば、顧客の名前や住所を受注テーブルに入れる必要がないので、 データ量のエコにも。

route5866
質問者

お礼

顧客情報が確かに別であります。 そういった意味合いだったのですね! 大変勉強になりました。 ありがとうございます!

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

実業務に就くと分かるのですが、よくあるパターンは 一つの受注で複数の製品を出荷するというものです。 例えば、プリンタの注文を貰ったとして、予備のインクや 用紙も一緒に注文されることはよくありますね。 この場合は注文:明細が1:nになります。質問者さんの 設計だと、一つの注文で一つの商品しか管理できません。 しかし、受注本体と明細を分け、受注コードで紐付けする ことにより、1:nが実現できるのです。

route5866
質問者

お礼

実務というほどまだ勉強できていませんでしたので、 わかりやすい例をありがとうございます。 一つのテーブルでは色々制限や面倒が生じることがわかりました。 ありがとうございます!

  • root_16
  • ベストアンサー率32% (674/2096)
回答No.2

簡単に言うと、分けた方が楽で便利だからです。 例の場合、1つのテーブルだと、 商品1つごとに、受注コード、受注日、締切日、出荷日等を入力しないといけませんが、 分けておけば、 受注コード、受注日、締切日、出荷日、顧客コード は商品ごとに入力する必要がありません。 簡単なフォームを作って、 サブフォームを受注明細にしてみれば 実務的に良く分かると思います。

route5866
質問者

お礼

早々の回答をありがとうございます。 利便性を考えて作られていたのですね。 まだまだ実績が足らないのがよくわかりました。 ありがとうございます。

  • kotoby2003
  • ベストアンサー率15% (280/1755)
回答No.1

リレーショナルデータベース理論を勉強してください。 そうやってテーブルを分けたりすることを正規化と呼びます。 正規化について、ここで説明するには、無理があります。 ちなみに、上記の例ではなぜダメか。 ひとつの注文に対して複数商品があったとします。 テーブルをひとつにしていたとします。 出荷日を更新するときは、さて、どうなりますか?

route5866
質問者

お礼

そうそうのご返答ありがとうございます。 リレーショナルデータベース理論の勉強もしてみます! 正規化という言葉も参考書に出てきていましたが、それに関してももう少し勉強が必要なようです。 ありがとうございました。

関連するQ&A

  • オラクルのビューについて

    (顧客テーブル) 項目名 顧客コード、顧客名、顧客名カナ (商品テーブル) 項目名 商品コード、商品名、受注単価 (受注テーブル) 項目名 受注番号、顧客コード、受注年月日、納入予定年月日 (受注明細テーブル) 項目名 受注番号、商品コード、受注数量 を使って次のビューを作ります。 (商品別受注日計データ) 項目名  商品コード 商品名 受注単価 受注年月日 日計商品別受注数量  受注数量(受注明細テーブル)の合計 日計商品別受注金額  受注単価*日計商品別受注数量 このときに日計商品別受注金額を求めるには先に日計商品別受注数量を求めておかなければなりませんが、これを一つのSELECT文で行う事は可能でしょうか。 そのまま一つのSELECT文でやろうとするとGROUP BYでうまくいかないのですが、 やはり先に日計商品別受注数量を求めておかなければいけないのですか? どっちにしろやり方がわかりません。

  • ACCESS 受注数の集計について

    教えてほしいことがあります。 宜しくお願いします。 「受注履歴」というテーブルがありまして、このようなレイアウトになっています。 受注日   商品コード 受注数量 2009/11/01  95555    10 2009/11/22  95555    5 2009/12/01  95555    10 フィールドの受注日の形式は日付で商品コードはテキスト形式、数量は数値形式です。 そしてもう一つ以下のような「受注残」というテーブルがあり、上記テーブルの受注日からさか上った1ヶ月前の日と出荷できていない受注残数などのテーブルが以下のようにあります。 受注日の1ヶ月前の日   受注日   商品コード 受注残数 2009/10/02        2009/11/01  95555    3 2009/10/23        2010/11/22  95555    2 2010/11/02        2010/12/01  95555    4 この各レコードは受注した時に在庫がなかったため、出荷できなかった数量のリストなんです。(受注日の1ヶ月間の日というフィールドは、「受注日」-30日で追加したフィールドです。) そこで、受注日からさかのぼった1ヶ月間の受注数を調べたい、そして在庫計画の参考にしたいというのが目的なんです。 例えば2009/11/22に商品95555は5個受注していますが、 (テーブル受注履歴より) その日に出荷できなかった数量は2個でした。 (テーブル受注残より) そこで、この2009/11/22から以前の1ヶ月間にどれ位受注しているのか、これを出したいのです。これを[受注履歴]を見てみますと、2009/11/1に10個と2009/11/22の5個で合計15個となるのですが、この値を「受注残」のレコードの右側にでも表示できたら便利だなあと色々とクエリでやってはみたものの、ACCESS歴2ヶ月位の私は挫折・・。 書いていることが伝われば良いのですが。 どなたか良い方法をご存知でしたら教えていただきたく、お願いします。

  • ACCESS テーブルの結合

    お世話になります。 テーブルA(約20万レコード)、B(6レコード)があり、共通しているフィールドは以下の通りです。  ・受注日  ・製品コード  ・数量 AとBのテーブルの共通しているフィールドを条件無しで1つのテーブルとして見立てたいと思っておりますがうまくいきません。 SELECT A.製品コード, A.数量, A.受注日 FROM A UNION SELECT B.製品コード, B.数量, B.受注日 FROM B; 上記SQLでエラーにはならないのですが、レコード数が本来約20万レコードあるはずが、7万レコードしか抽出されません。 SELECT A.製品コード, A.数量, A.受注日 FROM A; と SELECT B.製品コード, B.数量, B.受注日 FROM B; をそれぞれ分けてやると、レコード数に問題ありません。。 どのようにすれば2つのテーブルを1つに結合できるのでしょうか。 ご教授の程、宜しくお願い致します。

  • Access メインフォームにすべてのテーブルを

    アクセス 超初心者です。 お恥ずかしいのですがまた 超初歩的なことで困っています。 テーブルが二つあり、 一つは 基本データテーブルで 顧客コード(主キー)- 社名ー住所 もう一つは 商品履歴で 顧客コード- 商品 - 数量 このような感じです。 で、顧客コードでリレーションシップを設定して メインフォームに顧客コード・社名・住所、 サブフォームで その顧客の 商品・数量を表示させているのですが 商品履歴テーブルにデータが無い顧客データは メインフォームに表示されませんよね? どうしたら全件表示されるようになりますか?

  • 集計結果を別テーブルに更新クエリで書き出したい。

    Access2000を使っています。 テーブルとフィールドの関係は次のようになっています。 (一部、Northwind.mdbを使っています。) 受注 ---------------------- 得意先コード 受注コード 受注明細 ---------------------- 受注コード 単価 数量 売上集計 ---------------------- 得意先コード 合計 受注明細テーブルの単価と数量を掛け合わせたものの合計を 売上集計テーブルの合計に書き出したいと思います。 次の選択クエリの合計の値を売上集計テーブルの取引先コード の一致する場所に書き出したいのです。 SELECT 受注.得意先コード, Sum([単価]*[数量]) AS 合計 FROM 受注 INNER JOIN 受注明細 ON 受注.受注コード = 受注明細.受注コード GROUP BY 受注.得意先コード; 売上集計テーブルと受注テーブルの得意先コードは同じものが 存在します。 よろしくお願いします。

  • Access、同じテーブルの2つの項目対他のテーブルで1つの項目のリレーションは可能?

    Accessで販売管理をしています。 以下のテーブルを作成し(*は主キーです)、 [売上T]  [商品M]  [顧客M]  [受注T] *売上NO  *商品ID  *顧客ID1  *受注NO 商品ID   商品名    *顧客ID2  商品ID 日付    顧客ID1     顧客名    受注日 金額    顧客ID2            受注金額        受注先1        受注先2 参照整合性にチェックを入れリレーションでつないでいます。 リレーションシップは下記のとおりです。 [売上T]商品ID―[商品M]商品ID―[受注T]商品ID [商品M]顧客ID1及び2―[顧客M]顧客ID1及び2―[商品M]受注先1及び2 ここで顧客と受注先が重複することもあるので、顧客Mから顧客ID及び受注先IDの2つのテーブルにリレーションシップを設定しているのですが、 クエリで  [受注T]受注NO及び受注金額、[顧客M]顧客名で抽出したところ、 5000件以上[受注T]にデータがあるはずのものが、1200件ほどしか抽出できませんでした。 ちなみに[顧客M]と[受注用顧客M]というまったく別のテーブルを作成し、 [商品M]受注先1及び2―[受注用顧客M]顧客ID1及び2 とリレーションを作成し、クエリで抽出するとうまくいきました。 しかしこの方法だと、[顧客M]と[受注用顧客M]という2つのテーブルを管理しなければならなくなるので面倒です。 そこで質問です。 同じテーブルの2つの項目対他のテーブルの1つの項目とでは、うまくリレーションが設定できないのでしょうか。 もし出来ない場合、[顧客M]と[受注用顧客M]の2つのテーブルを管理しなければならない訳ですが、 なんとか簡単に管理できる方法(ひとつのテーブルを変更すると簡単にもうひとつが変更できる設定)はないでしょうか。 非常にわかりにくく長い文章で申し訳ありません。 VBA等はさっぱりわかりませんので、普通の設定の範囲内で、できるかどうかよろしくお願いします。

  • Accessの操作について質問です。

    Access2002をつかっています。 登録コード,商品コード,数量(1),原価・・・と並んだテーブル1と 商品ジャンルコード,商品コード,商品名,原価,数量・・と並んだテーブル2があります。 テーブル2からテーブル1にある商品コードと同じものを抜き出したいと思います。 商品ジャンルコード(テーブル2),商品コード(テーブル1にありテーブル2にもある商品コード),商品名(テーブル2),原価(テーブル2),数量(テーブル1と同数),・・ というデータを新たに作りたいです。 データ1の特徴 ・登録コードが違い、他の列は全て同じの行がある。 ・数量は全て1 データ2の特徴 ・数量は1以外が多い ・原価、数量が違い、他の列は全て同じ行がある。 例えば、テーブル1にある商品コードAという商品はテーブル1では数量1で計10行あり、 テーブル2には数量6と数量4と数量3で3行になっているという形です。 テーブル2からテーブル1の数量10を抜き取ったデータを作りたいです。10はテーブル2の計13のどの行からとってもいいです。 わかりづらくて申し訳ございませんが、わかる方いらっしゃいましたらお願いします。

  • Accessで複数テーブルのJoin

    次のようなテーブル(T1~T4)とクエリ(Q1~Q2)があります。 クエリの表で囲っているものはAccessのQBEを表しています。 その下はAccessが自動生成したSQLです。 Accessがある場合はいいのですが、ない場合、いきなりSQLを 書かないといけないわけですが、どのような順番に並べていって いいのか整理がつきません。 4つ以上になるとさっぱりです。 何かヒントをいただけませんでしょうか? T1:売上表[売上No、日付、顧客CD] T2:顧客表[顧客CD、顧客名] T3:売上明細[ID、売上No、連番、商品CD、数量] T4:商品表[商品CD、商品名、単価] Q1: ┌────────────────┐ │日付 │ 商品名│単価 │数量 │ ├────────────────│ │売上表│商品表│商品表│売上明細│ └────────────────┘ SELECT 売上表.日付, 商品表.商品名, 商品表.単価, 売上明細.数量 FROM 商品表 INNER JOIN (売上表 INNER JOIN 売上明細 ON 売上表.売上No = 売上明細.売上No) ON 商品表.商品CD = 売上明細.商品CD; Q2: ┌────────────────────┐ │日付 │ 顧客名│商品名│単価 │数量 │ ├────────────────────│ │売上表│顧客表│商品表│商品表│売上明細│ └────────────────────┘ SELECT 売上表.日付, 顧客表.顧客名, 商品表.商品名, 商品表.単価, 売上明細.数量 FROM (商品表 INNER JOIN (売上表 INNER JOIN 売上明細 ON 売上表.売上No = 売上明細.売上No) ON 商品表.商品CD = 売上明細.商品CD) INNER JOIN 顧客表 ON 売上表.顧客CD = 顧客表.顧客CD;

  • データベースの正規化について質問です><

    データベースの正規化について質問です><教えて下さい。 伝票を正規化していく問題なのですが、 受注番号 受注日 得意先コード 得意先名 得意先住所 {商品コード 商品名 販売単価 受注数量 受注金額} {}は繰り返しを表します。 これをまず自分で第一正規化してみて//*は主キーを表す。 *受注番号 受注日 得意先コード 得意先名 得意先住所 *商品コード 商品名 販売単価 受注数量 受注金額 になり次に第二正規化してみて *受注番号 受注日 得意先コード 得意先名 得意先住所 *商品コード 商品名 販売単価 *受注番号 *商品コード 受注数量 受注金額 になり最後に第三正規化をして *受注番号 受注日 得意先コード *得意先コード 得意先名 得意先住所 *商品コード 商品名 *商品名 販売単価 //ココです。 *受注番号 *商品コード 受注数量 受注金額 となったのですが模範解答には//ココです。の部分がなく、*商品コード 商品名 販売単価 これのままで終わっていました。 自分が間違えているのでしょうか??もし間違えているなら理由を教えて下さい。長くてすいません

  • アクセス2003 について

    「台帳テーブル」に、商品のコード、数量、顧客名などを表示するようにしています。 そこに「商品リストテーブル」内の商品の名称を加えたいのですが、どうやっても 表示することができません。 ご教授よろしくお願いします。