¿Diferencia entre uno a muchos, muchos a uno y muchos a muchos?

Resuelto Ian Dallas asked hace 14 años • 8 respuestas

Ok, esta es probablemente una pregunta trivial, pero tengo problemas para visualizar y comprender las diferencias y cuándo usar cada una. Tampoco tengo claro cómo conceptos como los mapeos unidireccionales y bidireccionales afectan las relaciones de uno a muchos/de muchos a muchos. Estoy usando Hibernate en este momento, por lo que cualquier explicación relacionada con ORM 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
}

Entonces, en este caso, ¿qué tipo de mapeo tendría? Definitivamente se agradecen las respuestas a este ejemplo específico, pero también me gustaría tener una descripción general de cuándo usar uno a muchos y muchos a muchos y cuándo usar una tabla de combinación versus una columna de combinación y unidireccional versus bidireccional.

Ian Dallas avatar Jun 25 '10 04:06 Ian Dallas
Aceptado

Parece que todos están respondiendo One-to-manyvs Many-to-many.:

La diferencia entre One-to-manyy Many-to-onees Many-to-Many:

One-to-manyvs Many-to-onees una cuestión de perspectiva . Unidirectionalvs Bidirectionalno afectará el mapeo pero marcará la diferencia en cómo puede acceder a sus datos.

  • En Many-to-oneel manylateral se mantendrá la referencia del onelateral. Un buen ejemplo es "Un Estado tiene Ciudades". En este caso Statees el lado uno y Cityes el lado muchos. Habrá una columna state_iden la tabla cities.

En unidireccional , Personla clase tendrá List<Skill> skillspero Skillno tendrá Person person. En bidireccional , se agregan ambas propiedades y le permite acceder a una Personhabilidad determinada (es decir skill.person).

  • Por One-to-Manyun lado estará nuestro punto de referencia. Por ejemplo, "Un usuario tiene direcciones". address_1_idEn este caso , podríamos tener tres columnas address_2_ido address_3_iduna tabla de consulta con una restricción única de varias columnas en user_id on address_id.

En unidireccional , a Usertendrá Address address. Bidireccional tendrá un adicional List<User> usersen la Addressclase.

  • En Many-to-Manymiembros de cada partido puede hacerse referencia a un número arbitrario de miembros del otro partido. Para lograr esto se utiliza una tabla de consulta . Un ejemplo de esto es la relación entre médicos y pacientes. Un médico puede tener muchos pacientes y viceversa.
Alexander Suraphel avatar Nov 12 '2013 08:11 Alexander Suraphel

Uno a muchos : una persona tiene muchas habilidades, una habilidad no se reutiliza entre personas

  • Unidireccional : una persona puede hacer referencia directamente a las habilidades a través de su conjunto.
  • Bidireccional : cada habilidad "secundaria" tiene un único puntero que apunta a la persona (que no se muestra en su código)

Muchos a muchos : una persona tiene muchas habilidades, una habilidad se reutiliza entre personas

  • Unidireccional : una persona puede hacer referencia directamente 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 el otro es el "hijo". El padre controla la existencia del niño. En un modelo de muchos a muchos, la existencia de cualquiera de los tipos depende de algo externo a ambos (en el contexto de la aplicación más amplio).

Su tema (dominio) debe dictar si la relación es uno a muchos o muchos a muchos; sin embargo, creo que hacer que la relación sea unidireccional o bidireccional es una decisión de ingeniería que sacrifica memoria, procesamiento y rendimiento. , etc.

Lo que puede resultar confuso es que una relación bidireccional de muchos a muchos no necesita ser simétrica. Es decir, un grupo de personas podrían señalar una habilidad, pero la habilidad no necesita relacionarse solo con esas personas. Normalmente lo sería, pero esa simetría no es un requisito. Tomemos como ejemplo el amor: es bidireccional ("Yo-Amo", "Me-Ama"), pero a menudo asimétrico ("La amo, pero ella no me ama").

Todos estos están bien respaldados por Hibernate y JPA. Sólo recuerde que a Hibernate o cualquier otro ORM le importa un carajo mantener la simetría cuando se administran relaciones bidireccionales de muchos a muchos... eso depende de la aplicación.

Dave avatar Jun 24 '2010 21:06 Dave