1. ホーム
  2. database

[解決済み] アイデンティファイとノンアイデンティファイの関係についてまだ混乱している

2023-07-25 11:07:29

質問

データベース設計における識別と非識別の関係について読んできましたが、SOの回答の多くは、私にとって矛盾しているように見えます。 以下は、私が見ている2つの質問です。

  1. 識別可能な関係と識別不可能な関係の違いについて
  2. 本人確認と非本人確認の判断に迷う

各質問の上位の回答を見ると、識別関係とは何かということについて、2つの異なる考えを持っているように見えます。

最初の質問の回答では、識別関係とは "子テーブルの行の存在が親テーブルの行に依存する状況を記述するものである、とあります。

しかし、質問2への回答を読むと、"子が親を識別する場合、それは識別関係である、と書かれているので、混乱してしまいます(" その回答は、次に次のような例を挙げています。 社会保障番号 (個人を特定するもの)、しかし住所はそうではありません(多くの人が一つの住所に住むことができるからです)。 私にとっては、これは主キーと非主キーの間の決定のケースのように聞こえます。

私自身の直感 (および他のサイトでの追加調査) は、最初の質問とその回答が正しいことを指摘しています。 しかし、私はデータベース設計を理解するために努力しているので、間違ったことを学びたくないので、先に進む前に確認したかったのです。 事前にありがとうございます。

どのように解決するのですか?

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

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_id でなければなりません。 の主キーの一部でなければなりません。 Comments テーブルの主キーの一部でなければなりません。

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)
);

これは、テーブルが識別関係を持つ場合を不明瞭にする可能性があります。

私なら ではなく は、SSNが識別関係を表していると考えています。 一部の人々は、存在するが、SSNを持っていない。 他の人々は新しいSSNを取得するために申請するかもしれません。 したがって、SSN は実際には単なる属性であり、その人の主キーの一部ではありません。


Niels氏からのコメント再掲。

つまり、複合主キーの代わりに代理キーを使っても、識別する関係か識別しない関係かの違いはないということですか?

そうだと思います。そうだと言うのはためらわれます。 論理的 の関係を変更していないからです。つまり、既存の動画を参照することなくコメントを作成することはできません。しかし、これは video_id が NOT NULL でなければならないことを意味します。そして、論理的な側面は、私にとっては、関係を特定するためのポイントです。

しかし、関係を特定するための物理的な側面もあります。それは、外部キー列が主キーの一部であるという事実です(主キーは必ずしも複合キーではなく、Comments の主キーと Videos テーブルの外部キーの両方を持つ 1 つの列であることもできますが、その場合、動画ごとに 1 つのコメントしか格納できないことを意味します)。

関係を特定することは、実体関係図のためにのみ重要であるように思われ、これは GUI データ モデリング ツールで出てくるものです。