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 table1対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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 3NFまでの正規化
- ERモデリングとリレーションシップのカーディナリティ
- スタースキーマとデータウェアハウス設計
- 総合模擬面接問題集