Знаешь ли ты теорию баз данных?

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

Ответ

Да, я работал с различными СУБД в экосистеме Node.js и понимаю ключевые теоретические концепции.

1. Реляционная модель и SQL (PostgreSQL, MySQL):

  • Схемы, таблицы, связи (1:1, 1:M, M:M). При проектировании API на Node.js я использую ORM, такие как Sequelize или TypeORM, которые отражают эти связи в моделях.
  • Нормализация: Следовал правилам (1NF, 2NF, 3NF) для устранения аномалий при вставке, обновлении и удалении. Например, выносил повторяющиеся данные (названия городов) в отдельную таблицу.
  • Транзакции и ACID: Использовал транзакции для обеспечения атомарности операций. Например, при регистрации пользователя нужно создать запись в таблице users и начальный профиль в profiles — либо создаётся всё, либо ничего.
    // Пример с Sequelize
    const transaction = await sequelize.transaction();
    try {
    const user = await User.create({ email: 'test@mail.com' }, { transaction });
    await Profile.create({ userId: user.id, name: 'Test' }, { transaction });
    await transaction.commit(); // Фиксация только здесь
    } catch (error) {
    await transaction.rollback(); // Откат в случае ошибки
    }
  • Индексы: Создавал индексы (B-деревья) для ускорения поиска по часто запрашиваемым полям (WHERE email = ...), понимая компромисс с производительностью записи.

2. NoSQL (MongoDB с Mongoose):

  • Работал с документной моделью, где данные хранятся в виде JSON-подобных документов. Это хорошо подходит для схем, которые часто меняются.
  • Понимаю принципы CAP-теоремы (Consistency, Availability, Partition Tolerance). Например, MongoDB в конфигурации по умолчанию ориентирована на доступность и устойчивость к разделению (AP).

3. Производительность:

  • Анализировал и оптимизировал медленные запросы с помощью EXPLAIN в PostgreSQL или методов .explain() в Mongoose.
  • Использовал кэширование результатов частых запросов в Redis для снижения нагрузки на основную БД.