0Pricing
SQL Interview Prep · レッスン

ERモデリングとリレーションシップのカーディナリティ

要件をエンティティ、リレーションシップ、ジャンクションテーブルへ落とし込みます。

「ERモデリングとリレーションシップのカーディナリティ」はCoddyKit上の無料SQL Interview Prepレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Interview Prepコースには全4レッスンが含まれています。

ERモデリングが面接に登場する理由

正規化の次に、面接官は要件をスキーマに変換できるかを確認します。質問は通常、次のような自由度の高いものです。「ライドシェアアプリのデータベースを設計してください」、または「図書館システムをモデル化してください」などです。

これはエンティティ・リレーションシップ(ER)モデリングの演習です。面接官は、エンティティ、属性、それらの間のリレーションシップ、そしてカーディナリティをどのように特定するかを見ています。

重要なスキルは、英語の名詞と動詞をテーブルと外部キーに変換することです。

エンティティ、属性、リレーションシップ

すべてのERモデルは、次の3つの構成要素から成ります。

  • エンティティ:データを格納する対象(顧客、注文、商品)。通常はテーブルになります。
  • 属性:エンティティの性質(名前、価格、created_at)。通常は列になります。
  • リレーションシップ:エンティティ同士のつながり(顧客が注文を行うなど)。外部キーまたは中間テーブルで実装します。

問題文から読み取るコツは、名詞がエンティティや属性になり、動詞がリレーションシップになるということです。

カーディナリティ:中心となる概念

カーディナリティは、あるエンティティのインスタンスが、別のエンティティのインスタンスといくつ関連するかを表します。主な種類は次の3つです。

  • 1対1(1:1):こちらの1行に対して、あちらの行が最大1行対応します。
  • 1対多(1:N):こちらの1行に対して、あちらの複数行が対応します(最も一般的です)。
  • 多対多(M:N):両側の行が、それぞれ相手側の複数行に対応します。

カーディナリティを正しく設定することで、外部キーをどこに置くか、また中間テーブルが必要かどうかが決まります。

1対多の実装

1対多は、「多」側に外部キーを置くことで実装します。顧客1人に対して複数の注文があるため、各注文の行にcustomer_idを持たせます。

面接では、必ず方向を明確に説明しましょう。「1人の顧客から複数の注文への関係なので、外部キーはordersに置きます」

CREATE TABLE customers (
  customer_id INT PRIMARY KEY,
  name        VARCHAR(100)
);

CREATE TABLE orders (
  order_id    INT PRIMARY KEY,
  customer_id INT NOT NULL,
  order_date  DATE,
  FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

多対多の実装

リレーショナルデータベースでは、M:Nを直接格納することはできません。面接官が期待する答えは、中間テーブル(ブリッジテーブル、リンクテーブル、関連テーブルとも呼ばれます)です。

学生は複数のコースを履修し、各コースには複数の学生がいます。両方の外部キーを組み合わせたキーを持つenrollmentsテーブルを作成します。これにより、M:Nを2つの1:Nに分解できます。

CREATE TABLE students (
  student_id INT PRIMARY KEY,
  name       VARCHAR(100)
);

CREATE TABLE courses (
  course_id  INT PRIMARY KEY,
  title      VARCHAR(100)
);

CREATE TABLE enrollments (
  student_id INT,
  course_id  INT,
  enrolled_at DATE,
  PRIMARY KEY (student_id, course_id),
  FOREIGN KEY (student_id) REFERENCES students(student_id),
  FOREIGN KEY (course_id)  REFERENCES courses(course_id)
);

中間テーブルにはデータを保持できる

よくある追加質問に、「学生がコースで取得した成績はどこに格納しますか」というものがあります。

成績は学生だけ、またはコースだけに属するのではなく、リレーションシップに属します。そのため、中間テーブルに格納します。面接官が確認したいのは、M:Nリレーションシップの属性はブリッジ側に置くという理解です。

例として、履修日、成績、注文明細の数量、プロジェクトメンバーシップにおける役割などがあります。

ALTER TABLE enrollments
  ADD COLUMN grade CHAR(2);
-- grade describes THIS student in THIS course,
-- so it belongs on the junction table

1対1の実装

1:1の関係は比較的まれです。依存側のテーブルに、一意キーでもある外部キー(多くの場合、それ自体が主キー)を持たせて実装します。

たとえば、拡張情報を任意で保持するuserとuser_profileを考えます。プロフィールテーブルの主キーをuser_idにすると、1人のユーザーにつきプロフィールを最大1件までに制約できます。

CREATE TABLE users (
  user_id INT PRIMARY KEY,
  email   VARCHAR(255)
);

CREATE TABLE user_profiles (
  user_id INT PRIMARY KEY,           -- 1:1 enforced here
  bio     TEXT,
  avatar_url VARCHAR(255),
  FOREIGN KEY (user_id) REFERENCES users(user_id)
);

任意性と参加制約

カーディナリティには、面接官がよく確認する2つ目の側面があります。それが任意性(参加制約とも呼ばれます)です。

  • 必須:すべての注文に顧客が必要なので、customer_idはNOT NULLになります。
  • 任意:ユーザーにはプロフィールがあってもなくてもよいため、リレーションシップが存在しない場合があります。

外部キーにNOT NULLを指定することで、必須の参加を表現できます。NULLを許容するかどうかに言及すると、単なる構造だけでなく、実際の制約まで考えていることを示せます。

自己参照リレーションシップ

エンティティ自身を指すリレーションシップもあります。従業員の上司も従業員である場合や、カテゴリに親カテゴリがある場合などです。

これは、同じテーブルを参照する外部キーでモデル化します。組織図やツリー構造では、この設計が期待されます。また、自己結合や再帰CTEとも自然に組み合わせられます。

CREATE TABLE employees (
  employee_id INT PRIMARY KEY,
  name        VARCHAR(100),
  manager_id  INT NULL,
  FOREIGN KEY (manager_id) REFERENCES employees(employee_id)
);
-- manager_id NULL = top of the hierarchy (e.g. CEO)

小さなモデリング例

動詞をリレーションシップに変換する方法を練習しましょう。問題文は次のとおりです。「顧客が注文を行い、各注文には複数の商品が含まれ、商品は仕入先に属します」

  • 顧客 1:N 注文(外部キーcustomer_idをordersに置く)。
  • 注文 M:N 商品 -> 中間テーブルorder_items(quantityを持つ)。
  • 仕入先 1:N 商品(外部キーsupplier_idをproductsに置く)。

各カーディナリティと、キーを置く場所を説明しましょう。この説明が、面接で評価されるポイントです。

確認すべき質問

設計を始める前に質問する候補者は、面接官から高く評価されます。確認すべき質問の例は次のとおりです。

  • 「商品は複数の仕入先に属することがありますか」(1:NかM:Nかを決めます)。
  • 「すべての注文に少なくとも1つの商品が必要ですか」(参加制約を決めます)。
  • 「履歴が必要ですか。それとも現在の状態だけでよいですか」(追加テーブルの必要性に影響します)。

回答によってカーディナリティとテーブル数が変わるため、決めつけてはいけません。質問すること自体が、シニアレベルの視点を示します。

理解度チェック

学生とコースをモデル化します。各学生は複数のコースを履修でき、各コースには複数の学生がいるものとします。

振り返り:ERモデリングとカーディナリティ

これで、自由度の高いスキーマ設計の問題にも対応できるようになりました。

  • 名詞をエンティティ/属性に、動詞をリレーションシップに変換します。
  • 1:N:多側に外部キーを置きます。
  • M:N:両方のFKと、リレーションシップの属性を格納する中間テーブルを使用します。
  • 1:1:依存側のテーブルに共有キーまたは一意キーを置きます。
  • 必須参加を表すにはNOT NULLを使用し、階層構造には自己参照FKを使用します。
  • カーディナリティを決める前に、確認の質問をします。

よくある質問

「ERモデリングとリレーションシップのカーディナリティ」レッスンは無料ですか?

はい。「ERモデリングとリレーションシップのカーディナリティ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Interview Prepコースには全4レッスンが含まれています。

「ERモデリングとリレーションシップのカーディナリティ」で何を学びますか?

要件をエンティティ、リレーションシップ、ジャンクションテーブルへ落とし込みます。 ブラウザで直接実行するハンズオンコードでSQL Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Interview Prepを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「ERモデリングとリレーションシップのカーディナリティ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Interview Prepレッスンでコードを書いて実行できますか?

はい。すべてのSQL Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 3NFまでの正規化
  2. ERモデリングとリレーションシップのカーディナリティ
  3. スタースキーマとデータウェアハウス設計
  4. 総合模擬面接問題集
← SQL Interview Prepに戻る