sql >> Base de Datos >  >> RDS >> PostgreSQL

Secuela hasMany, pertenece a, o ambos?

Usando belongsTo define la propiedad de los modelos asociados. Para explicar esto con más detalle me referiré al ejemplo citado de los tutoriales

Project.hasMany(Task);
Task.belongsTo(Project);

Suponga que ya no está interesado en las tareas de un proyecto eliminado. En ese caso, tendría que eliminar las tareas manualmente, si no hubiera definido el belongsTo asociación. belongsTo establece la propiedad de los proyectos sobre sus tareas y la base de datos también eliminará automáticamente las tareas que pertenecen al proyecto eliminado. Esto se llama cascading delete y puede encadenar varias tablas.

Si ejecuta el siguiente fragmento de código

const Project = sequelize.define('project', {
    name: Sequelize.STRING
});
const Task =  sequelize.define('task', {
    name: Sequelize.STRING
});
Project.hasMany(Task);
Task.belongsTo(Project);

en una secuencia de comandos y ver la salida

Executing (default): DROP TABLE IF EXISTS `projects`;
Executing (default): CREATE TABLE IF NOT EXISTS `projects` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL);
Executing (default): PRAGMA INDEX_LIST(`projects`)
Executing (default): DROP TABLE IF EXISTS `tasks`;
Executing (default): CREATE TABLE IF NOT EXISTS `tasks` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `projectId` INTEGER REFERENCES `projects` (`id`) ON DELETE SET NULL ON UPDATE CASCADE);

notará que el comportamiento en cascada se establece en la creación de la tabla de tareas.

Dicho tanto, la respuesta final es:depende. El uso de belongsTo puede ser muy útil o puede ser fatal si prefiere mantener las tareas del proyecto eliminado. Solo usa belongsTo si tiene sentido en el contexto de su aplicación.