PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Sequelize hasMany, belongsTo ou ambos?


Usando belongsTo define a propriedade dos modelos associados. Para explicar isso com mais detalhes, vou me referir ao exemplo citado nos tutoriais
Project.hasMany(Task);
Task.belongsTo(Project);

Suponha que você não esteja mais interessado nas tarefas de um projeto excluído. Nesse caso, você teria que excluir as tarefas manualmente, se não tivesse definido o belongsTo Associação. belongsTo estabelece uma propriedade de projetos sobre suas tarefas e o banco de dados também excluirá automaticamente as tarefas pertencentes ao projeto excluído. Isso é chamado de cascading delete e pode encadear em várias tabelas.

Se você executar o seguinte trecho 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);

em um script de sequela e observe a saída
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);

você notará o comportamento em cascata sendo definido na criação da tabela de tarefas.

Tanto dito, a resposta final é:depende. O uso de belongsTo pode ser muito útil ou será fatal se você preferir manter as tarefas do projeto excluído. Use apenas belongsTo se fizer sentido no contexto da sua aplicação.