カーディナリティ かーでぃなりてぃ
リレーション主キー外部キー正規化ER図インデックス
カーディナリティについて教えて
カーディナリティとは
カーディナリティ(Cardinality) とは、データベースにおいてテーブル(表)同士の関係における「レコード数の比率・対応関係」のことです。たとえば「1人の顧客が何件の注文を持てるか」「1つの商品が何個の注文明細に紐づくか」といった、データ間の量的な関係性を表します。
ER図(Entity-Relationship図。テーブルの関係を図示したもの)を読んだり設計したりする場面で必ず登場する概念です。カーディナリティを正しく把握していると、テーブルの結合方法やインデックスの設計、さらにはシステムの性能見積もりにまで活かすことができます。
なお「カーディナリティ」にはもう1つの意味もあります。列(カラム)の値の種類の多さ(重複のなさ)を指す使い方で、インデックスの効き具合を判断するときに使われます。どちらの意味かは文脈で判断しましょう。
カーディナリティの3つのパターン
データベース設計で登場するカーディナリティは、主に次の3種類です。
| パターン | 表記 | 具体例 |
|---|---|---|
| 1対1(One-to-One) | 1 : 1 | 社員テーブル ↔ 社員証テーブル |
| 1対多(One-to-Many) | 1 : N | 顧客テーブル ↔ 注文テーブル |
| 多対多(Many-to-Many) | M : N | 商品テーブル ↔ 注文テーブル |
覚え方:「結婚・子育て・合コン」で覚える
- 1対1:結婚(1人に1人が対応)
- 1対多:親と子(1人の親に複数の子)
- 多対多:合コン(複数の人が複数の人と関係を持てる)
多対多はそのままDBに入れられない
多対多の関係は中間テーブル(関連テーブル)を挟んで「1対多 + 1対多」に分解しないと、リレーショナルデータベースでは正しく管理できません。
【多対多の分解イメージ】
商品テーブル ←→ 注文明細テーブル(中間) ←→ 注文テーブル
1 : N N : 1
歴史と背景
- 1970年 — Edgar F. Codd がリレーショナルモデルを提唱。テーブル間の関係を数学的に整理する枠組みが生まれた
- 1976年 — Peter Chen が ER モデル(Entity-Relationship Model)を発表。カーディナリティを図で表現する記法が広まる
- 1980年代〜 — Oracle・DB2 などの商用 RDBMS が普及。ER図とカーディナリティ記法が設計の標準ツールとなる
- 1990年代〜 — UML(統一モデリング言語)が登場し、ER図の記法がさらに標準化される
- 現在 — クラウド時代でもRDBMSは主流であり、カーディナリティはシステム設計・DB設計研修の基礎として必ず登場する概念
カーディナリティの記法とER図
ER図にはいくつかの記法がありますが、現在もっともよく使われるのが Crow’s Foot 記法(鳥の足記法) です。線の端の形でカーディナリティを表現します。
カーディナリティとインデックスの関係
列のカーディナリティは「その列にある値の種類数」を指します。検索性能を上げるためのインデックス設計では、カーディナリティが高い列(値の種類が多い=重複が少ない)ほどインデックスが効果的です。
| カーディナリティ | 例 | インデックスの効果 |
|---|---|---|
| 高い(High) | メールアドレス・注文ID | ◎ 非常に効果的 |
| 中程度(Medium) | 都道府県・部署名 | △ 条件次第 |
| 低い(Low) | 性別(男/女)・フラグ(0/1) | ✗ ほぼ効果なし |
関連する規格・RFC
| 規格 | 内容 |
|---|---|
| ISO/IEC 9075(SQL標準) | リレーショナルデータベースの国際標準。カーディナリティの概念を含むデータモデルの基礎を規定 |