web-dev-qa-db-fra.com

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

Ok, donc c’est probablement une question triviale, mais j’ai du mal à visualiser et à comprendre les différences et à savoir quand les utiliser. Je ne comprends pas non plus clairement comment des concepts tels que les mappages unidirectionnels et bidirectionnels affectent les relations un à plusieurs/plusieurs à plusieurs. J'utilise Hibernate maintenant, donc toute explication liée à ORM sera utile.

A 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
}

Donc, dans ce cas, quel type de cartographie aurais-je? Les réponses à cet exemple spécifique sont certainement appréciées, mais j'aimerais aussi vraiment savoir quand utiliser un à plusieurs et plusieurs à plusieurs et quand utiliser une table de jointure par opposition à une colonne de jointure et unidirectionnel par rapport à bidirectionnel.

121
Ian Dallas

n-à-plusieurs: une personne a plusieurs compétences, une compétence n'est pas réutilisée entre personnes

  • nidirectionnel: Une personne peut directement référencer des compétences via son ensemble
  • bidirectionnel: chaque compétence "enfant" a un seul pointeur sur la personne (ce qui n'est pas indiqué dans votre code)

Plusieurs à plusieurs: Une personne a plusieurs compétences, une compétence est réutilisée entre personnes.

  • nidirectionnel: Une personne peut directement référencer des compétences via son ensemble
  • bidirectionnel: Une compétence a un ensemble de personnes qui la concerne.

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

Votre domaine (domaine) doit dicter si la relation est un-à-plusieurs ou plusieurs-à-plusieurs - cependant, je trouve que rendre la relation unidirectionnelle ou bidirectionnelle est une décision technique qui échange la mémoire, le traitement et les performances. , etc.

Ce qui peut être déroutant, c'est qu'une relation bidirectionnelle plusieurs à plusieurs n'a pas besoin d'être symétrique! Autrement dit, un groupe de personnes pourrait désigner une compétence, mais cette compétence ne doit pas nécessairement concerner uniquement ces personnes. En règle générale, ce serait le cas, mais une telle symétrie n'est pas une exigence. Prenez l'amour, par exemple, il est bidirectionnel ("I-Love", "Loves-Me"), mais souvent asymétrique ("Je l'aime, mais elle ne m'aime pas")!

Tout cela est bien supporté par Hibernate et JPA. N'oubliez pas que Hibernate ou tout autre ORM n'aiment pas garder la symétrie lors de la gestion de relations bidirectionnelles plusieurs-à-plusieurs ... cela dépend de l'application.

144
HDave

On dirait que tout le monde répond One-to-many contre Many-to-many:

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

One-to-many contre Many-to-one est une question de perspective . Unidirectional vs Bidirectional n'affectera pas le mappage, mais changera la façon dont vous pouvez accéder à vos données.

  • Dans One-to-many _ le côté many gardera la référence du côté one. Un bon exemple est "Une personne a beaucoup de compétences". Dans ce cas, Person est le côté unique et Skill est le côté multiple. Il y aura une colonne person_id dans la table skills.

Dans unidirectionnelPerson la classe aura List<Skill> skills mais Skill n'aura pas Person person. Dans bidirectional les deux propriétés sont ajoutées et vous permettent d'accéder à un Person donné une compétence (c'est-à-dire skill.person).

  • Dans Many-to-one le côté multiple sera notre point de référence. Par exemple, "Un utilisateur a une adresse". Dans notre système, de nombreux utilisateurs peuvent partager une adresse (par exemple, un certain nombre de personnes peuvent partager le même numéro de bloc). Dans ce cas, le address_id La colonne _ dans la table users sera partagée par plus d'une rangée users. Dans ce cas, on dit que users et addresses ont Many-to-one relation.

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

  • Dans Many-to-Many Les membres de chaque partie peuvent faire référence à un nombre arbitraire de membres de l’autre partie. Pour ce faire, un table de consultation est utilisé. Exemple pour cela est la relation entre les médecins et les patients. Un médecin peut avoir beaucoup de patients et vice versa.
202
Alexander Suraphel

1) Les cercles sont des entités/POJO/haricots

2) deg est une abréviation de degree comme dans les graphes (nombre d'arêtes)

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

Notez la contradiction entre le degré et le nom du côté. Beaucoup correspond à degré = 1 tandis que One correspond à degré> 1.

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

33
jhegedus

Jetez un oeil à cet article: Mapping Object Relationships

Vous devez vous préoccuper de deux catégories de relations d’objet lors du mappage. La première catégorie est basée sur la multiplicité et 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 la directionnalité et contient deux types, les relations unidirectionnelles et les 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. 
7
alejandrobog

cela nécessiterait probablement une relation 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 devrez peut-être définir un joinTable + JoinColumn mais cela fonctionnera aussi sans ...

1
msshapira

Tout d’abord, lisez tous les détails. Notez que NHibernate (et donc aussi Hibernate, je suppose), le mappage relationnel présente une correspondance amusante avec le mappage de la base de données et du graphe des objets. Par exemple, les relations un à un sont souvent implémentées en tant que relations plusieurs à un.

Deuxièmement, avant de pouvoir vous dire comment écrire votre carte O/R, nous devons également consulter votre base de données. En particulier, une compétence peut-elle être possédée par plusieurs personnes? Si c'est le cas, vous avez une relation plusieurs à plusieurs; sinon, c'est plusieurs-à-un.

Troisièmement, je préfère ne pas implémenter directement les relations plusieurs à plusieurs, mais plutôt modéliser la "table de jointure" dans votre modèle de domaine - c'est-à-dire la traiter comme une entité, comme ceci:

class PersonSkill 
{
    Person person;
    Skill skill;    
}

Alors voyez-vous ce que vous avez? Vous avez deux relations un à plusieurs. (Dans ce cas, Person peut avoir une collection de PersonSkills, mais pas une collection de Compétences.) Cependant, certains préféreront utiliser une relation plusieurs à plusieurs (entre Personne et Compétence); c'est controversé.

Quatrièmement, si vous avez des relations bidirectionnelles (par exemple, non seulement Person a-t-il une collection de compétences, mais également Skill a-t-il une collection de personnes), NHibernate ne fait pas appliquer la bidirectionalité à votre BL; il ne comprend la bidirectionalité des relations que pour des raisons de persistance.

Cinquièmement, il est beaucoup plus facile d’utiliser correctement plusieurs utilisateurs sur NHibernate (et je suppose Hibernate) que l’un-à-plusieurs (mappage de collection).

Bonne chance!

0
apollodude217