PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Séqueliser hasMany, namesTo ou les deux ?

Utilisation de belongsTo définit la propriété des modèles associés. Pour expliquer cela plus en détail, je me référerai à l'exemple cité dans les tutoriels

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

Supposons que vous n'êtes plus intéressé par les tâches d'un projet supprimé. Dans ce cas, vous auriez à supprimer les tâches manuellement, si vous n'aviez pas défini le belongsTo association. belongsTo établit une propriété des projets sur ses tâches et la base de données supprimera également automatiquement les tâches appartenant au projet supprimé. C'est ce qu'on appelle la cascading delete et peut enchaîner sur plusieurs tables.

Si vous exécutez l'extrait de code suivant

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

dans un script de séquençage et regardez la sortie

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);

vous remarquerez que le comportement en cascade est défini lors de la création du tableau des tâches.

Cela dit, la réponse finale est :ça dépend. L'utilisation de belongsTo peut s'avérer très utile ou fatal si vous préférez conserver les tâches du projet supprimé. Utilisez uniquement belongsTo si cela a du sens dans le contexte de votre application.