• ベストアンサー

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

データベースを使ってシステムを作っているのですが、データベースを扱うことがあまり無いので日々勉強しながら作っています。 で、データベースの本を見るとよくリレーションシップを作成し、などとかかれています。このリレーションシップを作成すると、何か良いことがあるのでしょうか? 今まで作ってきたもの、参考にしたもにはリレーションシップを作成せずに、ビューなどを作ってデータを利用していました。このやり方で十分システムを作れているんですが、リレーションシップを作成すると、良いことがあれば組み込もうと思っています。

  • mm_mm
  • お礼率16% (4/24)

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

  • ベストアンサー
  • gadd3
  • ベストアンサー率46% (211/451)
回答No.6

僕はAccessしか使ったことないのですが、Accessの場合だとリレーションシップはリレーションシップウィンドウで設定します。ここで設定したリレーションは、参照整合性(参照制約?)、連鎖更新、連鎖削除が設定できます。大してクエリ上では内部結合や各外部結合の設定まではできますが、参照整合性(参照制約?)、連鎖更新、連鎖削除ができません。 リレーションシップウィンドウでリレーションシップを設定し、例えば連鎖削除機能をONにすると、あるテーブルのレコードを削除したときに、それに関連するテーブルのレコードも自動削除できます。 (SQLServerだとダイアグラムになるのでしょうか?ADPの場合かな?済みませんよく知らなくて。) クエリ(ビューみたいなもの)上のリレーションだけだとこれができないので、あってはいけないレコードがいまだに残っていたり、無いといけないレコードが無かったりと、内部的に矛盾した(ゴミ情報だらけの)データベースになってしまう場合があります。 (特にAccessのことを全く知らない一般ユーザーにもレコード操作させるとき) もっとも、手動でVBA等で連鎖削除や連鎖更新の相当するプログラムコードを書けば良いのですが(でもめんどくさい)。リレーションシップウィンドウでリレーションを設定すると、要するにこの連鎖更新や連鎖削除などのコードを書かなくてすむので重宝しています。 ただし安易に削除、更新ができないように、普段は参照整合性だけにチェックを入れておいて、それ以外ははずしておき、必要なときだけ連鎖削除・連鎖更新をONにしています。作業が終わったらまたすぐにOFFに戻します。 以上のようなことがありますので、リレーションをしかるべきところできちんと設定しておかないと怖くて運用できません。 SQLServerをお使いとのことですが、Accessのクエリに相当する(と思うんですが)「ビュー」上でも参照制約や連鎖更新、連鎖削除の設定ができるのなら良いのですが、ビューでそういう機能を持たせるととんでもないことになりそうなので多分設定できないようになっているとは思うのですが…。 「ビュー」上でも参照制約や連鎖更新、連鎖削除の設定ができるのなら僕の話は無視してよいと思います(^^)。

その他の回答 (6)

  • 11n_kacie
  • ベストアンサー率42% (21/50)
回答No.7

お世話様です。#5です。 詳しいことは#6さんがご説明されておりますので、補足程度に。 リレーショナルDBのリレーションは、やはりしかるべき箇所にて設定すべきだと思います。 Accessなら、おっしゃる通り「ツール→リレーションシップ」です。 ここで設定しておけばクエリ上でも同様のリレーションが適用されますし、 全テーブルのリレーションが図で見られるのでDBの構造が把握しやすいと思います。 クエリ等のみにて設定した場合、そのクエリを実行させたときに、 あたかもそのリレーションがあるかのように振舞うだけで(極端な言い方かもしれませんが)、 あくまでDB的には別個のテーブルということになります。 動作上不具合が無かったとしても、システム的には少し居心地の悪い感じがします。

  • 11n_kacie
  • ベストアンサー率42% (21/50)
回答No.5

私の場合、データベースを設計する際にはまずテーブル同士のリレーションから考えます。 全くのゼロから作る場合でも、伝票からボトムアップを行う場合でも、 まずリレーションの考えに基づいてDB化対象の構造を分析します。 ですので、私個人の認識では 「リレーションシップを作成すると良いことがある」 というよりも、 「リレーショナルDBとその他のDB(カード型)では別物」 くらいの認識です。極端かもしれませんが。 当然、リレーショナルDBにはそれ独特のメリットもあります。 それについてはすでに皆様が説明されておられる通りですので割愛させていただきます。

mm_mm
質問者

補足

みなさん、ありがとうございます。 質問が抽象的過ぎたのか・・・。反省。 DBはMS SQLServer2000とAccessなどを使用しています。 例えば、商品の受注などのシステムの場合 商品テーブル(商品コード、商品名、単価) 注文テーブル(注文コード、商品コード、数量) と作成し、そのリレーションとして、商品テーブルの商品コードと、注文テーブルの商品コードとがつながっている形です。 で、Accessで「ツール」→「リレーション」、SQLで「ダイアグラム」というところでリレーションの作成ができると思います。 今手がけているシステムでは、AccessでもSQlでもリレーションの作成は行わず、使用しています。クエり、ビューなどを作成する時にリレーションをはって利用しています。 Accessで「リレーション」、SQLで「ダイアグラム」というところでリレーションの作成をすることで、何かメリットがあるのでしょうか?その機能があるということは、それなりにメリットがあるからだと思うのですが、それが良く分からないので、教えてください。 私が予想するには、商品コード1のものを、すべて商品コード100に変更する、とか、ぐらいしか思いつかないのですが・・・。あと、商品コード1のものを削除すると、商品コード1を使用しているすべてのものが削除されるのかなあ?という感じですが・・・。

  • cse_ri2
  • ベストアンサー率25% (830/3287)
回答No.4

データベースを作成する際、複数のテーブルをリレーション するメリットは、データの変更をする際にその変更箇所が 少なくて済むからでしょう。 例えば、同一の顧客名が複数あるデータがあったとして、 顧客名を変更する作業が発生したとします。 この時に一つのテーブル(またはビュー)でデータを管理 している場合、該当する顧客名のデータを全件変更しなく てはいけません。 しかし顧客マスタを別にもっていてメインのテーブルとリレーション を貼っている場合、顧客名の変更は一箇所で済みます。 データが数千件レベルでしたら、複数レコードの変更も対して 負担がかかりませんが、データが数十万件~数千万件とも なると、その変更時の負荷はバカにできません。 もっともデータをリレーションした時のデメリットというのも 存在します。 検索時に必ず各マスタとつき合わせをしなくてはいけない ため、マスタ構造が深くなればなるほど、データの結合に 時間がかかってしまいます。 データウェアハウスのDBを構築する場合、意図的にリレーション を作成せず一つの巨大なテーブルから検索を行うことで、 レスポンスを向上させる設計をすることもあります。

mm_mm
質問者

補足

ANo.#5の補足に記入しました。

回答No.3

ちなみに、データベースっていうのは何ですか? Microsoft SQL Server ですか? Access ですか? Oracle ですか? それとも、それ以外ですか?

mm_mm
質問者

補足

主にMicrosoft SQL Server です Accessも使用する時があります

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.2

リレーションシップというのは関係付けですよね。 データベースには同じデータは原則として1箇所にしか持たないという鉄則があります。 そこで、例えば従業員表に何もかも持つのではなくて、本当に基本的なものだけを持ち、 家族表や賃金表や趣味表、資格表などを別々に作ります。 すると表(の行)と表(の行)の間にリレーションシップが必要になります。 また所属の例をとると、所属部署コードと所属部署名があります。 従業員表には所属部署コードだけを持ち、所属部署表で所属部署コードと所属部署名の 対応を持ちます。 このときも従業員表から所属部署表へのリレーションシップが必要になります。 簡単にまとめると、データのダブりをなくするために表を細切れにする。 (正規化といいます)。 すると表と表のつながりはリレーションシップでつながないといけないということです。

mm_mm
質問者

補足

ANo.#5の補足に記入しました。

  • ares
  • ベストアンサー率36% (81/219)
回答No.1

 一つのテーブルに保存するにはあまりにデータ量が多いような場合は、いくつもテーブルを分けて管理する方が便利です。そのテーブル間をつなぐのがリレーションシップですね。  例えば顧客名簿としましょう。  顧客会社名・住所・注文品・数量と言ったデータを今まで1つのテーブルで管理してたものを  *顧客のデータ(住所や会社名)は1テーブル  *顧客の注文履歴は1テーブル  *商品は1テーブルとわけて、それぞれを関連づけ(リレーションシップ構築)していれば、 商品名が変わった等の場合、商品を管理しているテーブルの商品名を変更するだけで、連動するデータも自動的に変わるわけです。  単純な管理は1テーブルで良いですが、複雑ないろいろな情報が混じり合ったデータ管理は、リレーションを組む方が便利です。

mm_mm
質問者

補足

ANo.#5の補足に記入しました。

関連するQ&A

  • 【ACCESS】リレーションシップが分かりません

    ACCESSを勉強しているものです。 参考書にて勉強しているのですが、リレーションシップの部分がどうしても分かりません。言葉の意味や効果は分かるのですが、視覚的にピンときません。この部分がすっきり理解できれば、かなり視界が広がるのですが・・・ リレーションシップを分かりやすく教えていただけませんか?? またはリレーションシップについて視覚的、直感的に分かるサイト等ありますでしょうか??? 宜しくお願いします。

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

    accessで作ったデータベースで新たにリレーションシップを設定しようとすると、まだ自分では何も設定していないにも関わらず勝手にリレーションシップが設定されていることがあります。 内容としては「MSysAccessStora」というフィールドリスト名で内容はDateCreate/DateUpdate/Id/Name/ParentId/Type とフィールド名が並んでいます。 これは何でしょうか? このデータはFOM出版のMOS対策テキストのデータなのですが、こんな名前のテーブルなどは存在しないのですが・・・ わかる方いらっしゃったらよろしくお願い致します。

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

    Access2013を勉強しています。 リレーションシップについて参考書(2冊)を見ていて疑問を持ったのですが、 二つのテーブルでリレーションシップを定義したいそれぞれのフィールド名は同じ名前だとうまくいかないのでしょうか?参考書では、値は同じ(例えば1、2、3・・・)は同じなのにフィールド名は微妙に違う名前をつけているのですが(例えばテーブルAでは顧客IDでテーブルBでは取引先ID)・・・ 宜しくお願いします。

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

     既存のDataを利用して、「1」対「多」のリレーションシップを構築しようとしたところ、「1」側に無いDataが「多」側にあるのですが、この余計な「多」側にあるDataを簡単に削除する方法は無いでしょうか?  ACCESSは、97です。

  • リレーションシップの書き方について

    今更ながら、リレーションシップの 記述について、悩んでいます。 例を上げると、まず「受注」というテーブルが あるとします。 この受注というデータは、あるタイミングで 「売上」というデータを作成するための元ネタになります。 以降、受注と売上を同時に見に行くようなことはないと 仮定した場合、「受注」と「売上」にはリレーションを 記述する必要はないのでしょうか? 自分としては、「売上」の元データであるだけの「受注」と 売上は関連がないと思うのでリレーションは必要ないと思うのですが・・・

  • リレーションシップの「+」マーク

    おはようございます。 access2003です。 リレーションシップを組んである test.mdbに保存されていたテーブルを データーベース分割ツールでtest_be.mdbファイルを作成しリンクテーブルとしました。 その時test_be.mdbだとテーブルを開いたときに一番左側に「+」のマークがあり 紐付いているテーブルを参照することができるのですが test.mdbのファイルを見ると「+」マークがありません。 でも「リレーションシップ」を確認すると関連付いています。 test.mdbファイルでも紐付けて見ることは可能でしょうか? よろしくお願いします。

  • アクセスのリレーションシップに関して

    アクセスでDBを構築して業務で使用しているのですが、容量がかなり大きくなってきたのでデータと、フォーム等による入力・検索を別DBで実施したいと思っています。そこで、元DBをコピーしてコピー先のテーブルを全て元DBからのリンクにしようとしたのですが、リンクを貼った後にテーブル名を置き換えしようとするとリレーションシップを削除しろというメッセージがでてしまいます。下手くそなシステムで、後でリレーションシップを貼りまくっているので、いちいちリレーションシップ削除・再構築をしようとすると膨大な作業になってしまいます。どなかか、リレーションシップを削除せずにテーブルを置き換える方法をご存知ないでしょうか。

  • MS ACCESSにおいてのリレーションシップ設定

    ACCESSを使用してシステムを構築しているのですが、テーブル間のリレーションシップについて疑問があります。 リレーションシップを設定することにより、データベースの整合性を得ることができますが、その他のメリットはあるのでしょうか? ある文献では検索時間の短縮になるとあったのですが、本当なのでしょうか? 通常の表結合クエリーと参照整合性以外の違いはどのようなものでしょうか? 回答をお願いします。

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

     Win XP Office 2003 Accessを勉強中です。  デザインビューでクエリを作成するときに、関連するテーブルを表示させると自動的に「結合プロパティ」の線が表示されますが、 この表示で自動的に「1対多」を表示する時としない時がありますが、これは何故でしょうか。  これはどこかから設定をしてやるのでしょうか。  また、同じような線としてメニュバーから「リレーションシップ」を表示させることが出来ますが、 内容的には「結合プロパティ」と同じものですが、これは「リレーションシップ」とはどのようなに使い分けるものでしょうか。

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

    アクセス初心者です。 テーブルを複数作成しました。 これをリレーションシップをしたいと思うのですが、「主キー」の扱いに悩んでいます。 参考書などは主キーともう1つのテーブルの同じ項目名でかつ主キーでないものを結んでいますが、主キー同志は結んではいけないですか? メインで使うテーブルのIDを支点に、他の複数のテーブルのIDを放射状に結びつけて関連付けたいと考えています。 どのようにして作成していけばできますか? そのようなことができないのでしたら、どのようにしたらできますか?