3秒でわかる
クラスやテーブルが参照でつながっている関係のこと。設計図では直線と多重度で表し、DBの外部キーをどこに置くかを決める手がかりになります。
もう少し詳しく
どういうものか
関連(association)は、あるクラスが別のクラスを知っていて利用できる、という関係を指します。UMLのクラス図では2つのクラスを結ぶ直線で描き、線の両端に「1」「0..*」といった多重度を添えて、片方から見て相手が何個あるのかを表します。コードの上では、あるクラスがフィールドとして別のクラスの参照を持っている状態が関連にあたります。
なぜ必要か
オブジェクト指向の設計では、1つの巨大なクラトに全部を詰め込まず、責務ごとにクラスを分けます。分けた瞬間に「注文は顧客のものである」「記事にはコメントがぶら下がる」というつながりを表現する手段が必要になり、それが関連です。関連を先に整理しておくと、DBのテーブル設計や外部キーの置き場所がそのまま決まります。
具体例
class Customer {
private String name;
}
// Order から Customer への一方向の関連
class Order {
private Customer customer; // 多重度は Order 多 対 Customer 1
private List<OrderLine> lines = new ArrayList<>();
}このコードは、注文が顧客を1人参照し、明細を複数持つ、という2本の関連を表しています。DBに落とすと orders テーブルに customer_id 列が生まれます。
つまずきやすいところ
関連の向きを意識しないまま、両方のクラスがお互いの参照を持つ形にしてしまうのがよくある失敗です。双方向にすると、片方を更新したときにもう片方の整合を取る処理が必ず必要になり、循環参照でJSON変換が無限ループします。まず一方向で書き、どうしても逆からたどりたい場面が出てから双方向にします。
似た用語との違い
| 関係 | 意味 | 消えたとき |
|---|---|---|
| 関連 | 単に参照しているだけ | 相手は生き残る |
| 集約 | 全体と部分だが独立している | 部分は生き残る |
| コンポジション | 全体が部分の生死を握る | 部分も消える |
覚え方
クラス図の直線は、コードの上では「相手を型として持っているフィールド」に置き換わります。線を1本引いたら、どちらのクラスにフィールドが生えるのかを口に出して確かめると、向きと多重度の取り違えが減ります。DBへ落とすときは、多の側に外部キーが入る、と覚えておくと迷いません。
名前を付けられる関係かどうかも見分けの助けになります。「注文は顧客に属する」と一文で言えるなら、それは関連として図に描く価値のあるつながりです。