1. ホーム
  2. java

[解決済み] 1対多、多対1、多対多の違い?

2022-04-30 14:07:48

質問

些細な質問かもしれませんが、それぞれの違いや使用するタイミングを視覚的に理解するのに苦労しています。また、単方向マッピングや双方向マッピングのような概念が、一対多/多対多の関係にどのように影響するのか、少し不明です。私は今Hibernateを使用しているので、ORMに関連した説明があれば助かります。

例として、次のようなセットアップがあるとします。

public class Person{
    private Long personId;
    private Set<Skill> skills;
    //Getters and setters
}

public class Skill{
    private Long skillId;
    private String skillName;
    //Getters and setters
}

では、この場合、どのようなマッピングになるのでしょうか?この具体的な例に対する回答は非常にありがたいのですが、1対多と多対多のどちらを使用するのか、結合テーブルと結合カラム、単方向と双方向のどちらを使用するのかという点についても概要を知りたいのです。

どのように解決するのですか?

一対多 : 一人の人間が多くのスキルを持ち、複数の人間の間でスキルが再利用されない。

  • <強い 単方向性 : Personは、Setを介して直接Skillsを参照することができます。
  • 双方向性 : 各スキルの子プロセスへのポインタは1つです。 人物(あなたのコードでは表示されていません。)

多対多 : 一人の人間が多くのスキルを持ち、そのスキルは複数の人間の間で再利用される。

  • <強い 単方向性 : Personは、Setを介して直接Skillsを参照することができます。
  • 双方向性 : スキルには、そのスキルに関連する「人」のセットがあります。

1対多の関係では、1つのオブジェクトがquot;parent"で、1つのオブジェクトがquot;child"である。 親は子の存在をコントロールします。 Many-To-Manyでは、どちらかのタイプの存在が、両者の外部にある何か(より大きなアプリケーションのコンテキスト)に依存しています。

しかし、リレーションシップを一方向にするか双方向にするかは、メモリ、処理、パフォーマンスなどをトレードオフするエンジニアリング上の決定事項であると私は考えています。

混乱しがちなのは、多対多の双方向リレーションシップは対称である必要がないことです! つまり、多くの人があるスキルを指しますが、そのスキルはその人だけに関係する必要はないのです。 一般的にはそうですが、そのような対称性は必要条件ではありません。例えば、愛は双方向性(I-Love", "Loves-Me" )ですが、しばしば非対称性(I love her, but she does not love me")があります!このような非対称性の関係を「愛」と呼びます。

これらはすべて、HibernateとJPAで十分にサポートされています。 ただ、双方向の多対多の関係を管理する場合、Hibernateやその他のORMは対称性を維持することにこだわらないということを覚えておいてください...それはすべてアプリケーション次第です。