Что такое Foreign Key в контексте работы с базами данных в Node.js?

«Что такое Foreign Key в контексте работы с базами данных в Node.js?» — вопрос из категории Базы данных, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Foreign Key (внешний ключ) — это ограничение целостности в реляционных базах данных, которое обеспечивает ссылочную связь между таблицами. При разработке на Node.js с использованием ORM типа Sequelize или query builder типа Knex, внешние ключи гарантируют согласованность данных.

Пример реализации с Sequelize:

// Модель User
const User = sequelize.define('User', {
  id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
  name: DataTypes.STRING
});

// Модель Post с Foreign Key
const Post = sequelize.define('Post', {
  id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
  title: DataTypes.STRING,
  content: DataTypes.TEXT,
  userId: {
    type: DataTypes.INTEGER,
    references: {
      model: User, // Ссылка на таблицу Users
      key: 'id'
    },
    onDelete: 'CASCADE' // Удаление постов при удалении пользователя
  }
});

// Определение связи
User.hasMany(Post, { foreignKey: 'userId' });
Post.belongsTo(User, { foreignKey: 'userId' });

Практическое применение в Node.js:

  • При миграциях с Knex:
    exports.up = function(knex) {
    return knex.schema.table('orders', function(table) {
    table.integer('customer_id').unsigned();
    table.foreign('customer_id').references('id').inTable('customers');
    });
    };
  • В REST API я проверяю существование связанных сущностей перед созданием записей.
  • Использую каскадное удаление (ON DELETE CASCADE) для автоматической очистки зависимых данных.
  • В сложных запросах JOIN опираюсь на внешние ключи для эффективного получения связанных данных.