¿Cómo se gestionan las relaciones uno a uno en bases de datos?
Entender las relaciones uno a uno en bases de datos es crucial para cualquier desarrollador. Este tipo de relación permite que cada fila en una tabla esté relacionada únicamente con una fila en otra tabla. Este artículo explora cómo se manejan estas relaciones en los servicios y qué pasos seguir para asegurar que no haya inconsistencias en tu base de datos.
¿Por qué surge el problema de duplicación en relaciones uno a uno?
Cuando no se establece adecuadamente una restricción de unicidad en las relaciones uno a uno, se pueden presentar duplicaciones no deseadas. Por ejemplo, al crear múltiples clientes asociados al mismo usuario, no lograrás una relación efectiva de uno a uno. Para solucionar esto, es esencial hacer que el campo de usuario sea único en el modelo de tu base de datos.
¿Cómo crear una migración para ajustar el modelo?
Para establecer el campo user_id como único y prevenir duplicaciones, debes correr una migración. Las migraciones son cambios estructurados en tu base de datos que puedes gestionar con herramientas como npm. Genera la migración con:
npm migrations generate change_user_id
Y en el archivo de migración, usa la función changeColumn para asignar la propiedad unique. Ten en cuenta que una vez que establezcas esta regla, necesitarás quitar cualquier dato repetido en tu base de datos antes de ejecutar la migración, o recibirás un error.
¿Cómo se resuelven las relaciones de manera anidada?
Al usar modelos con alias, como belongsTo, puedes resolver las asociaciones de manera anidada. Esto te permitirá obtener la información completa de un cliente y su usuario en una sola solicitud:
customerService.findAll({include:['user']});
¿Cómo generar asociaciones bidireccionales en SQLite?
Es posible que desees no solo enlazar datos desde clientes hacia usuarios, sino también hacerlo en la dirección opuesta, creando asociaciones bidireccionales. Para lograr esto, usa el método hasOne en el modelo de usuario:
Con esto, puedes realizar consultas desde ambos modelos y obtener rápidamente las relaciones completas.
¿Cómo optimizar la creación de datos enlazados?
SQLite permite simplificar la creación de datos asociados gracias a las asociaciones. Puedes crear un usuario y cliente dentro del mismo endpoint sin tener que solicitar previamente el user_id:
En el modelo, asegúrate de incluir las asociaciones necesarias para que, al enviar datos anidados, el sistema reconozca automáticamente qué debe crear y cómo relacionarlo.
Esta metodología no solo mejora la eficiencia de tus aplicaciones, sino que también mejora la claridad y mantenibilidad del código.
de esta forma si en un futuro se agrega un validador al user schema no habia que hacer nada en el customer schema
Algo así estaba buscando :D
Eres un crack bro, gracias por el aporte!
Para modificar una columna se usa el método changeColumn en el boilerplate de la migración, seguido del nombre de la tabla y de la columna que se desea modificar y poniendo los atributos que definirán la nueva columna.
Con esos cambios se vuelve a correr la migración, nota que en caso de que existan campos repetidos, no se permitirá correr la migración porque rompe con la nueva regla del campo unique. Manualmente se debe ir a la BD y arreglar esos índices.
Hecho esto se corre la migración.
Cuando se hace el request para obtener los customers, se hace el llamado a la asociación en el método find de customers.service.js. Ahí se incluye el alias de la asociación asignada en el modelo de customer:
Como puede ser una forma de tener las dos cosas? Me refiero a que el ultimo cambio del video nos quito la posibilidad de poder crear un Customer con ya un usuario creado.
Creo que es porque en las reglas de modelamiento de BD, en una relacion uno a uno las dos tablas se transforman en una sola. Creo que estaban creadas como ejemplo.
O no se, yo también me mareé 😵
Esa misma pregunta me hago, ¿seria con un condicional o con otro endpoint?
Programación declarativa en su máximo esplendor con sequelize! 🍾🥂
Si tu entidad tiene varias relaciones puedes retornarlas todas con:
.findAll({include:[{all:true}]})
Me doy cuenta que si hay error al crear el custumer pero no al crear el usuario, me crea el usuario pero no el custumer, como puedo evitar que esto pase ?
duré como 2 dias en ese error eso si me da rabia , porq aun la documentacion esta mala
Al querer ejecutar una migración en la que se creen dos las dos tablas users y customers con su campo userId, me genera este error:
== 20230713161412-create--user--person: migrating =======
ERROR: Cannot add foreign key constraint.
llevo dos semanas estancado, y la unica solución que encontré es, que en el campo userId cambiar la propiedad, allowNull a true. Pero que no es lo correcto ayuda por favor
Encontraste la respuesta a esta pregunta? Estoy en la misma situación y no logo resolver ese error.
Para cumplir el patrón de unica responsabilidad en cada servicio, no es mejor crear una instancia del UserService y usarla para crear el usuario dentro del servicio de Customers y ahí si crear el customer con la info recibida por el servicio del usuario?
Hola... cuando intento guardar un customer y un usuario, me sale esto (Customer.userId cannot be null)... cómo puedo solucionarlo?. Gracias
disculpa lo resolviste?
Hola, ¿cómo tienes tu servicio de customer en el método create?
y ¿cómo tienes tus asociaciones del user.model.js y customer.model.js?
Les comparto como resolvi la migracion para agregar el constraint unique al user_id que si tiene la capacidad de hacer rollback:
en últimas siempre es mejor hacer un npm run migrations:revert para evitar todas esas migraciones, claro es bien importante conocer cómo se haría una migración de este tipo, así que a nivel educativo está bien
Si estas en desarrollo si puedes hacer un revert sin problema, pero imagina el caso que tienes el proyecto en producción, NO puedes hacer un revert, tienes que saber como introducir el cambio creando una nueva migración, ya que no puedes afectar los datos que ya estan en la base de datos.
Tienes toda la razón, no lo había visto desde ese punto.
Acabo de terminar el modulo 16 y les comento: el archivo customer.schema.js que esta en los recursos del modulo, es diferente al del curso, hay que eliminar los campos de email y password, de lo contrario no identifica el id. Hasta ahora las dificultades mas grandes han sido por: las rutas, la sintaxis(el profesor una veces escribe customers y otras customer), no he tenido dificultades por las librerias(las cuales instalo agregando:@latest) y lo antiguo de la version node (estoy usando la v 18), y el puerto de la ip, no tengo informacion de ingeniero, espero les sirva
Hola, gracias por lo del customer.schema, estuve viendo y el customers.service tambien es diferente, tenia un error y lo resolvi gracias a eso.
Importante!!
Observación sobre como correr migraciones que modifican restricciones/constraints en bases de datos
Muy grave la discordancia entre el código que se escribe en curso y lo que está en el GitHub. Mete en duda, el cuidado que se tiene por la elaboración de las clases y hasta si es verdad que le corre o no el código al profesor
DE ACUERDO CONTIGO , ESTE CURSO LE DARE 1 ESTRELLA !!!!!!!!!!!!!!!
Hola a todos, en sequelize se puede aplicar el include a findByPK?
Agregas en la parte de findByPk
...findByPk(id,{include:['customer']})
la parte de "customer" es solo un ejemplo, depende de tus relaciones en el proyecto.
Como podría crear una index?
Tengo el siguiente error: no puedo crear el usuario desde customers
{
"statusCode": 409,
"message": "SequelizeValidationError",
"errors": [
{
"message": "Customer.userId cannot be null",
"type": "notNull Violation",
... ... ...
]
}
OK, después de terminar de ver el video y aplicar el cambio en customers.services, funciona perfecto
Tengo un error con la migración Algien me puede ayudar?
TypeError: Cannot read properties of undefined (reading 'schema')
¡Hola! :D
¿Cuál es el problema que tienes?, ¿en qué te puedo ayudar? Compártenos tu código por favor. Puedes adjuntar imágenes arrastrándolas a esta ventana de comentario.
Nunca pares de aprender 💚
gracias amigo del platzi, hace 6 meses hay otra persona que necesito ayuda y nadie le ayudo, que gran ayuda