Différence entre un pour plusieurs, plusieurs pour un et plusieurs pour plusieurs?

Ok donc c'est probablement une question banale mais j'ai du mal à visualiser et à comprendre les différences et quand les utiliser. Je ne sais pas non plus très bien comment des concepts comme les mappages unidirectionnels et bidirectionnels affectent les relations un-à-plusieurs/plusieurs-à-plusieurs. J'utilise hibernation en ce moment donc toute explication liée à L'ORM sera utile.

à titre d'exemple, disons que j'ai la configuration suivante:

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
}

Alors dans ce cas quel type de cartographie aurais-je? Les réponses à cet exemple spécifique sont certainement appréciées, mais je voudrais aussi vraiment un aperçu de quand utiliser soit un à plusieurs et plusieurs à plusieurs et quand utiliser une table de jointure versus une colonne de jointure et unidirectionnelle versus bidirectionnelle.

96
demandé sur Lucky 2010-06-25 01:08:09

6 réponses

One-to-Many : une personne a plusieurs compétences, une compétence n'est pas réutilisée entre personne(s)

  • unidirectionnel : une personne peut directement référencer des compétences via son ensemble
  • bidirectionnel : chaque compétence "enfant" a un seul pointeur de retour vers le haut Personne (qui n'est pas indiquée dans votre code)

plusieurs-à-Plusieurs : une personne a plusieurs compétences, une compétence est réutilisée entre personne (s)

  • unidirectionnel : une personne peut directement référencer des compétences via son ensemble
  • bidirectionnel : une compétence a un ensemble de personnes qui s'y rapportent.

Dans une relation, un seul objet est le "parent" et un "enfant". Le parent contrôle l'existence de enfant. Dans un grand nombre, l'existence de l'un ou l'autre type dépend de quelque chose en dehors des deux (dans le contexte plus large de l'application).

votre sujet (domaine) devrait dicter si oui ou non la relation est un-à-plusieurs ou plusieurs-à-plusieurs -- cependant, je trouve que faire la relation unidirectionnelle ou bidirectionnelle est une décision d'ingénierie qui échange la mémoire, le traitement, la performance, etc.

ce qui peut prêter à confusion est qu'une relation bidirectionnelle de plusieurs à plusieurs n'a pas besoin d'être symétrique! C'est, un tas de Gens qui pourraient indiquer une compétence, mais la compétence n'a pas besoin de se rapporter uniquement à ces personnes. En général, il serait, mais cette symétrie n'est pas une exigence. Prendre l'amour, par exemple, il est bi-directionnelle ("I-Love", "Aime-Moi"), mais souvent asymétrique ("je l'aime, mais elle ne m'aime pas")!

tous ceux-ci sont bien supportés par Hibernate et JPA. Souviens-toi de cet hibernant ou de n'importe qui. d'autres ORM ne se soucient pas de maintenir la symétrie dans la gestion bidirectionnelle des relations de plusieurs à plusieurs...c'est tout jusqu'à l'application.

115
répondu HDave 2016-07-27 21:30:03

on dirait que tout le monde répond One-to-many vs Many-to-many :

la différence entre One-to-many , Many-to-one et Many-to-Many est:

One-to-many vs Many-to-one est une question de perspective . Unidirectional vs Bidirectional n'affectera pas la cartographie, mais fera une différence sur la façon dont vous pouvez accéder à vos données.

  • Dans One-to-many le many side conservera la référence du côté one . Un bon exemple est "Une personne possède de nombreuses compétences". Dans ce cas Person est un côté et Skill est le côté beaucoup. Il y aura une colonne person_id dans le tableau skills .

Dans unidirectionnel Person classe List<Skill> skills mais Skill n'aura pas Person person . Dans bidirectionnel les deux les propriétés sont ajoutées et il vous permet d'accéder à un Person un compétence( c'est à dire skill.person ).

  • Dans Many-to-one du côté "plusieurs" sera notre point de référence. Par exemple, "Un Utilisateur a une Adresse". Dans notre système, beaucoup d'utilisateurs peuvent partager une adresse( un certain nombre de personnes peuvent partager le même numéro de bloc, par exemple). Dans ce cas, la colonne address_id de la table users est partagée par plusieurs users lignes. Dans ce cas, nous disons que users et addresses ont Many-to-one relation.

Dans unidirectionnel un User aura Address address . bidirectionnel aura un List<User> users supplémentaire dans la classe Address .

158
répondu Alexander Suraphel 2017-05-23 10:31:27

1) les cercles sont Entities/POJOs/Beans

2) deg est une abréviation pour le degré que dans les graphiques (nombre d'arêtes)

PK=clé primaire, FK =clé étrangère

notez la contradiction entre le degré et le nom du côté. Plusieurs correspondent à un degré=1 tandis qu'un correspond à un degré >1.

Illustration of one-to-many many-to-one

28
répondu jhegedus 2017-03-01 14:57:09

regardez cet article: Mapping Object Relationships

il y a deux catégories de relations objet dont vous devez tenir compte lors de la cartographie. La première catégorie est basée sur la multiplicité et elle comprend trois types:

*One-to-one relationships.  This is a relationship where the maximums of each of its multiplicities is one, an example of which is holds relationship between Employee and Position in Figure 11.  An employee holds one and only one position and a position may be held by one employee (some positions go unfilled).
*One-to-many relationships. Also known as a many-to-one relationship, this occurs when the maximum of one multiplicity is one and the other is greater than one.  An example is the works in relationship between Employee and Division.  An employee works in one division and any given division has one or more employees working in it.
*Many-to-many relationships. This is a relationship where the maximum of both multiplicities is greater than one, an example of which is the assigned relationship between Employee and Task.  An employee is assigned one or more tasks and each task is assigned to zero or more employees. 

La deuxième catégorie est basée sur directionalité et contient deux types, relations unidirectionnelles et relations bidirectionnelles.

*Uni-directional relationships.  A uni-directional relationship when an object knows about the object(s) it is related to but the other object(s) do not know of the original object.  An example of which is the holds relationship between Employee and Position in Figure 11, indicated by the line with an open arrowhead on it.  Employee objects know about the position that they hold, but Position objects do not know which employee holds it (there was no requirement to do so).  As you will soon see, uni-directional relationships are easier to implement than bi-directional relationships.
*Bi-directional relationships.  A bi-directional relationship exists when the objects on both end of the relationship know of each other, an example of which is the works in relationship between Employee and Division.  Employee objects know what division they work in and Division objects know what employees work in them. 
6
répondu alejandrobog 2010-06-24 21:14:06

cela nécessiterait probablement une relation de plusieurs à plusieurs comme suit



public class Person{

    private Long personId;
    @manytomany

    private Set skills;
    //Getters and setters
}

public class Skill{
    private Long skillId;
    private String skillName;
    @manyToMany(MappedBy="skills,targetClass="Person")
    private Set persons; // (people would not be a good convenion)
    //Getters and setters
}

vous pouvez avoir besoin de définir une joinTable + JoinColumn mais il sera possible de travailler aussi sans...

1
répondu msshapira 2010-06-24 21:15:52

tout d'Abord, lire tous les petits caractères. Notez que la cartographie relationnelle de NHibernate (donc, je suppose, Hibernate aussi) a une correspondance amusante avec la cartographie de DB et de graphe objet. Par exemple, les relations individuelles sont souvent mises en œuvre sous la forme d'une relation individuelle.

Deuxièmement, avant que nous puissions vous dire comment vous devez écrire votre carte O/R, Nous devons voir votre DB aussi. En particulier, une seule Compétence être possède par plusieurs personnes? Si donc, vous avez une relation de plusieurs à plusieurs; autrement, c'est une relation de plusieurs à un.

Troisièmement, je préfère ne pas mettre en œuvre les relations de plusieurs à plusieurs directement, mais plutôt modéliser la "table de jointure" dans votre modèle de domaine--i.e., le traiter comme une entité, comme ceci:

class PersonSkill 
{
    Person person;
    Skill skill;    
}

alors voyez-vous ce que vous avez? Tu as deux relations un-pour-plusieurs. (Dans ce cas, la personne peut avoir un ensemble de compétences personnelles, mais n'aurait pas un ensemble de compétences.) Toutefois, certains préféreront pour utiliser la relation de plusieurs à plusieurs (entre la personne et la compétence); ceci est controversé.

Quatrièmement, si vous avez des relations bidirectionnelles (par exemple, non seulement la personne a un ensemble de compétences, mais aussi, la compétence a un ensemble de personnes), NHibernate ne pas appliquer la bidirectionnalité dans votre BL pour vous; il ne comprend la bidirectionnalité des relations à des fins de persistance.

Cinquièmement, beaucoup-à-un est beaucoup plus facile à utiliser correctement à NHibernate (et je suppose Hibernate) qu'à one-to-many (cartographie de collection).

bonne chance!

0
répondu apollodude217 2010-06-24 21:51:48