No.6ベストアンサー
- 回答日時:
僕はAccessしか使ったことないのですが、Accessの場合だとリレーションシップはリレーションシップウィンドウで設定します。
ここで設定したリレーションは、参照整合性(参照制約?)、連鎖更新、連鎖削除が設定できます。大してクエリ上では内部結合や各外部結合の設定まではできますが、参照整合性(参照制約?)、連鎖更新、連鎖削除ができません。リレーションシップウィンドウでリレーションシップを設定し、例えば連鎖削除機能をONにすると、あるテーブルのレコードを削除したときに、それに関連するテーブルのレコードも自動削除できます。
(SQLServerだとダイアグラムになるのでしょうか?ADPの場合かな?済みませんよく知らなくて。)
クエリ(ビューみたいなもの)上のリレーションだけだとこれができないので、あってはいけないレコードがいまだに残っていたり、無いといけないレコードが無かったりと、内部的に矛盾した(ゴミ情報だらけの)データベースになってしまう場合があります。
(特にAccessのことを全く知らない一般ユーザーにもレコード操作させるとき)
もっとも、手動でVBA等で連鎖削除や連鎖更新の相当するプログラムコードを書けば良いのですが(でもめんどくさい)。リレーションシップウィンドウでリレーションを設定すると、要するにこの連鎖更新や連鎖削除などのコードを書かなくてすむので重宝しています。
ただし安易に削除、更新ができないように、普段は参照整合性だけにチェックを入れておいて、それ以外ははずしておき、必要なときだけ連鎖削除・連鎖更新をONにしています。作業が終わったらまたすぐにOFFに戻します。
以上のようなことがありますので、リレーションをしかるべきところできちんと設定しておかないと怖くて運用できません。
SQLServerをお使いとのことですが、Accessのクエリに相当する(と思うんですが)「ビュー」上でも参照制約や連鎖更新、連鎖削除の設定ができるのなら良いのですが、ビューでそういう機能を持たせるととんでもないことになりそうなので多分設定できないようになっているとは思うのですが…。
「ビュー」上でも参照制約や連鎖更新、連鎖削除の設定ができるのなら僕の話は無視してよいと思います(^^)。
No.7
- 回答日時:
お世話様です。
#5です。詳しいことは#6さんがご説明されておりますので、補足程度に。
リレーショナルDBのリレーションは、やはりしかるべき箇所にて設定すべきだと思います。
Accessなら、おっしゃる通り「ツール→リレーションシップ」です。
ここで設定しておけばクエリ上でも同様のリレーションが適用されますし、
全テーブルのリレーションが図で見られるのでDBの構造が把握しやすいと思います。
クエリ等のみにて設定した場合、そのクエリを実行させたときに、
あたかもそのリレーションがあるかのように振舞うだけで(極端な言い方かもしれませんが)、
あくまでDB的には別個のテーブルということになります。
動作上不具合が無かったとしても、システム的には少し居心地の悪い感じがします。
No.5
- 回答日時:
私の場合、データベースを設計する際にはまずテーブル同士のリレーションから考えます。
全くのゼロから作る場合でも、伝票からボトムアップを行う場合でも、
まずリレーションの考えに基づいてDB化対象の構造を分析します。
ですので、私個人の認識では
「リレーションシップを作成すると良いことがある」
というよりも、
「リレーショナルDBとその他のDB(カード型)では別物」
くらいの認識です。極端かもしれませんが。
当然、リレーショナルDBにはそれ独特のメリットもあります。
それについてはすでに皆様が説明されておられる通りですので割愛させていただきます。
この回答への補足
みなさん、ありがとうございます。
質問が抽象的過ぎたのか・・・。反省。
DBはMS SQLServer2000とAccessなどを使用しています。
例えば、商品の受注などのシステムの場合
商品テーブル(商品コード、商品名、単価)
注文テーブル(注文コード、商品コード、数量)
と作成し、そのリレーションとして、商品テーブルの商品コードと、注文テーブルの商品コードとがつながっている形です。
で、Accessで「ツール」→「リレーション」、SQLで「ダイアグラム」というところでリレーションの作成ができると思います。
今手がけているシステムでは、AccessでもSQlでもリレーションの作成は行わず、使用しています。クエり、ビューなどを作成する時にリレーションをはって利用しています。
Accessで「リレーション」、SQLで「ダイアグラム」というところでリレーションの作成をすることで、何かメリットがあるのでしょうか?その機能があるということは、それなりにメリットがあるからだと思うのですが、それが良く分からないので、教えてください。
私が予想するには、商品コード1のものを、すべて商品コード100に変更する、とか、ぐらいしか思いつかないのですが・・・。あと、商品コード1のものを削除すると、商品コード1を使用しているすべてのものが削除されるのかなあ?という感じですが・・・。
No.4
- 回答日時:
データベースを作成する際、複数のテーブルをリレーション
するメリットは、データの変更をする際にその変更箇所が
少なくて済むからでしょう。
例えば、同一の顧客名が複数あるデータがあったとして、
顧客名を変更する作業が発生したとします。
この時に一つのテーブル(またはビュー)でデータを管理
している場合、該当する顧客名のデータを全件変更しなく
てはいけません。
しかし顧客マスタを別にもっていてメインのテーブルとリレーション
を貼っている場合、顧客名の変更は一箇所で済みます。
データが数千件レベルでしたら、複数レコードの変更も対して
負担がかかりませんが、データが数十万件~数千万件とも
なると、その変更時の負荷はバカにできません。
もっともデータをリレーションした時のデメリットというのも
存在します。
検索時に必ず各マスタとつき合わせをしなくてはいけない
ため、マスタ構造が深くなればなるほど、データの結合に
時間がかかってしまいます。
データウェアハウスのDBを構築する場合、意図的にリレーション
を作成せず一つの巨大なテーブルから検索を行うことで、
レスポンスを向上させる設計をすることもあります。
No.2
- 回答日時:
リレーションシップというのは関係付けですよね。
データベースには同じデータは原則として1箇所にしか持たないという鉄則があります。
そこで、例えば従業員表に何もかも持つのではなくて、本当に基本的なものだけを持ち、
家族表や賃金表や趣味表、資格表などを別々に作ります。
すると表(の行)と表(の行)の間にリレーションシップが必要になります。
また所属の例をとると、所属部署コードと所属部署名があります。
従業員表には所属部署コードだけを持ち、所属部署表で所属部署コードと所属部署名の
対応を持ちます。
このときも従業員表から所属部署表へのリレーションシップが必要になります。
簡単にまとめると、データのダブりをなくするために表を細切れにする。
(正規化といいます)。
すると表と表のつながりはリレーションシップでつながないといけないということです。
No.1
- 回答日時:
一つのテーブルに保存するにはあまりにデータ量が多いような場合は、いくつもテーブルを分けて管理する方が便利です。
そのテーブル間をつなぐのがリレーションシップですね。例えば顧客名簿としましょう。
顧客会社名・住所・注文品・数量と言ったデータを今まで1つのテーブルで管理してたものを
*顧客のデータ(住所や会社名)は1テーブル
*顧客の注文履歴は1テーブル
*商品は1テーブルとわけて、それぞれを関連づけ(リレーションシップ構築)していれば、
商品名が変わった等の場合、商品を管理しているテーブルの商品名を変更するだけで、連動するデータも自動的に変わるわけです。
単純な管理は1テーブルで良いですが、複雑ないろいろな情報が混じり合ったデータ管理は、リレーションを組む方が便利です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- MySQL 【投稿情報用データベース posts】は必要ないと思います。 1 2022/06/02 21:25
- MySQL 「utf8mb4_general_ci」はMAMPでは何に当たりますか? 1 2022/06/02 07:45
- ソフトウェア データベースのウェブでの自作 2 2023/08/01 10:06
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- その他(インターネット接続・インフラ) 語学レッスン予約ページを作ろうとしています。 1 2022/09/26 17:43
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- その他(プログラミング・Web制作) Visual StudioでDjangoのプロジェクト配下のappを作成する方法 1 2022/05/01 03:47
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessでデータシートに同じデ...
-
Accessのテーブルデータを一気...
-
結合テーブルでINSERTする方法...
-
MYSQLでコード番号を自動でつけ...
-
重複クエリを使ったデータ削除
-
テーブルで一番古いレコードだ...
-
Oracleで上書きImportはできま...
-
アクセス レコードセットを更...
-
Accessでの稼働日数計算の方法
-
IF NOT EXISTを使用するINSERT文
-
ORA-01401が表示され、データが...
-
マテリアライズドビューとスナ...
-
大規模なショッピングサイトのD...
-
ERROR1062:Duplicate entry.......
-
accessでレコード更新直後の反...
-
構文エラー : 演算子がありませ...
-
仕事のミス:本番データの削除→...
-
Access昇順レコードを、5分割...
-
ビューのソートについて
-
テーブルの設計はとりあえず文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessでデータシートに同じデ...
-
Accessのテーブルデータを一気...
-
テーブルで一番古いレコードだ...
-
ビューのソートについて
-
Oracleで上書きImportはできま...
-
accessでレコード更新直後の反...
-
このISAMでは、リンクテーブル・・
-
マテリアライズドビューとスナ...
-
アクセス レコードセットを更...
-
同一テーブルのデータを参照し...
-
htmlコードで書かれた表にphpで...
-
結合テーブルでINSERTする方法...
-
ACCESSで容量が50MBになった...
-
ERROR1062:Duplicate entry.......
-
Accessでの稼働日数計算の方法
-
削除したテーブルを元に戻すこ...
-
Accessのインポートについて(上...
-
重複クエリを使ったデータ削除
-
処理の途中で停止させ、再開さ...
-
住所のDBテーブル、マスターの...
おすすめ情報