<HOME  <お願い事項  <Access2000 TOP   <Access97 TOP   <サイト内検索
 MS-Access2002チョ〜入門部屋>クエリを極める
  



 menu

44. 多対多の結びつきについて

実際には、リレーショナルデータベースの世界のテーブル同士の結びつきで、「多対多」という結びつきはありえません。
ただそれは、「テーブル同士の結びつき」として考えると、ということであって、日常の業務ではそういう結びつきをしないとならないデータ同士って、いろいろあると思います。
そうした場合、実際に結び付けたい二つのテーブルを直接結びつけるのではなくて、間に中間テーブルをかまして間接的に結び付けます。

たとえば、うちの社員たちはこれだけいるんですけど、みんな何かしら担当する仕事があるんです。
何せ人手不足なもんでネコの手も借りたいってことで(寒)、ひとり何役かこなしてもらうことにしています。

仕事の種類は現在これだけあります。
みんなに、仕事の内容をそれぞれ伝えたいと思っているんですが、これだけではこの二つのテーブルは当然結びつきません。

この二つのテーブルの関係はどうなっているかというと・・・。
  ・ひとりの社員が、いくつかの仕事を担当することになる。
  ・ひとつの仕事を、何人かの社員が担当する。

ということで、これがいわゆる「多対多」の関係になります。
しかし、これはこれで話が終わります。業務としてはこういうことはありえますが、これだけではテーブル同士の関係(リレーション)は成立しません。それは、この二つのテーブルを見比べてみればわかりますよね。。。情報不足です。
多対多は、あくまでも「データの結びつきに関する考え方」であって、実際のテーブル同士の結びつきにはつながりません。

そこで、たとえば下のような、「誰がどの仕事を担当しているのか」という結びつきをするための中間テーブルを作って、このテーブルを間にはさんでテーブル同士を結び付けます。

[社員テーブル][仕事割テーブル]は、社員一人に対して担当する仕事が複数、ということで、「一対多」になります。
[仕事テーブル][仕事割テーブル]は、仕事ひとつに対して、担当する社員が複数、ということでここも「一対多」。
こうすることで、[社員テーブル]と[仕事テーブル]は「多対多」の関係になるのです(なってるわけじゃないですけどね・・・)

こうすれば、誰がどの仕事担当なのか、一覧にすることができますよね。

また、ちょっとフィールドの選び方や並び順を変えてやれば・・・。

「仕事別のメンバー表」なんてのも作れそうです。
人数の偏りがないか、折り合いの悪いネコ同士が同じ仕事についてないか・・・とか、確認したり(笑)

クエリを単にデータシートビューで見ただけでは、単なる表の形をしているだけなのでイマイチですが、これを元にレポートを作ったりピボットテーブルにしたりしてやれば、見やすいアウトプットになりますよね。

「多対多」の結びつきは、実際は無意識のうちに向き合ってる可能性高いんです。
それが多対多である、と気づかずにクエリ作ったりしてる場合がほとんどじゃないかな・・・。
どうしても、SQLとか、データベースを学問として学習しようとすると、「一対多」ってのがあるから、じゃあ「多対多」ってのもありえるよね?ってことで、言葉ばかりが先行してしまうんですね・・・。
きちんと理解することは大切ですけれど、言葉ばかりが先行して振り回されちゃうのもよくないと思う。
だったら、難しい用語なんかはあえて使わずに、身近な例で分かりやすく理解していったほうが有効です。

「業務をきちんと見直して、業務に沿った形でデータを見直してテーブルを作ってったら、自然に一対多の結びつきになった」と考えるのが自然だと思うんで、「一対多の結びつきをやるためにテーブルを分けて作って、実際の業務をデータベースに合わせる」なんてことにならないように気をつけてくださいね。最悪です。

そんなわけで、ここでしっかり考えておかなければならないことは「多対多のクエリの作り方」ではありません。
どういうテーブルを作っておけば、最小限の入力/更新で、有効な情報を出力することができるか、ということです。
今回の例で見れば、「仕事の割り振り」が変わったら、[仕事割テーブル]を入力しなおせばいいわけですよね。
どういう結果を出したいのか考えないと、テーブルの設計はできませんから・・・。