ER図とキーの仕組みを図解で説明 〜主キー・外部キーと参照整合性〜

データベースの設計で使う「ER図」の読み方を説明できますか?

四角と線が並んだ図を見て、どこから読めばいいのか迷った人も多いと思います。

ER図は、表と表がどうつながっているかを1枚で表す図です。

ER図の読み方と、表をつなぐ主キー・外部キーの仕組みについて、図を使って説明していきます。

顧客、注文、商品のER図。顧客と注文は1対多、注文と商品は多対多でつながる

ER図とは?

ER図は、データベースで扱う「もの」と、その「つながり」を表す図 です。

ERは、Entity(エンティティ)とRelationship(リレーションシップ)の頭文字です。

  • エンティティ: 顧客、注文、商品のように、データとして管理する「もの」
  • 属性: 顧客名、住所のように、エンティティが持つ項目
  • リレーションシップ: 「顧客が注文する」のような、エンティティ同士のつながり

データベースを作る時は、いきなり表を作るのではなく、まずER図で全体を整理します。

エンティティは、データベースを作る時の表のもとになります。

1対1・1対多・多対多

ER図で一番大事なのは、つながりの数です。

1対1、1対多、多対多の例の図。社員と社員証、顧客と注文、注文と商品
種類例読み方
1対1社員と社員証1人の社員は1枚の社員証を持ち、1枚の社員証の持ち主は1人
1対多顧客と注文1人の顧客は何回も注文できるが、1つの注文の顧客は1人
多対多注文と商品1つの注文に何種類もの商品が入り、1つの商品は何回も注文される

ER図の書き方には、いくつかの決まり(表記法)があります。

例えば、線の先を鳥の足のように3本に分けて「多」を表す書き方(IE記法)がよく使われています。

試験や職場によって記号は違いますが、「どちらが1で、どちらが多か」を読み取ることが大切です。

多対多は間に表を入れる

多対多のつながりは、そのままでは表にできません。

注文の表に商品を並べると、商品の数だけ列が必要になってしまうからです。

そこで、2つの表の間に 中間の表(連関エンティティ) を入れて、1対多のつながり2つに分けます。

多対多の注文と商品の間に注文明細の表を入れて、1対多のつながり2つに分ける図

注文と商品の間に「注文明細」の表を入れると、次のようになります。

  • 注文 1対多 注文明細: 1つの注文に、明細が何行もある
  • 商品 1対多 注文明細: 1つの商品が、何件もの明細に出てくる

注文明細には、注文番号と商品番号、数量を入れます。

主キーと外部キー

ER図のつながりを、実際の表で実現するのが主キーと外部キーです。

注文の表の顧客番号が外部キーとして、顧客の表の主キーを参照する図

主キー は、表の中の1行を特定するための列(または列の組み合わせ) です。

顧客番号のように、重複せず、空(NULL)にならない値を使います。

注文明細のように、注文番号と商品番号の2つを合わせて主キーにすることもあります。

外部キー は、ほかの表の主キーを参照する列 です。

注文の表にある「顧客番号」は、顧客の表の主キーを参照する外部キーです。

注文の表の顧客番号を見れば、どの顧客の注文なのかが分かります。

1対多のつながりでは、「多」の側の表に外部キーを置きます。

参照整合性

外部キーが参照している先のデータが必ず存在し、表同士に矛盾がない状態を 参照整合性 といいます。

外部キーを設定すると、データベースが参照整合性を守るための制約(参照制約)をかけて、矛盾が起きる操作を止めてくれます。

参照整合性の図。存在しない顧客番号での注文の登録や、注文が残っている顧客の削除はエラーになる

例えば、次のような操作はエラーになります。

  • 顧客の表にない顧客番号「C99」で、注文を登録しようとする
  • 注文が残っている顧客を、顧客の表から削除しようとする

もし登録や削除ができてしまうと、「誰の注文か分からない注文」が残ってしまいます。

なお、顧客を削除した時に、その顧客の注文も一緒に削除するように設定することもできます。

まとめ

今回はER図と、主キー・外部キーの仕組みについて説明しました。

ER図は、データとして管理する「もの」と、そのつながりを表す図です。

つながりには1対1・1対多・多対多があり、多対多は中間の表を入れて1対多に分けます。

表同士は主キーと外部キーでつながり、外部キーを設定すると参照整合性によって矛盾が防がれる、と覚えておきましょう。

表を分ける考え方については、正規化を図解で説明の記事で説明しています。

データベースの基本については、データベースの種類を図解で解説の記事で説明しています。

外部キーでつながった表をつなげて取り出す方法については、SQLのJOINの仕組みを図解で説明の記事で説明しています。