webdevqa.jp.net

識別関係と非識別関係についてまだ混乱

だから、データベース設計での識別対非識別の関係について読んでおり、SOは私と矛盾しているようです。ここに2つの質問があります見つめている:

  1. 識別関係と非識別関係の違いは何ですか
  2. 特定または非特定の関係を決定する際のトラブル

各質問の上位の回答を見ると、識別関係とは何かという2つの異なるアイデアを得るように見えます。

最初の質問の応答は、識別関係は「子テーブルの行の存在が親テーブルの行に依存する状況を説明する」と述べています。この例は、「著者は多数の本を書くことができます(1対nの関係)が、本がなければ著者は存在できません。」それは理にかなっています。

しかし、質問2の回答を読むと、「子供が親を識別する場合、それは識別関係である」と言うので混乱します。次に、答えは 社会保障番号 (個人の識別)などの例を示しますが、住所はそうではありません(多くの人が住所で生活できるため)。私には、これは主キーと非主キーの決定の場合のように聞こえます。

私自身の直感(および他のサイトでの追加調査)は、最初の質問とその回答が正しいことを示しています。ただし、データベース設計の理解に取り組んでいる間、何か間違ったことを学びたくないので、先に進む前に確認したかったのです。前もって感謝します。

74
JasCav

識別関係の技術的な定義は、子供の外部キーがその主キーの一部であるということです。

CREATE TABLE AuthoredBook (
  author_id INT NOT NULL,
  book_id INT NOT NULL,
  PRIMARY KEY (author_id, book_id),
  FOREIGN KEY (author_id) REFERENCES Authors(author_id),
  FOREIGN KEY (book_id) REFERENCES Books(book_id)
);

見る? book_idは外部キーですが、主キーの列の1つでもあります。したがって、このテーブルには、参照されるテーブルBooksとの識別関係があります。同様に、Authorsとの識別関係があります。

YouTubeビデオのコメントには、それぞれのビデオとの識別関係があります。 video_idshouldCommentsテーブルの主キーの一部であること。

CREATE TABLE Comments (
  video_id INT NOT NULL,
  user_id INT NOT NULL,
  comment_dt DATETIME NOT NULL,
  PRIMARY KEY (video_id, user_id, comment_dt),
  FOREIGN KEY (video_id) REFERENCES Videos(video_id),
  FOREIGN KEY (user_id) REFERENCES Users(user_id)
);

最近では、複合主キーの代わりにシリアルサロゲートキーのみを使用することが一般的になっているため、これを理解するのは難しいかもしれません。

CREATE TABLE Comments (
  comment_id SERIAL PRIMARY KEY,
  video_id INT NOT NULL,
  user_id INT NOT NULL,
  comment_dt DATETIME NOT NULL,
  FOREIGN KEY (video_id) REFERENCES Videos(video_id),
  FOREIGN KEY (user_id) REFERENCES Users(user_id)
);

これにより、テーブルに識別関係がある場合がわかりにくくなる可能性があります。

not SSNが識別関係を表すと考えます。一部の人々は存在しますが、SSNがありません。他の人が新しいSSNを取得するために申請する場合があります。そのため、SSNは実際には単なる属性であり、個人の主キーの一部ではありません。


@Nielsからのコメント:

したがって、複合主キーの代わりに代理キーを使用する場合、識別関係または非識別関係の使用に顕著な違いはありませんか?

そうだと思います。代理キーを使用してテーブル間の論理関係を変更していないため、「はい」と言うのをためらいます。つまり、既存のビデオを参照せずにコメントを作成することはできません。しかし、それは単にvideo_idがNOT NULLでなければならないことを意味します。そして、論理的な側面は、私にとって、本当に関係を識別することのポイントです。

しかし、関係を特定する物理的な側面もあります。そして、それは外部キー列が主キーの一部であるという事実です(主キーは必ずしも複合キーではなく、コメントの主キーとビデオテーブルの外部キーの両方である単一の列である可能性があります、ただし、動画ごとに保存できるコメントは1つだけです)。

関係を識別することは、エンティティ関係図の作成のためだけに重要であるように思われ、これはGUIデータモデリングツールで発生します。

148
Bill Karwin

「何か間違ったことを学びたくないので」。

Welll、もしあなたが本当にそれを意味するなら、あなたはERの専門用語や用語について心配するのをやめることができます。それは不正確、混乱、混乱を招き、一般的に合意されておらず、大部分は無関係です。

ERは、紙に描かれた長方形と直線の束です。 ERは、意図的に非公式モデリングの手段となることを目的としています。そのため、データベース設計の貴重な最初のステップですが、それだけでもあります:最初のステップです。

ERダイアグラムが、Dで正式に記述されたデータベース設計の正確性、正確性、完全性に近づくことはありません。

19
Erwin Smout

識別/非識別リレーションシップは、ERモデリングの概念です。参照テーブルの主キーの一部である外部キーによって表される場合、リレーションシップは識別リレーションシップです。リレーショナルモデルとSQLデータベースの主キーには、ERモデルのように特別な意味や機能がないため、これは通常、リレーショナルモデリング用語ではほとんど重要ではありません。

たとえば、テーブルが2つの候補キーAとBを強制するとします。Aがそのテーブルの外部キーでもあるとします。このように表される関係は、Aが「主」キーとして指定されている場合は「識別」と見なされますが、Bが主キーである場合は識別されていません。それでも、表の形式、機能、意味はそれぞれの場合で同じです!これが、私の意見では、識別/非識別の概念が本当に非常に重要だとは思わない理由です。

11
nvogel

識別関係と非識別関係の違いは、外部キーのNullabilityのみであると考えています。 FKをNULLにできない場合、それが表す関係は識別します(子は親なしでは存在できません)、そうでない場合は識別しません。

9
Pankaj Jha

ここでの問題の一部は、用語の混乱です。関係の識別は、長い結合パスを回避するのに役立ちます。

私が見た最高の定義は、「識別関係には、子PKの親のPKが含まれます。言い換えると、子のPKには、親へのFKと子の「実際の」PKが含まれます。

7
gnackenson

はい、最初のものと一緒に行きますが、私は2番目のものが最初のものと矛盾するとは思いません。少し混乱させるだけで定式化されています。

更新:

ちょうどチェック-2番目の質問の答えはいくつかの仮定で間違っています。このm:n関係の交差テーブルを作成するリレーショナルデータベースでは、交差テーブルと他の2つのテーブル間の関係を識別することができます。

1
marianboda

親から子へのリレーションを定義する必要がある場合、リレーションシップを識別すると、1対多のオプションのリレーションシップが得られます。さらに、親から子へのフローは、1対1のリレーションシップのみとなります。子エンティティインスタンスは、親エンティティインスタンスを識別します。erダイアグラムでは実線で表されます。

子エンティティインスタンスの存在には親エンティティインスタンスが必要ですが、子エンティティの各エンティティインスタンスは親エンティティの多くのエンティティインスタンスに関連している可能性があります。親エンティティは子エンティティの外部キーになりますが、子エンティティは主キーを持つため、親エンティティの主キーは使用しません。独自の主キーがあります。多対多の関係は、実世界のER図には存在しません。解決する必要があります

1
kumar

これは概念モデリングの領域であり、「談話の世界」の理解をモデル化するため、識別関係は確かにERDの概念です。これは、各子オブジェクトのIDが(少なくとも部分的に)親オブジェクトのIDによって確立/決定されるという事実をモデル化する親子関係です。したがって、これは必須であり、不変です。

実世界の例は、人を特定するという多年にわたる課題です。人のユニークなアイデンティティは、(一部)出生した母親や父親との関係によって定義できます。既知の場合、これらは不変の事実です。したがって、出生の親と子の関係は、子のアイデンティティの定義に(不変に)貢献するという点で、識別関係です。

これらの品質とリレーショナルdbmsコンストラクトの使用が、FKを介して親のPKを含む複合キーである子のPKをもたらします。 PKとして、子のIDは必須で不変です(変更できません)PKの「変更」は、実際には新しいオブジェクトをインスタンス化します。したがって、PKを変更することはできません。 PKの不変性も制限する必要があります。 DB制約を使用して、その品質のPKを実装できます。

1
Russell Searle