- ベストアンサー
リレーションシップについて
データベースを使ってシステムを作っているのですが、データベースを扱うことがあまり無いので日々勉強しながら作っています。 で、データベースの本を見るとよくリレーションシップを作成し、などとかかれています。このリレーションシップを作成すると、何か良いことがあるのでしょうか? 今まで作ってきたもの、参考にしたもにはリレーションシップを作成せずに、ビューなどを作ってデータを利用していました。このやり方で十分システムを作れているんですが、リレーションシップを作成すると、良いことがあれば組み込もうと思っています。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
僕はAccessしか使ったことないのですが、Accessの場合だとリレーションシップはリレーションシップウィンドウで設定します。ここで設定したリレーションは、参照整合性(参照制約?)、連鎖更新、連鎖削除が設定できます。大してクエリ上では内部結合や各外部結合の設定まではできますが、参照整合性(参照制約?)、連鎖更新、連鎖削除ができません。 リレーションシップウィンドウでリレーションシップを設定し、例えば連鎖削除機能をONにすると、あるテーブルのレコードを削除したときに、それに関連するテーブルのレコードも自動削除できます。 (SQLServerだとダイアグラムになるのでしょうか?ADPの場合かな?済みませんよく知らなくて。) クエリ(ビューみたいなもの)上のリレーションだけだとこれができないので、あってはいけないレコードがいまだに残っていたり、無いといけないレコードが無かったりと、内部的に矛盾した(ゴミ情報だらけの)データベースになってしまう場合があります。 (特にAccessのことを全く知らない一般ユーザーにもレコード操作させるとき) もっとも、手動でVBA等で連鎖削除や連鎖更新の相当するプログラムコードを書けば良いのですが(でもめんどくさい)。リレーションシップウィンドウでリレーションを設定すると、要するにこの連鎖更新や連鎖削除などのコードを書かなくてすむので重宝しています。 ただし安易に削除、更新ができないように、普段は参照整合性だけにチェックを入れておいて、それ以外ははずしておき、必要なときだけ連鎖削除・連鎖更新をONにしています。作業が終わったらまたすぐにOFFに戻します。 以上のようなことがありますので、リレーションをしかるべきところできちんと設定しておかないと怖くて運用できません。 SQLServerをお使いとのことですが、Accessのクエリに相当する(と思うんですが)「ビュー」上でも参照制約や連鎖更新、連鎖削除の設定ができるのなら良いのですが、ビューでそういう機能を持たせるととんでもないことになりそうなので多分設定できないようになっているとは思うのですが…。 「ビュー」上でも参照制約や連鎖更新、連鎖削除の設定ができるのなら僕の話は無視してよいと思います(^^)。
その他の回答 (6)
- 11n_kacie
- ベストアンサー率42% (21/50)
お世話様です。#5です。 詳しいことは#6さんがご説明されておりますので、補足程度に。 リレーショナルDBのリレーションは、やはりしかるべき箇所にて設定すべきだと思います。 Accessなら、おっしゃる通り「ツール→リレーションシップ」です。 ここで設定しておけばクエリ上でも同様のリレーションが適用されますし、 全テーブルのリレーションが図で見られるのでDBの構造が把握しやすいと思います。 クエリ等のみにて設定した場合、そのクエリを実行させたときに、 あたかもそのリレーションがあるかのように振舞うだけで(極端な言い方かもしれませんが)、 あくまでDB的には別個のテーブルということになります。 動作上不具合が無かったとしても、システム的には少し居心地の悪い感じがします。
- 11n_kacie
- ベストアンサー率42% (21/50)
私の場合、データベースを設計する際にはまずテーブル同士のリレーションから考えます。 全くのゼロから作る場合でも、伝票からボトムアップを行う場合でも、 まずリレーションの考えに基づいてDB化対象の構造を分析します。 ですので、私個人の認識では 「リレーションシップを作成すると良いことがある」 というよりも、 「リレーショナルDBとその他のDB(カード型)では別物」 くらいの認識です。極端かもしれませんが。 当然、リレーショナルDBにはそれ独特のメリットもあります。 それについてはすでに皆様が説明されておられる通りですので割愛させていただきます。
- cse_ri2
- ベストアンサー率25% (830/3286)
データベースを作成する際、複数のテーブルをリレーション するメリットは、データの変更をする際にその変更箇所が 少なくて済むからでしょう。 例えば、同一の顧客名が複数あるデータがあったとして、 顧客名を変更する作業が発生したとします。 この時に一つのテーブル(またはビュー)でデータを管理 している場合、該当する顧客名のデータを全件変更しなく てはいけません。 しかし顧客マスタを別にもっていてメインのテーブルとリレーション を貼っている場合、顧客名の変更は一箇所で済みます。 データが数千件レベルでしたら、複数レコードの変更も対して 負担がかかりませんが、データが数十万件~数千万件とも なると、その変更時の負荷はバカにできません。 もっともデータをリレーションした時のデメリットというのも 存在します。 検索時に必ず各マスタとつき合わせをしなくてはいけない ため、マスタ構造が深くなればなるほど、データの結合に 時間がかかってしまいます。 データウェアハウスのDBを構築する場合、意図的にリレーション を作成せず一つの巨大なテーブルから検索を行うことで、 レスポンスを向上させる設計をすることもあります。
補足
ANo.#5の補足に記入しました。
- tsukasa-12r
- ベストアンサー率65% (358/549)
ちなみに、データベースっていうのは何ですか? Microsoft SQL Server ですか? Access ですか? Oracle ですか? それとも、それ以外ですか?
補足
主にMicrosoft SQL Server です Accessも使用する時があります
- ymmasayan
- ベストアンサー率30% (2593/8599)
リレーションシップというのは関係付けですよね。 データベースには同じデータは原則として1箇所にしか持たないという鉄則があります。 そこで、例えば従業員表に何もかも持つのではなくて、本当に基本的なものだけを持ち、 家族表や賃金表や趣味表、資格表などを別々に作ります。 すると表(の行)と表(の行)の間にリレーションシップが必要になります。 また所属の例をとると、所属部署コードと所属部署名があります。 従業員表には所属部署コードだけを持ち、所属部署表で所属部署コードと所属部署名の 対応を持ちます。 このときも従業員表から所属部署表へのリレーションシップが必要になります。 簡単にまとめると、データのダブりをなくするために表を細切れにする。 (正規化といいます)。 すると表と表のつながりはリレーションシップでつながないといけないということです。
補足
ANo.#5の補足に記入しました。
- ares
- ベストアンサー率36% (81/219)
一つのテーブルに保存するにはあまりにデータ量が多いような場合は、いくつもテーブルを分けて管理する方が便利です。そのテーブル間をつなぐのがリレーションシップですね。 例えば顧客名簿としましょう。 顧客会社名・住所・注文品・数量と言ったデータを今まで1つのテーブルで管理してたものを *顧客のデータ(住所や会社名)は1テーブル *顧客の注文履歴は1テーブル *商品は1テーブルとわけて、それぞれを関連づけ(リレーションシップ構築)していれば、 商品名が変わった等の場合、商品を管理しているテーブルの商品名を変更するだけで、連動するデータも自動的に変わるわけです。 単純な管理は1テーブルで良いですが、複雑ないろいろな情報が混じり合ったデータ管理は、リレーションを組む方が便利です。
補足
ANo.#5の補足に記入しました。
補足
みなさん、ありがとうございます。 質問が抽象的過ぎたのか・・・。反省。 DBはMS SQLServer2000とAccessなどを使用しています。 例えば、商品の受注などのシステムの場合 商品テーブル(商品コード、商品名、単価) 注文テーブル(注文コード、商品コード、数量) と作成し、そのリレーションとして、商品テーブルの商品コードと、注文テーブルの商品コードとがつながっている形です。 で、Accessで「ツール」→「リレーション」、SQLで「ダイアグラム」というところでリレーションの作成ができると思います。 今手がけているシステムでは、AccessでもSQlでもリレーションの作成は行わず、使用しています。クエり、ビューなどを作成する時にリレーションをはって利用しています。 Accessで「リレーション」、SQLで「ダイアグラム」というところでリレーションの作成をすることで、何かメリットがあるのでしょうか?その機能があるということは、それなりにメリットがあるからだと思うのですが、それが良く分からないので、教えてください。 私が予想するには、商品コード1のものを、すべて商品コード100に変更する、とか、ぐらいしか思いつかないのですが・・・。あと、商品コード1のものを削除すると、商品コード1を使用しているすべてのものが削除されるのかなあ?という感じですが・・・。