【いちたいたりれーしょん】

1対多リレーション とは?

最終更新:
💡 一つの親に、いくつもの子がつながる関係

1対多は、一つのデータに複数のデータが関連する関係です。単著の著者と本を例に、外部キーの置き方と、0件の関連や共著の場合の違いを説明します。

📌 このページのポイント
1対多:著者一人に複数の本例:一冊の著者を一人とする著者Aid = 5authors:親books:子本A:id = 101author_id = 5本B:id = 102author_id = 5本C:id = 103author_id = 5別々の本が、同じ著者IDを参照
矢印は子から親への参照です。本のIDは別々でも、著者IDは繰り返せます。親に子が0件の場合もあります。
ひよこ ひよこ
1対多ってどんな関係?
ペンギン先生 ペンギン先生
たとえば、著者一人が本を何冊も書く関係だよ。ここでは説明のため「本一冊の著者は一人」というルールを使う。著者Aに本A・本B・本Cが関連すれば、著者から本へは1対多になるんだ。
ひよこ ひよこ
データベースではどう表すの?
ペンギン先生 ペンギン先生
図ではauthors表のidが5の行を、books表のauthor_idが参照しているよ。本のidはそれぞれ違うけれど、author_idには同じ5が並ぶ。通常は「多」の側に外部キーを置いて、存在する著者の主キーなどを参照させるんだ。
ひよこ ひよこ
同じ番号を3回入れてもいいの?
ペンギン先生 ペンギン先生
いいんだよ。bookのidは本を区別するので重複させないけれど、author_idは関連先を表すので重複できる。ここにUNIQUE制約を付けると同じ著者を参照する本を複数入れられなくなるため、1対多にしたい列へ不用意に付けないことが大事だね。
ひよこ ひよこ
本がまだない著者も登録できる?
ペンギン先生 ペンギン先生
できるよ。親に子が0件の場合もあるんだ。また、本のauthor_idにNOT NULLを付ければ著者を必須にできる。NULLを許す設計なら著者未設定の本も持てる。著者と本の両方から、何件の関連を許すのかを業務のルールで決めよう。
ひよこ ひよこ
共著の本や検索の速さはどう考えるの?
ペンギン先生 ペンギン先生
本一冊に複数の著者を付けたいなら多対多なので、本と著者を結ぶ中間表を使うよ。検索には索引も検討するけれど、外部キーを付ければ必ず索引が自動で付くわけではない。たとえばPostgreSQLは参照元の外部キー列に索引を自動作成しないので、使う検索や更新に合わせて判断するんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「1対多」って出てきたら「一つの親に、いくつもの子がつながる関係」と思えばだいたいOK!
📖 おまけ:英語の意味
「One-to-many」 = 1対多
💬 英語のone-to-manyは「一つから複数へ」という関係を表すよ。データベースでは、親と呼ぶ側の一つの行に、子と呼ぶ側の複数の行が関連することを指すんだ。

参考資料

← 用語集にもどる