¿Diferencia entre uno a muchos, muchos a uno y muchos a muchos?
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.
Parece que todos están respondiendo One-to-many
vs Many-to-many
.:
La diferencia entre One-to-many
y Many-to-one
es Many-to-Many
:
One-to-many
vs Many-to-one
es una cuestión de perspectiva . Unidirectional
vs Bidirectional
no afectará el mapeo pero marcará la diferencia en cómo puede acceder a sus datos.
- En
Many-to-one
elmany
lateral se mantendrá la referencia delone
lateral. Un buen ejemplo es "Un Estado tiene Ciudades". En este casoState
es el lado uno yCity
es el lado muchos. Habrá una columnastate_id
en la tablacities
.
En unidireccional ,
Person
la clase tendráList<Skill> skills
peroSkill
no tendráPerson person
. En bidireccional , se agregan ambas propiedades y le permite acceder a unaPerson
habilidad determinada (es decirskill.person
).
- Por
One-to-Many
un lado estará nuestro punto de referencia. Por ejemplo, "Un usuario tiene direcciones".address_1_id
En este caso , podríamos tener tres columnasaddress_2_id
oaddress_3_id
una tabla de consulta con una restricción única de varias columnas enuser_id
onaddress_id
.
En unidireccional , a
User
tendráAddress address
. Bidireccional tendrá un adicionalList<User> users
en laAddress
clase.
- En
Many-to-Many
miembros 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.
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.