Relaciones Muchos a Muchos con Campos Agregados en TimeWareM
Clase 25 de 36 • Curso de NestJS: Persistencia de Datos con TypeORM
Resumen
¿Cómo se manejan las relaciones muchos a muchos con campos adicionales en TimeWareM?
Las relaciones muchos a muchos son frecuentes en el desarrollo de aplicaciones, y TimeWareM facilita su implementación mediante el decorador many-to-many
. Sin embargo, cuando necesitamos añadir campos adicionales a estas relaciones, la herramienta se queda corta y nos exige crear y manejar manualmente la entidad correspondiente. Aquí se explora cómo hacer esto usando como ejemplo una orden de compra que incluye productos con cantidades específicas.
¿Por qué crear una tabla ternaria personalizada?
TimeWareM proporciona una solución eficaz para manejar relaciones básicos muchos a muchos, como en el caso de productos pertenecientes a una categoría o viceversa. Estas tablas automáticamente generadas contienen solo los IDs de las entidades relacionadas. Sin embargo, al manejar pedidos de compra que incluyen cantidades de productos, se requiere un campo adicional para almacenar, por ejemplo, la cantidad solicitada de cada producto en un pedido. En estos casos, es necesario crear una tabla ternaria manejada manualmente, lo que permite personalizar completamente los campos que componen dicha relación.
¿Cómo se implementa la entidad personalizada?
-
Definición de la clase: Crearemos una clase
OrderProduct
que represente esta tabla ternaria manual. Usamos el decoradorEntity
y otros comoPrimaryGeneratedColumn
para el id autogenerado, yColumn
para definir atributos adicionales comoquantity
.@Entity() export class OrderProduct { @PrimaryGeneratedColumn() id: number; @ManyToOne(() => Product) product: Product; @ManyToOne(() => Order) order: Order; @Column() quantity: number; }
-
Configuración de relaciones: La relación es implícitamente uno a muchos dentro de la entidad
OrderProduct
, permitiendo enlazar cada producto a su pedido correspondiente. UtilizamosManyToOne
para especificar la relación con las entidadesProduct
yOrder
. -
Manejo de las relaciones bidireccionales: Decidimos dónde se requiere una relación bidireccional, como entre
Order
yOrderItem
, y cuándo una relación unidireccional es suficiente.@OneToMany(() => OrderItem, orderItem => orderItem.order) items: OrderItem[];
¿Cómo afecta esto al procesamiento de datos?
Crear manualmente una tabla ternaria permite controlar finamente cómo se gestionan los datos adicionales, como cantidades, pero prescinde de algunas automatizaciones de TimeWareM, como el uso fácil de métodos de Arrays para manipular las relaciones. Sin embargo, este enfoque ofrece:
- Mayor flexibilidad: Permite definir exactamente qué información se necesita almacenar en la relación y cómo acceder a ella.
- Mejor control de los datos: Se puede desarrollar lógica de negocio precisa para manejar las entidades y sus relaciones.
¿Cómo se agregan o eliminan elementos en la relación?
Al tener control manual sobre la relación, añadir o eliminar elementos se realiza mediante consultas personalizadas en lugar de métodos de Arrays automáticos. Esto implica realizar operaciones explícitas en la base de datos, lo que brinda:
- Control preciso de la lógica y los datos, aunque es necesario implementar lógica adicional para dichas operaciones.
- Manipulación directa de la entidad, permitiendo gestionar exactamente qué y cómo se relacionan los datos.
El proceso alienta la comprensión más profunda de las relaciones de datos y habilita la personalización completa del manejo de la lógica de negocio detrás de estas operaciones.
Consejos para manejar tablas ternarias personalizadas
Para nuevos estudiantes y desarrolladores, dominar estos conceptos puede abrir muchas puertas:
- Practica a menudo, creando varias tablas ternarias para diferentes escenarios de negocio.
- Explora las relaciones y cómo TimeWareM gestiona los datos por defecto para comprender mejor lo que se puede lograr mediante personalización.
- Experimenta con scripts de migración para observar cambios en la estructura y ver en acción cómo se integran todas las partes del rompecabezas.
Este conocimiento no solo mejorará tus habilidades como desarrollador, sino que también proporcionará una fuerte base para construir aplicaciones robustas y escalables.