• ベストアンサー

Access DB リレーションシップ

部品番号、名称、金額が格納されたテーブルがあります。レコードは10,000程度です。 これを各機種(約200)がここに異なった部品を使った「部品名称」テーブルなるものを作成しようとしてます。例えば機種Aは30程度の部品を使い、機種Bは機種Aと異なる部品30を使うことになります。 このような場合、リレーションはどのようにすればいいのでしょうか? 目的は、部品番号は一元管理できるように1テーブルで収め、機種テーブルは個々に修正ができるように分散したいと考えています。 よろしくお願いいたします。 Access 2000を使用しています。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.1

> このような場合、リレーションはどのようにすればいいのでしょうか? まず、テーブルですが、3つ用意することになります:  1)部品を一元管理する『部品名称』テーブル   (「部品番号」が主キー)  2)機種を一元管理する『機種名称』(仮名)テーブル   (「機種番号」が主キー)  3)各機種で使用する部品とその数などを記録する『構成一覧』テーブル   (1機種内で同部品を複数使用する場合に、『数量』フィールドのみで   対応できるなら「機種番号」と「部品番号」の2フィールドで主キーに、   「1機種が複数ユニットから構成される」等の理由により同機種内でも   部品番号が重複するなら、別に通し番号を設定するなどして、そちらを   主キーに、それぞれ設定)   ※このテーブルには、『機種名』や『部品名』は記録しません(念のため)。 その上で、リレーションシップは以下のように設定します:  a)『機種名称』の『機種番号』(1)-(多)『構成一覧』の『機種番号』  b)『構成一覧』の『部品番号』(多)-(1)『部品名称』の『部品番号』 こうすることで、  1)部品メーカー等による部品自体の変更は『部品名称』で、  2)自社製機種の名称変更などは『機種名称』で、  3)自社製機種の設計変更(一部部品の置き換え等)は『構成一覧』で、 それぞれ対処すればよい、ということになります。 このあたりの考え方については、もしも余裕があるようでしたら、「正規化」と いうものを調べてみることをお勧めします。 参考までに、以前以下のQ&AのNo.6で提示したURLを再掲しておきます: http://okwave.jp/qa/q6153112.html テーブルの『正規化』: http://www.annyys.net/html/kihon_002.htm http://www.atmarkit.co.jp/fdb/rensai/db_enginer03/db_enginer03_1.html

関連するQ&A

  • Accessのリレーションシップ

    Access初心者です。 Access2010でデータベースを作っていて、行き詰ってしまいました。 テーブル1にフィールドABCDEFがあって、Aに主キーが付いています。(Aはテキスト型でフィールドサイズ10です。) テーブル2にはフィールドAGHがあり、Aに主キーが付いてます。(Aはテーブル1と同じです。) テーブル3にも同じくフィールドAIJがあり、Aに主キーが付いています。(Aはテーブル1と同じです。) テーブル1のフィールドAを主テーブルとし、テーブル2・3のフィールドAにリレーションを組んでいます。 この時のリレーションシップで参照整合性と連鎖更新と連鎖削除にチェックを入れ、種類が一対一になりました。 その後、テーブル1でレコードを追加しようとすると、「テーブル'2'にリレーションシップが設定されたレコードが必要なので、レコードの追加や変更を行うことができません。」と出ます。 これを解決する方法はどうするのか、お教えお願いします。 分かりにくい説明ですいません。

  • ACCESSのリレーションシップについての疑問

    ACCESS初心者です。 ACCESS2002 OSはWindowsXP SP2です。 基本が分かっていないせいなのかもしれませんが、私には理解できない現象が起こっています。対応方法があれば教えていただくようお願いします。 ACCESSでデータ更新のフォームを作っています。 そのフォームは2・3日前に作ったもので、たとえばテーブルAを更新するためにマスターテーブルのBとCを参照しているような形になっています。このリレーションはクエリで指定してあります。 このフォームではクエリに対して更新する形になっています。 このフォームのデザインを編集しているときに「ツール」の「リレーションシップ」をクリックすると画面にはBとCだけが表示されます。 なぜメインのテーブルのAが表示されないのか?と思いながら、しょうがないので右クリックして「すべてのリレーションシップの表示」を押すと、驚いたことにDのテーブルが表示されました。 実はこのDというテーブルは以前に作ったAを作る前に使っていたAによく似たテーブルなのです。 当然、以前にはDとB・Cのリレーションも作っていましたが、今編集中のフォームではDは関係ありません。 リレーションシップの画面は不必要に広大なもので横に3スクロール分と縦にも5スクロール分くらいあって、その右下の端っこにD・B・Cのリレーションだけが表示されていて、それ以外はただただスペースがあるだけです。 なぜ肝心のA・B・Cのリレーションが表示されずD・B・Cのリレーションが表示されるのでしょう? 試しに今では不要であるDのテーブルを削除してみましたがリレーションシップではさすがにDは消えたもののB・Cが表示されるだけで、Aは出てきません。 そもそもACCESSにおけるリレーションシップというのは個々のフォーム内で定義されるものではないのですね?(根本的なことで申し訳ないのですが、買った2冊の本を見てもインターネットで探してもその辺の説明が見当たりませんでした) SQLであれば個々のSQL文で都度JOIN等の記述をすると思うのですが、ACCESSではデータベース全体の共通事項(?)としての定義になるのでしょうか? ACCESSは初心者で見当はずれな質問かもしれませんがどうかよろしくお願いします。

  • Access2003で

    Access2003で AテーブルとBテーブルがあります。 両テーブルにも、NOフィールドがあります。 両テーブルとも1からの数字を付与しています。 NOフィールドの他に名称などのフィールドがあります。 ここでお聞きしたいのですが、BテーブルのNOフィールドの2のレコードを、 AテーブルのNOフィールドの2のレコードに上書きしたいのですが、どうすれば良いでしょうか? ちなみにBテーブルには上書きしたいレコード(この例でいきますとフィールド2)だけが格納されています。 どうすれば良いでしょうか? よろしくお願いします。

  • Accessリレーションシップについて

    お世話になります。 Access2010 普段はクエリにて、いくつかのテーブルやクエリを紐づけているのですが リレーションシップの設定は今までやったことがありません。 ネットで調べて、 ・「参照整合性」にチェックを入れることにより、1対多の多側で1側に存在  しないIDで登録しようとするとエラーになる。   →間違ったデータが入力されるのを防ぐ。 ・多側でリレーションシップが設定されているフィールドに値を入力しない  ことは可能。但し、当該フィールドの「値要求」プロパティを"はい"に  した場合は、入力しないとエラーになる。 ・「フィールドの連鎖更新」にチェックを入れると、1側で変更したものが  多側でも自動的に変更される。 ・「レコードの連鎖削除」にチェックを入れると、1側で削除した場合、  多側で該当するデータをもつレコードが自動的に削除される。 上記については実際に試してみて動きを確認しました。 ※上記の認識違いや、もっと大事なことがあればご指摘、ご教示頂けると  幸いです。 今までは、こっちのテーブルで削除したらこっちのテーブルでも削除 みたいなことをやってたので、便利だとは思うのですが。。 以下のテーブルでリレーションシップの設定を行ったとします。 売上テーブル  ID 商品 担当者コード  1 AAAAA  3  2 BBBBB  1  3 AAAAA  1  4 CCCCC  2  5 CCCCC  3 担当者テーブル 担当者コード 担当者名  1     担当者A  2     担当者B  3     担当者C 売上テーブルの担当者コードと、担当者テーブルの 担当者コードでリレーションの設定を行い、「参照整合性」及び 「レコードの連鎖削除」にチェックを入れたとします。 例えばフォーム上にリストボックスを設置し ID 商品 担当者名 を表示し、リストボックス上で選択されたレコードを、削除ボタンを 押したら、そのレコードが削除されるプログラムを作成します。 ※選択されたレコードのIDを取得し削除クエリで削除。 リストボックスでID:5のレコードを選択し、削除ボタンを押した場合 売上テーブルのID:5のレコードを削除しても、担当者テーブルから 担当者コード:3のレコードは削除されない・・という認識でよろしい でしょうか。 ※要するに、1対多の多側で削除されても1側には影響無し。 同様にリストボックスでID:5のレコードを選択し、削除ボタンを押したときに 担当者コード:3を取得し、まずは担当者テーブルで担当者コード:3の レコードを削除すると、併せて売上テーブルのID:1及びID:5が削除 される。 要するに、上記のケースで「レコードの連鎖削除」の設定を行うと 本来削除すべきID:5以外のレコード(ID:1)まで削除されてしまう ことになる?? ※そもそも例がちょっと悪かったかもしれません。。 何が言いたいかというと、「フィールドの連鎖更新」「レコードの 連鎖削除」は、よーく考えて設定しないと意図しないところまで 更新されたり削除されてしまうのかなと。。なので、設定することに よって、プログラムの作りも変わってきてしまうことになるので しょうか。 理解不足で質問自体もモヤモヤしたものになってしまいましたが、 ご教示のほど、宜しくお願い致します。

  • マイクロソフト アクセス リレーションシップの扱い方について

    よろしくお願いします。アクセスで作成したテーブル、例えばAとBには共通の番号があります。それぞれは各テーブル内で番号がいくつか重複しています。この番号により、リレーションシップの関連付け(参照整合性は行わず)を行った後、クエリで抽出したところ、ところどころ同じデータが発生して、膨大な量になってしまいます。参照整合性・フィールドの連鎖更新・レコードの連座削除をチェックして再度リレーションシップを作成しましたが、主テーブルで参照されている固有のインデックスが見つからないとのエラーメッセージが出ます。このテーブルA・Bを使用してデータが重複しないようにクエリで抽出する事はできますか。

  • アクセスの追加クエリについて(1対1リレーションシップの場合)

    お世話になります。 似たような質問はあるのですが、どれもしっくりこないので質問させて下さい。 アクセスで検査結果のデータベースを作ろうと考えています。 アクセスでデータベースを作製するのはこれが初めてです。 1製品毎に製造番号をつけ、各テーブルの主キーにしています。 テーブルは検査のタイミング毎に分け、それぞれの検査項目をフィールドに設定しています。 この方法だと各テーブルのリレーションは1対1になります(よね?) それで、新たに製品の詳細(製造日や数量など)を一括して登録したいと考え、製造番号を含むテーブルを作成しました。 このテーブルで入力した製造番号を他のテーブルにも自動で登録したいので、追加クエリでやろうとするのですが、 「0件のレコードを追加します」と出てしまいます。 データは適当にですが、入力はしています。 どうすれば実現できるのでしょうか? また、テーブルを分割しなければ製造番号を追加する必要もない訳ですが、 1つのテーブルに統合するべきなのでしょうか? その場合はフィールドは50個ぐらいになってしまいます。 大変お手数ですが、ご教示頂けると幸いです。 よろしくお願いします。

  • filemakerでの繰り返しフィールドのリレーション

    Filemakerの使い方で質問です。 WindowsでFilemaker8.0を使用しています。 部品マスタがあり、下記のようなものだとします。 部品番号 部品名 001   パーツA 002   パーツB 003   パーツC 管理マスタがべつにあり、部品マスタと部品番号でリレーションを 組んでいます。 これを1つのレコードに複数入力したいので繰り返しフィールドで 入力は部品番号で行い、その横に部品名が自動的に表示されるように したいのですが、売上入力テーブルに新しいフィールドを定義して ルックアップを利用する方法は判るのですが、それではマスタを 変更しても過去のレコードまでは変化しません。 部品マスタを変更した際に過去のレコードも自動的に変更して欲しいので 繰り返しフィールドをリレーションで部品名を表示させたいのですが可能なのでしょうか。 以上、よろしくお願いします。

  • データベースの設計について少し疑問が出たので投稿しました。

    データベースの設計について少し疑問が出たので投稿しました。 数千万レコードを取り扱う場合、以下のどの構成が一番クエリを早く実行できるのでしょうか? 1.1つのデータベースに1つのテーブルを構築して全てのレコードを格納。 2.1つのデータベース内に複数のテーブルを構築して、レコードを分散して格納。 3.複数のデータベースにそれぞれ1つのテーブルを構築して、レコードを分散して格納。 データベースはMySQLです。 参考までに、ご意見をお聞かせいただければと思います。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • Access2003 テーブルのリレーションシップについてアドバイスをお願いします。

    私はAccess操作を始めて2日ほどの経験しかありません。 意味不明な部分があるかとは思いますが、やりたい事に対するリレーションシップについて識者の方のアドバイスをお願いします。 長文です。 ★やりたい事 「識別コードA」と「識別コードB」と「識別コードC」の3つのコードを利用してレコードを管理したい。 例) SIKIBETU_A1 →SIKIBETU_B1    →SCNO01    →SCNO02    →SCNO03 →SIKIBETU_B2    →SCNO01 →SIKIBETU_B3    →SCNO01    →SCNO02    →SCNO03    →SCNO04    →SCNO05 SIKIBETU_A2 SIKIBETU_A3 . . . ★条件 ・「識別コードA」のしたには「識別コードB」がぶら下がっている。   ※識別コードBは重複することの無いユニークなコード ・「識別コードB」にぶら下がっている「識別コードC」はオートナンバーの連番である。 ・「識別コードA」「識別コードB」「識別コードC」の3つでユニークである。  ※下記のように、識別コードAが異なれば識別コードB,Cが同じコードでも問題なし   「001」「001」「001」   「002」「001」「001」 ★作ってみたテーブル <T_Aテーブル>  CODE-A  ← キーレコード  DataA1  DataA2 <T_Bテーブル>  CODE-A  ← キーレコード  CODE-B  ← キーレコード  DataB1  DataB2 <T_Cテーブル>  CODE-A  ← キーレコード  CODE-B  ← キーレコード  CODE-C  ← キーレコード  DataC1  DataC2  DataC3 ★やろうとしたリレーションシップ  <T_Aテーブル>  <T_Bテーブル>   <T_Cテーブル>  CODE-A -------> CODE-A                CODE-B -------> CODE-B                              CODE-C このリレーションシップを行おうとした結果、T_AテーブルからT_BテーブルへのCODE-Aリレーションは正しく出来ますが、T_BテーブルからT_Cテーブルへリレーションしようとすると 「主テーブルで参照されているフィールド用の固有インデックスが見つかりません。」 と画面に表示されて、リレーションシップ出来ません。 参考書片手に試行錯誤しておりますが、買って来た入門書にはこのような仕様のサンプルなど無く困っています。 やり方が正しいのか、何が間違っているのかも手探りな状況で申し訳ないのですが、識者の方のアドバイスをお願いいたします。

  • アクセスについて教えてください。

    アクセス2002 XP使用 Aテーブル ID 氏名 電話番号 住所  などの個人情報入力 Bテーブル ID (リレーションするためのID主キー) 管理ID 購入商品 上記のように今作っているのですが、AテーブルIDとBテーブルは1対多でのリレーションしてます。 フォームで帳票形式で見たとき、 管理NOの数だけレコード表示されるのはいいのですが、 AテーブルID 1に対し、管理IDが111と三件分あるとして、(勿論BテーブルIDには123となってます) AテーブルID1にひとつ、受付NOを追加して、   ID  受付NO  管理ID   1   1    1   1   2    1   1   3    1   2   1    2   2   2    2   3   1    3 見たいに受付NOがIDごとに123。。。と自動入力されル洋にしたいのですがどのようにすればできますか?素人なので説明もうまくできなくわけが変わらないかもしれませんがおしえてください。よろしくお願いします。