• ベストアンサー

私が考えたAccessのテーブル設計に問題がないか教えてください。

Access2003を使用しています。 前任者が作成したデータベースに修正を加えています。 顧客からの問合せを記録しているT対応履歴という名のテーブルがあります。 対応履歴ID・・・主キー(オートナンバー型) 顧客No 顧客名 商品番号 問合せ区分 問合日 完了日 弊社担当者 内容 原因 対応 備考 などがあります。 その中に修理料金が発生し、修理を依頼した取引先との記録も残すフィールドを加えました。 でも、これは1レコードにつき全て発生するというわけではなくて、どちらかと言えばまれです。 内容としては、次のものがメインになります。 数量 実施日 請求日 支払日 入金確認日 取引先ID・・・取引先テーブルとつながっているため必要 テーブルの設計をするのがはじめての頃だったので、対応履歴の中に加えてしまいました。 別々のテーブルにわけることも考えたのですが、フォームやレポートのリンクがうまくいかなかったので結局一緒にしてしまいました。 やはりこのような場合は、テーブルをわけたほうがよかったのでしょうか? そのように思うのですが、設計の自信がないため確認させていただきたいのです。 今のところ、その料金が発生した場合のデータは10件ほどです。 今からでも、テーブルをわけたほうがよいのでしょうか? 2ヵ月後ぐらいには料金が発生するような事例が増えると言われています。 直すなら今のうちだと思っています。 設計にお詳しい方、どうぞよきアドバイスをいただけないでしょうか? よろしくお願いいたします。

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

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

> フォームやレポートのリンクがうまくいかなかった 私がクエリを使い始めた頃に引っかかった辺りを思い出しつつになりますが・・・ 2つのテーブルを「-」で結合したクエリでは、双方のテーブルにデータがある レコードのみが表示の対象になります。 テーブル1とテーブル2があり、テーブル2での該当レコードの有無に関係なく テーブル1のレコードは全て表示したい場合は、デザインビューで、以下の ように「→」での連結にする必要があります。 (ご質問の例で言うと、「-」結合だと修理料金が発生したレコードのみを表示、「→」  結合だと全てのレコードを表示(修理料金が未発生のものは実施日などは空欄)) ┌テーブル1┐  ┌テーブル2┐ |*      |  |*      | |ID     |→|ID     | |~     |  |      | └――――┘  └――――┘ (以下、この形を「テーブル1→テーブル2」と表記することにし、「-」結合の  場合は「テーブル1-テーブル2」と表記することにします) また、さらに、3つ以上のテーブルからクエリを作成する場合は、結合の仕方に よって、データ表示が可能なパターンと、「あいまいな結合が~」というエラーが 表示されるパターンとがあります:  <データシートビューを表示可能>   ・「テーブル1-テーブル2-テーブル3」 (全て「-」で結合)   ・「テーブル1→テーブル2→テーブル3」 (全て「→」で結合)   ・「テーブル1-テーブル2→テーブル3」 (「-」と「→」が混在、矢印の元側に「-」)   ・「テーブル1←テーブル2→テーブル3」 (「←」と「→」が混在、矢印の元側が共通)  <「あいまいな結合」エラー発生>   ・「テーブル1→テーブル2-テーブル3」 (「-」と「→」が混在、矢印の先側に「-」)   ・「テーブル1→テーブル2←テーブル3」 (「←」と「→」が混在、矢印の先側が共通) クエリが原因だとすると、上記のようなことが考えられるように思いますが、上記の ようなエラーだったとすると、クエリの作り方で解決できますので、375Kさんご自身で お考えの通り、また他の方の回答にもあるように、私もテーブルの分割をお勧めします。

375k
質問者

お礼

分割させました。今のところはうまく動作しているように見えます。 前に設計をたてたときフォームやレポートがうまくいかなかったのは、ご推測いただいてますように結合の仕方を間違えていたからだと思います。 結合の仕方がいまだにしっかりと理解できていなくて、望む結果が得られなくて、VBAが必要なのかもしれないなどと思ってしまうのですが、たいていは結合の仕方を正しく行えば解決できます。 アクセスはリレーショナルシップが大事だとつくづく思いますね。 まだまだ理解できていないので細かく教えていただいて本当に助かります。 おかげで別の設計でもつまづいていたのですが、結合をいろいろと変えて望みのクエリを作ることができました。 ご回答ありがとうございました!

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

その他の回答 (3)

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.3

分けたほうがいいでしょうね 案件と対応という親子関係にするといいでしょう 現在の対応履歴から対応関係を外し 料金の有無にかかわらず対応記録として残していけばいいんじゃないですか そうすれば1案件に対し複数(回)の対応が発生しても記録できるようになります インタフェースにはメイン・サブフォームを使います

375k
質問者

お礼

ご回答ありがとうございます。 お知恵をいただきましたことを参考に「案件」と「修理料金」という形でわけました。 ひとつの案件に生ずる細かなやりとりは、メインフォーム「案件」の備考をやりとりメモとみなしてひとつのフィールドにどっか~んと記録することにしたのです。 ひとつのフィールドに記録できる方法を使用者が望んでいるためです。 ですが、複数の回答者様からこの部分を指摘されているので、ここの設計ももう一度考え直す必要がありそうです。 詳細は、QNo.3551458のNo3の回答者様の補足のところにも記入してあります。

すると、全ての回答が全文表示されます。
noname#192382
noname#192382
回答No.2

問い合わせ・クレーム関係事項と修理発注事項はおっしゃるように別テーブルにすべきです。 修理発注にはしない案件もあり、複数の案件をまとめて発注することもありえますから。 ほかにひとつ考えておくべきこととしてひとつの案件について何回も問い合わせ、クレームがくるかもしれません。それをどのように処理するかということです。

375k
質問者

お礼

ご回答ありがとうございます。 別テーブルに設計をしなおしました。 >ほかにひとつ考えておくべきこととしてひとつの案件について何回も問い合わせ、クレームがくるかもしれません。それをどのように処理するかということです。 ひとつの案件についての問合せは、メインフォームの中の「備考」を「やりとりメモ」とみなして、メモ型にどっか~んと記録することになっています。 それが使用者の希望なんです。 詳細は、QNo.3551458のNo3の回答者様の補足のところに記入してありますので、よろしかったらご覧ください。そちらのアドバイスもいただけると大変助かります。

すると、全ての回答が全文表示されます。
noname#140971
noname#140971
回答No.1

服飾デザイナで本職のプログラマじゃありませんので参考程度に・・・。 顧客名簿: ID__顧客名______取引先_ID 1___鈴木 一郎______________1 2___中村 主水______________2 問合せ履歴: ID__顧客名簿_ID__問合区分__問合日_________完了日__担当者_ID__内容__原因__対応__備考 1__________________1____________1__2007/11/11________________________1__XX____XX_____XX____XX 2__________________2____________1__2007/11/12________________________2__XX____XX_____XX____XX 料金管理簿: ID__問合せ履歴_ID__数量__実施日________請求日__支払日__入金確認日 1_____________________1______2__2007/11/11 1、オートナンバーは可能であれば利用しない。(採番テーブル方式が良い) 2、リレーショナルデータベースの機能を利用するにはテーブルは当然に分割。 3、[取引先_ID]は、本来はテーブル[顧客名簿]にあるべきじゃないのでは? クエリ1: 取引先_ID__顧客名_______問合区分__数量__実施日 ____________1__鈴木 一郎__1_________________2___2007/11/11 ____________2__中村 主水__1 なお、上記設計でクエリを作成しデータを表示した場合、このようになります。 [問合せ履歴]と[料金管理簿]とを同一テーブルにする必要性がない理由です。

375k
質問者

お礼

いつもご回答をいただきましてありがとうございます。 分割しました。今のところ問題がないようです。

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

関連するQ&A