La diferencia Entre Uno-a-muchos, Muchos-a-Uno y muchos a Muchos?


Bien, esta es probablemente una pregunta trivial, pero estoy teniendo problemas para visualizar y comprender las diferencias y cuándo usar cada una. También estoy un poco confuso en cuanto a cómo conceptos como las asignaciones unidireccionales y bidireccionales afectan las relaciones de uno a muchos/muchos a muchos. Estoy usando Hibernación en este momento, por lo que cualquier explicación relacionada con OR será útil.

Como ejemplo digamos que tengo la siguiente configuración:

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
}

Así que en este caso, ¿qué tipo de mapeo sería Tengo? Las respuestas a este ejemplo específico son definitivamente apreciadas, pero también me gustaría tener una visión general de cuándo usar uno a muchos y muchos a muchos y cuándo usar una tabla de unión versus una columna de unión y unidireccional versus bidireccional.

Author: Lucky, 2010-06-25

6 answers

Uno a Muchos: Una Persona Tiene Muchas Habilidades, una Habilidad no se reutiliza entre Persona(s)

  • Unidireccional: Una Persona puede hacer referencia directamente a las Habilidades a través de su Conjunto
  • Bidireccional : Cada Habilidad "niño" tiene un solo puntero de vuelta a la Persona (que no se muestra en su código)

Muchos a Muchos: Una Persona Tiene Muchas Habilidades, una Habilidad se reutiliza entre Persona(s)

  • Unidireccional: Una Persona puede hacer referencia directa a las Habilidades a través de su Conjunto
  • Bidireccional: Una Habilidad tiene un Conjunto de Personas que se relacionan con ella.

En una relación Uno-A-Muchos, un objeto es el "padre" y otro es el "hijo". El padre controla la existencia del niño. En Muchos a muchos, la existencia de cualquiera de los dos tipos depende de algo fuera de ambos (en el contexto de aplicación más amplio).

Su objeto (dominio) debe dictar si el la relación es Uno a Muchos o Muchos A Muchos however sin embargo, encuentro que hacer la relación unidireccional o bidireccional es una decisión de ingeniería que intercambia memoria, procesamiento, rendimiento, etc.

Lo que puede ser confuso es que una relación Bidireccional de Muchos a Muchos no necesita ser simétrica! Es decir, un grupo de personas podría señalar una habilidad, pero la habilidad no necesita relacionarse solo con esas personas. Normalmente lo haría, pero tal simetría no es un requisito. Tomar el amor, por ejemplo is es bidireccional ("I-Love", "Loves-Me"), pero a menudo asimétrico ("I love her, but she doesn't love me")!

Todos estos están bien soportados por Hibernate y JPA. Solo recuerde que Hibernate o cualquier otro OR no le importa un bledo mantener la simetría al administrar relaciones bidireccionales de muchos a muchos...todo depende de la aplicación.

 115
Author: HDave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-27 21:30:03

Parece que todo el mundo está respondiendo One-to-many vs Many-to-many:

La diferencia entre One-to-many, Many-to-one y Many-to-Many es:

One-to-many vs Many-to-one es una cuestión de perspectiva. Unidirectional vs Bidirectional no afectará a la asignación, pero marcará la diferencia en cómo puede acceder a sus datos.

  • En One-to-many el lado many mantendrá la referencia del lado one. Un buen ejemplo es "Una persona tiene muchas habilidades". En este caso Person es un lado y Skill es el lado de muchos. Habrá ser una columna person_id en el cuadro skills.
{[34] {} En[48]}unidireccional Person la clase tendrá List<Skill> skills pero Skill no tendrá Person person. En bidireccional ambos se añaden propiedades y le permite acceder a un Person dado un habilidad (es decir, skill.person).
  • En Many-to-one el lado de los muchos será nuestro punto de referencia. Por ejemplo, "Un Usuario tiene una dirección". En nuestro sistema una gran cantidad de usuarios pueden compartir una dirección( un número de personas el mismo número de bloque, por ejemplo). En ese caso, la columna address_id en la tabla users será compartida por más de una fila users. En este caso decimos que users y addresses tienen Many-to-one relación.

En unidireccional a User tendrá Address address. Bidireccional tendrá un List<User> users adicional en la clase Address.

  • En Many-to-Many los miembros de cada parte pueden tener referencia al número arbitrario de miembros de la otra parte. A para ello se utiliza una tabla de búsqueda . Ejemplo de esto es la relación entre médicos y pacientes. Un médico puede tener muchos pacientes y viceversa.
 158
Author: Alexander Suraphel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:27

1) Los círculos son Entidades/POJOs/Beans

2) deg es una abreviatura de grado como en gráficos (número de aristas)

PK = Clave primaria, FK=Clave externa

Note la contradicción entre el grado y el nombre del lado. Muchos corresponden a grado = 1 mientras que Uno corresponde a grado >1.

Ilustración de uno-a-muchos, muchos-a-uno

 28
Author: jhegedus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-01 14:57:09

Echa un vistazo a este artículo: Mapeo de relaciones de objetos

Hay dos categorías de relaciones de objetos que debe tener en cuenta al asignar. La primera categoría se basa en la multiplicidad e incluye tres tipos:

*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 segunda categoría se basa en direccionalidad y contiene dos tipos, relaciones unidireccionales y relaciones bidireccionales.

*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
Author: alejandrobog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-24 21:14:06

Esto probablemente requeriría una relación de muchos a muchos de la siguiente manera



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
}

Es posible que necesite definir una JoinTable + JoinColumn, pero también funcionará sin ella...

 1
Author: msshapira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-24 21:15:52

En primer lugar, lea toda la letra pequeña. Tenga en cuenta que el mapeo relacional NHibernate (por lo tanto, supongo que Hibernate también) tiene una correspondencia divertida con el mapeo de gráficos de objetos y bases de datos. Por ejemplo, las relaciones uno-a-uno a menudo se implementan como una relación muchos-a-uno.

En segundo lugar, antes de que podamos decirle cómo debe escribir su mapa O/R, también tenemos que ver su base de datos. En particular, ¿puede una sola Habilidad ser poseída por varias personas? Si es así, usted tiene una relación de muchos a muchos; de lo contrario, es de muchos a uno.

En tercer lugar, prefiero no implementar relaciones de muchos a muchos directamente, sino modelar la "tabla de unión" en su modelo de dominio i es decir, tratarla como una entidad, así:

class PersonSkill 
{
    Person person;
    Skill skill;    
}

¿Entonces ves lo que tienes? Tienes dos relaciones de uno a muchos. (En este caso, la Persona puede tener una colección de Personascompetencias, pero no tendría una colección de Habilidades.) Sin embargo, algunos preferirán usar la relación de muchos a muchos (entre Persona y Habilidad); esto es controvertido.

En cuarto lugar, si usted tiene relaciones bidireccionales (por ejemplo, no solo la Persona tiene una colección de Habilidades, sino también, la Habilidad tiene una colección de Personas), NHibernate hace no hacer cumplir la bidireccionalidad en su BL para usted; solo entiende la bidireccionalidad de las relaciones con fines de persistencia.

En quinto lugar, muchos a uno es mucho más fácil de usar correctamente en NHibernate (y supongo que Hibernate) que uno a muchos (mapeo de colecciones).

Bueno suerte!

 0
Author: apollodude217,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-24 21:51:48