Relaciones uno a uno en bases de datos relacionales

Clase 16 de 27Curso de Backend con Node.js: Base de Datos con PostgreSQL

Resumen

¿Cómo se construyen relaciones uno a uno en bases de datos relacionales?

Iniciemos integrándonos al mundo de las bases de datos relacionales, enfocándonos específicamente en las relaciones uno a uno (one-to-one relationships). Este tipo de relación es fundamental al diseñar bases de datos. Tomemos el ejemplo de vincular un cliente específico con un único usuario en un sistema de gestión. Aquí exploraremos cómo implementar esta relación utilizando la herramienta Sicolabs.

¿Cuáles son las formas de expresar relaciones uno a uno?

Para establecer una relación uno a uno, Sicolabs nos ofrece dos métodos básicos:

  • hasOne: Este método se emplea cuando queremos que la entidad B, por ejemplo, User, cargue con la relación.
  • belongsTo: Lo utilizamos si queremos que sea la entidad A, en nuestro caso Customer, quien cargue con esta relación.

En el escenario propuesto, necesitamos que Customer esté asociado con un único usuario y que la relación se establezca desde Customer usando belongsTo.

¿Cómo implementar el modelo, servicio y rutas para Customer?

Para trabajar con un nuevo modelo, como la tabla Customers, se debe llevar a cabo una serie de pasos fundamentales. Vamos a desglosarlos:

  1. Definición del modelo de Customer:

    // Definición del modelo Customer
    const CustomerSchema = new Schema({
        id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
        name: { type: DataTypes.STRING, allowNull: false },
        last_name: { type: DataTypes.STRING, allowNull: false },
        phone: { type: DataTypes.STRING, allowNull: false },
        created_at: { type: DataTypes.DATE, defaultValue: DataTypes.NOW }
    });
    

    Asegúrate de agregar las asociaciones, donde definiremos belongsTo para establecer la relación con User.

  2. Configuración y registro del modelo: Registrar el modelo dentro del archivo índice donde se gestionan todas las entidades es otro paso crucial:

    const Customer = sequelize.define('Customer', CustomerSchema);
    
    Customer.associate = function(models) {
        Customer.belongsTo(models.User, { as: 'user' });
    };
    
  3. Implementación de servicios: El servicio asociado al modelo Customers debe implementar las operaciones CRUD necesarias, poniendo especial atención a la correcta manipulación de las relaciones.

  4. Definición de rutas y esquemas de validación: Las rutas deben validar la información de entrada mediante esquemas previos, asegurando una operación consistente y segura.

¿Cómo se construye y ejecuta una migración?

Una vez definidos los modelos y servicios, construimos las migraciones para capturar la estructura en la base de datos física:

  • Generamos la migración:

    sequelize migration:generate --name create-customers-table
    
  • Modificamos la migración para incluir el esquema de Customer: En el archivo de migración generado, debes definir la estructura de la tabla:

    up: (queryInterface, Sequelize) => {
        return queryInterface.createTable('Customers', {
            id: {
                type: Sequelize.INTEGER,
                primaryKey: true,
                autoIncrement: true
            },
            name: {
                type: Sequelize.STRING,
                allowNull: false
            },
            userId: {
                type: Sequelize.INTEGER,
                references: {
                    model: 'Users',
                    key: 'id'
                },
                onUpdate: 'CASCADE',
                onDelete: 'SET NULL'
            }
        });
    }
    
  • Ejecutamos la migración:

    sequelize db:migrate
    

¿Cómo se realiza la creación de un cliente relacionado a un usuario?

Finalmente, en el servicio, al crear un cliente, asegúrate de verificar y utilizar las claves foráneas adecuadas:

Customer.create({
    name: 'John',
    last_name: 'Doe',
    phone: '1234567890',
    userId: 1  // Asociado al usuario ya creado
});

Esta implementación te permitirá tener una base sólida para gestionar relaciones básicas e iniciar un camino más avanzado en el manejo de bases de datos relacionales. Continúa aprendiendo y practicando para afianzar estos conceptos y abrirte a proyectos de mayor complejidad. ¡Sigue adelante!