こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

Access2003を使用しています。
前任者が作成したデータベースに修正を加えています。

顧客からの問合せを記録しているT対応履歴という名のテーブルがあります。
対応履歴ID・・・主キー(オートナンバー型)
顧客No
顧客名
商品番号
問合せ区分
問合日
完了日
弊社担当者
内容
原因
対応
備考
などがあります。

その中に修理料金が発生し、修理を依頼した取引先との記録も残すフィールドを加えました。
でも、これは1レコードにつき全て発生するというわけではなくて、どちらかと言えばまれです。
内容としては、次のものがメインになります。
数量
実施日
請求日
支払日
入金確認日
取引先ID・・・取引先テーブルとつながっているため必要

テーブルの設計をするのがはじめての頃だったので、対応履歴の中に加えてしまいました。
別々のテーブルにわけることも考えたのですが、フォームやレポートのリンクがうまくいかなかったので結局一緒にしてしまいました。

やはりこのような場合は、テーブルをわけたほうがよかったのでしょうか?
そのように思うのですが、設計の自信がないため確認させていただきたいのです。

今のところ、その料金が発生した場合のデータは10件ほどです。
今からでも、テーブルをわけたほうがよいのでしょうか?
2ヵ月後ぐらいには料金が発生するような事例が増えると言われています。
直すなら今のうちだと思っています。

設計にお詳しい方、どうぞよきアドバイスをいただけないでしょうか?

よろしくお願いいたします。

投稿日時 - 2007-11-29 17:02:52

QNo.3557122

すぐに回答ほしいです

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

> フォームやレポートのリンクがうまくいかなかった

私がクエリを使い始めた頃に引っかかった辺りを思い出しつつになりますが・・・

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さんご自身で
お考えの通り、また他の方の回答にもあるように、私もテーブルの分割をお勧めします。

投稿日時 - 2007-11-30 21:35:35

お礼

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

投稿日時 - 2007-12-07 16:20:02

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

分けたほうがいいでしょうね
案件と対応という親子関係にするといいでしょう

現在の対応履歴から対応関係を外し
料金の有無にかかわらず対応記録として残していけばいいんじゃないですか
そうすれば1案件に対し複数(回)の対応が発生しても記録できるようになります

インタフェースにはメイン・サブフォームを使います

投稿日時 - 2007-11-29 18:22:38

お礼

ご回答ありがとうございます。
お知恵をいただきましたことを参考に「案件」と「修理料金」という形でわけました。

ひとつの案件に生ずる細かなやりとりは、メインフォーム「案件」の備考をやりとりメモとみなしてひとつのフィールドにどっか~んと記録することにしたのです。
ひとつのフィールドに記録できる方法を使用者が望んでいるためです。
ですが、複数の回答者様からこの部分を指摘されているので、ここの設計ももう一度考え直す必要がありそうです。

詳細は、QNo.3551458のNo3の回答者様の補足のところにも記入してあります。

投稿日時 - 2007-12-07 16:11:49

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

投稿日時 - 2007-11-29 18:18:01

お礼

ご回答ありがとうございます。
別テーブルに設計をしなおしました。

>ほかにひとつ考えておくべきこととしてひとつの案件について何回も問い合わせ、クレームがくるかもしれません。それをどのように処理するかということです。

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

投稿日時 - 2007-12-07 15:57:43

服飾デザイナで本職のプログラマじゃありませんので参考程度に・・・。

顧客名簿:

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

なお、上記設計でクエリを作成しデータを表示した場合、このようになります。
[問合せ履歴]と[料金管理簿]とを同一テーブルにする必要性がない理由です。

投稿日時 - 2007-11-29 17:33:28

お礼

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

投稿日時 - 2007-12-07 15:51:40

あなたにオススメの質問