декабря 21, 2025
17 мин. чтения

Вопросы для собеседования на позицию младшего Backend-разработчика (Node.js): Полное руководство

interview
career-advice
job-search
entry-level
Вопросы для собеседования на позицию младшего Backend-разработчика (Node.js): Полное руководство
MB

Milad Bonakdar

Автор

Освойте backend-разработку на Node.js с помощью 35 важнейших вопросов для собеседования, охватывающих основы JavaScript, асинхронное программирование, Express.js, базы данных, API, безопасность и многое другое. Идеальная подготовка к собеседованиям на позицию младшего backend-разработчика.


Введение

Это подробное руководство содержит 35 тщательно отобранных вопросов для собеседования, охватывающих основы бэкенд-разработки на Node.js. Это вопросы, с которыми разработчики бэкенда уровня junior действительно сталкиваются на собеседованиях. Каждый вопрос включает в себя подробный ответ, оценку редкости и рейтинг сложности, основанный на анализе сотен реальных собеседований в крупных технологических компаниях и стартапах.

Независимо от того, готовитесь ли вы к своей первой роли бэкенд-разработчика или переходите из фронтенд-разработки, это руководство охватывает все: от основ JavaScript до проектирования API, управления базами данных, лучших практик безопасности и стратегий развертывания.


Основы JavaScript (8 вопросов)

1. Объясните разницу между var, let и const в JavaScript

Ответ:

  • var: Область видимости - функция, поднимается (hoisted) и инициализируется как undefined, может быть переопределена в той же области видимости, в значительной степени устарела в современном коде.
  • let: Область видимости - блок, поднимается, но остается во Временной мертвой зоне (Temporal Dead Zone - TDZ) до объявления, не может быть переопределена в той же области видимости, может быть переназначена.
  • const: Область видимости - блок, поднимается, но находится в TDZ, должна быть инициализирована при объявлении, не может быть переназначена (но содержимое объекта/массива может быть изменено).

Пример:

// var - область видимости функции
function example() {
  if (true) {
    var x = 1;
  }
  console.log(x); // 1 (доступна вне блока)
}

// let - область видимости блока
if (true) {
  let y = 2;
}
console.log(y); // ReferenceError

// const - нельзя переназначить
const z = 3;
z = 4; // TypeError

const obj = { name: 'John' };
obj.name = 'Jane'; // OK - изменение свойства
obj = {}; // TypeError - нельзя переназначить

Лучшая практика: Используйте const по умолчанию, let, когда вам нужно переназначить, никогда не используйте var в современном JavaScript.

Редкость: Распространенный Сложность: Легкий


2. Что такое замыкания (closures) и приведите практический пример в Node.js?

Ответ: Замыкание - это когда внутренняя функция имеет доступ к переменным из области видимости своей внешней (охватывающей) функции, даже после того, как внешняя функция вернула значение. Внутренняя функция "замыкает" эти переменные.

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

// Паттерн фабрики промежуточного ПО (Middleware)
function createAuthMiddleware(secretKey) {
  // secretKey "замкнута" возвращаемой функцией
  return function(req, res, next) {
    const token = req.headers.authorization;
    if (validateToken(token, secretKey)) {
      next();
    } else {
      res.status(401).json({ error: 'Unauthorized' });
    }
  };
}

// Использование
const authMiddleware = createAuthMiddleware(process.env.JWT_SECRET);
app.use('/api/protected', authMiddleware);

Преимущества:

  • Конфиденциальность данных (secretKey не может быть доступен напрямую)
  • Фабрики функций
  • Реализация паттерна модуля
  • Поддержание состояния в асинхронных операциях

Редкость: Распространенный Сложность: Средний


3. Объясните ключевое слово this и чем оно отличается в стрелочных функциях

Ответ: this относится к контексту выполнения. Его значение зависит от ТОГО, КАК вызывается функция.

Обычные функции:

const obj = {
  name: "Server",
  greet: function() {
    console.log(this.name); // "Server"
  }
};
obj.greet(); // this = obj

const greet = obj.greet;
greet(); // this = undefined (строгий режим) или global

Стрелочные функции:

const obj = {
  name: "Server",
  greet: () => {
    console.log(this.name); // undefined (лексическая область видимости)
  }
};
obj.greet(); // this = лексическая область видимости (область видимости модуля в Node.js)

Ключевое отличие: Стрелочные функции не имеют своего собственного this - они наследуют его из охватывающей области видимости.

Редкость: Распространенный Сложность: Средний


4. Что такое промисы (Promises) и чем они отличаются от колбэков (callbacks)?

Ответ: Промис представляет собой возможное завершение (или сбой) асинхронной операции.

Паттерн колбэков ("ад колбэков"):

getUser(userId, (err, user) => {
  if (err) return handleError(err);
  getPosts(user.id, (err, posts) => {
    if (err) return handleError(err);
    getComments(posts[0].id, (err, comments) => {
      if (err) return handleError(err);
      // Вложенные колбэки - трудно читать
    });
  });
});

Паттерн промисов:

getUser(userId)
  .then(user => getPosts(user.id))
  .then(posts => getComments(posts[0].id))
  .then(comments => console.log(comments))
  .catch(err => handleError(err));

Преимущества:

  • Избегает "ада колбэков"
  • Лучшая обработка ошибок с помощью .catch()
  • Цепочки операций
  • Можно использовать Promise.all() для параллельных операций

Редкость: Распространенный Сложность: Легкий-Средний


5. Что такое async/await и как это улучшает читаемость кода?

Ответ: async/await - это синтаксический сахар, построенный на промисах, который делает асинхронный код похожим и ведущим себя больше как синхронный код.

Пример:

// С промисами
function fetchUserData(userId) {
  return fetchUser(userId)
    .then(user => {
      return fetchPosts(user.id)
        .then(posts => {
          return { user, posts };
        });
    })
    .catch(error => console.error(error));
}

// С async/await (чище)
async function fetchUserData(userId) {
  try {
    const user = await fetchUser(userId);
    const posts = await fetchPosts(user.id);
    return { user, posts };
  } catch (error) {
    console.error(error);
  }
}

Ключевые моменты:

  • async функция всегда возвращает промис
  • await приостанавливает выполнение до тех пор, пока промис не разрешится
  • Используйте try/catch для обработки ошибок
  • Делает последовательные операции более понятными

Редкость: Распространенный Сложность: Средний


6. Объясните деструктуризацию для объектов и массивов

Ответ: Деструктуризация извлекает значения из массивов или свойства из объектов в отдельные переменные.

Деструктуризация массива:

const [first, second, ...rest] = [1, 2, 3, 4, 5];
// first = 1, second = 2, rest = [3, 4, 5]

// Пропуск элементов
const [primary, , tertiary] = ['red', 'green', 'blue'];
// primary = 'red', tertiary = 'blue'

Деструктуризация объекта:

const user = { name: 'Alice', age: 25, email: '[email protected]' };

const { name, age, city = 'NYC' } = user;
// name = 'Alice', age = 25, city = 'NYC' (значение по умолчанию)

// Переименование переменных
const { name: userName, age: userAge } = user;

// Вложенная деструктуризация
const { address: { street, zip } } = person;

Параметры функции:

function createUser({ name, email, role = 'user' }) {
  // Использование деструктурированных параметров
}

Редкость: Распространенный Сложность: Легкий-Средний


7. Что такое оператор расширения (spread operator) и rest-параметры?

Ответ:

Оператор расширения (...) - Расширяет итерируемые объекты:

// Массивы
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5]; // [1, 2, 3, 4, 5]

// Объекты (поверхностная копия)
const user = { name: 'Alice', age: 25 };
const updatedUser = { ...user, age: 26 }; // Неизменяемое обновление

// Аргументы функции
const numbers = [1, 2, 3];
Math.max(...numbers); // 3

Rest-параметры (...) - Собирают несколько элементов:

// Параметры функции
function sum(...numbers) {
  return numbers.reduce((a, b) => a + b, 0);
}
sum(1, 2, 3, 4); // 10

// Деструктуризация массива
const [first, ...remaining] = [1, 2, 3, 4];
// first = 1, remaining = [2, 3, 4]

Ключевое отличие: Spread расширяет, rest собирает.

Редкость: Распространенный Сложность: Легкий-Средний


8. Объясните распространенные методы массивов: map, filter, reduce, forEach

Ответ:

map - Преобразует каждый элемент, возвращает новый массив:

const doubled = [1, 2, 3].map(x => x * 2); // [2, 4, 6]

filter - Оставляет элементы, соответствующие условию:

const evens = [1, 2, 3, 4].filter(x => x % 2 === 0); // [2, 4]

reduce - Сводит к одному значению:

const sum = [1, 2, 3].reduce((acc, val) => acc + val, 0); // 6
const grouped = users.reduce((acc, user) => {
  acc[user.role] = acc[user.role] || [];
  acc[user.role].push(user);
  return acc;
}, {});

forEach - Итерирует без возврата нового массива:

[1, 2, 3].forEach(item => console.log(item));

Редкость: Распространенный Сложность: Легкий


Основы Node.js (7 вопросов)

9. Что такое Node.js и чем он отличается от традиционных серверных языков?

Ответ: Node.js - это среда выполнения JavaScript, построенная на движке Chrome V8 JavaScript, которая позволяет JavaScript работать на стороне сервера.

Ключевые отличия:

  • Однопоточный цикл событий (event loop): Использует неблокирующую модель ввода-вывода против многопоточной блокирующей модели ввода-вывода
  • Асинхронный по умолчанию: Операции не блокируют основной поток
  • JavaScript везде: Один и тот же язык для фронтенда и бэкенда
  • NPM экосистема: Крупнейший реестр пакетов в мире
  • Быстрое выполнение: Движок V8 компилирует JavaScript в машинный код

Когда использовать Node.js:

  • Приложения реального времени (чат, игры)
  • API серверы
  • Микросервисы
  • Приложения для потоковой передачи данных
  • Приложения, интенсивно использующие ввод-вывод

Когда НЕ использовать:

  • Задачи, интенсивно использующие процессор (обработка изображений, кодирование видео)
  • Приложения, требующие сложных вычислений

Редкость: Распространенный Сложность: Легкий-Средний


10. Объясните цикл событий (Event Loop) в Node.js

Ответ: Цикл событий - это механизм, который позволяет Node.js выполнять неблокирующие операции ввода-вывода, несмотря на то, что он является однопоточным.

Как это работает:

  1. Стек вызовов (Call Stack): Выполняет синхронный код (LIFO)
  2. Node APIs: Обрабатывает асинхронные операции (fs, http, timers)
  3. Очередь колбэков (Macrotasks): Содержит колбэки из Node APIs
  4. Очередь микрозадач (Microtask Queue): Содержит колбэки промисов (более высокий приоритет)
  5. Цикл событий (Event Loop): Перемещает задачи из очередей в стек вызовов, когда стек пуст

Порядок выполнения:

console.log('1');

setTimeout(() => console.log('2'), 0);

Promise.resolve().then(() => console.log('3'));

console.log('4');

// Вывод: 1, 4, 3, 2
// Объяснение:
// - Синхронный код (1, 4) выполняется первым
// - Микрозадачи (Promise) выполняются перед макрозадачами
// - Макрозадачи (setTimeout) выполняются последними

Фазы цикла событий:

  1. Таймеры (setTimeout, setInterval)
  2. Ожидающие колбэки
  3. Idle, prepare
  4. Poll (получение новых событий ввода-вывода)
  5. Check (колбэки setImmediate)
  6. Close callbacks

Редкость: Распространенный Сложность: Сложный


11. В чем разница между блокирующим и неблокирующим кодом?

Ответ:

Блокирующий код - Приостанавливает выполнение до завершения операции:

// Синхронное чтение файла (блокирует)
const fs = require('fs');
const data = fs.readFileSync('file.txt', 'utf8');
console.log(data); // Ожидает чтения файла
console.log('Done'); // Выполняется после чтения файла

Неблокирующий код - Продолжает выполнение, обрабатывает результат через колбэк:

// Асинхронное чтение файла (неблокирующее)
const fs = require('fs');
fs.readFile('file.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});
console.log('Done'); // Выполняется немедленно, до завершения чтения файла

Почему неблокирующий код важен:

  • Сервер может обрабатывать несколько запросов одновременно
  • Лучшее использование ресурсов
  • Улучшенная производительность для операций ввода-вывода
  • Масштабируемость

Редкость: Распространенный Сложность: Легкий-Средний


12. Что такое модули Node.js и как работает система модулей?

Ответ: Node.js использует систему модулей CommonJS (хотя модули ES также поддерживаются).

CommonJS (require/module.exports):

// math.js
function add(a, b) {
  return a + b;
}

module.exports = { add };
// или
exports.add = add;

// app.js
const { add } = require('./math');
const result = add(2, 3);

ES Modules (import/export):

// math.js
export function add(a, b) {
  return a + b;
}

// app.js
import { add } from './math.js';

Типы модулей:

  • Основные модули: Встроенные (fs, http, path)
  • Локальные модули: Ваши собственные файлы
  • Сторонние модули: Устанавливаются через npm

Кэширование модулей: Модули кэшируются после первого require, поэтому последующие require возвращают тот же экземпляр.

Редкость: Распространенный Сложность: Легкий


13. Объясните разницу между process.nextTick() и setImmediate()

Ответ:

process.nextTick() - Выполняет колбэк в текущей фазе, перед любой другой асинхронной операцией:

console.log('1');

process.nextTick(() => {
  console.log('2');
});

Promise.resolve().then(() => {
  console.log('3');
});

console.log('4');

// Вывод: 1, 4, 2, 3
// nextTick имеет наивысший приоритет, даже выше промисов

setImmediate() - Выполняет колбэк в следующей итерации цикла событий:

console.log('1');

setImmediate(() => {
  console.log('2');
});

setTimeout(() => {
  console.log('3');
}, 0);

console.log('4');

// Вывод: 1, 4, 3, 2 (или 1, 4, 2, 3 в зависимости от контекста)

Порядок приоритета:

  1. Синхронный код
  2. Колбэки process.nextTick()
  3. Колбэки промисов (микрозадачи)
  4. setTimeout(0) / setImmediate() (макрозадачи)

Варианты использования:

  • nextTick: Обеспечить выполнение колбэка перед другими асинхронными операциями
  • setImmediate: Отложить выполнение до следующей итерации цикла событий

Редкость: Нераспространенный Сложность: Средний-Сложный


14. Что такое глобальный объект в Node.js?

Ответ: Глобальный объект в Node.js аналогичен объекту window в браузерах, но называется global.

Глобальные свойства:

// Доступны везде без require
console.log(__dirname); // Путь к текущему каталогу
console.log(__filename); // Путь к текущему файлу
console.log(process); // Объект process
console.log(global); // Сам глобальный объект

Распространенные глобальные объекты:

  • process - Информация о процессе и управление им
  • Buffer - Обработка двоичных данных
  • setTimeout, setInterval, clearTimeout, clearInterval
  • setImmediate, clearImmediate
  • console - Вывод в консоль

Примечание: В модулях ES __dirname и __filename недоступны по умолчанию. Используйте import.meta.url вместо этого.

Редкость: Распространенный Сложность: Легкий


15. Как вы обрабатываете ошибки в приложениях Node.js?

Ответ: Обработка ошибок в Node.js может осуществляться несколькими способами:

1. Try-catch для синхронного кода:

try {
  const data = fs.readFileSync('file.txt', 'utf8');
} catch (error) {
  console.error('Ошибка чтения файла:', error.message);
}

2. Паттерн колбэка с ошибкой:

fs.readFile('file.txt', 'utf8', (err, data) => {
  if (err) {
    return console.error('Ошибка:', err);
  }
  console.log(data);
});

3. Обработка ошибок промисов:

fetchData()
  .then(data => processData(data))
  .catch(error => console.error('Ошибка:', error));

4. Async/await с try-catch:

async function handleRequest() {
  try {
    const data = await fetchData();
    return data;
  } catch (error) {
    console.error('Ошибка:', error);
    throw error; // Перебросить, если необходимо
  }
}

5. Глобальные обработчики ошибок:

// Неперехваченные исключения
process.on('uncaughtException', (error) => {
  console.error('Неперехваченное исключение:', error);
  process.exit(1);
});

// Необработанные отклонения промисов
process.on('unhandledRejection', (reason, promise) => {
  console.error('Необработанное отклонение:', reason);
});

6. Промежуточное ПО для обработки ошибок в Express:

app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({ error: 'Что-то пошло не так!' });
});

Редкость: Распространенный Сложность: Средний


Express.js и веб-фреймворки (6 вопросов)

16. Что такое Express.js и каковы его основные особенности?

Ответ: Express.js - это минималистичный и гибкий веб-фреймворк Node.js, который предоставляет надежный набор функций для создания веб- и мобильных приложений.

Основные особенности:

  • Маршрутизация (Routing): Определение endpoints и HTTP методов
  • Промежуточное ПО (Middleware): Функции, которые выполняются во время цикла запрос-ответ
  • Механизмы шаблонов (Template engines): Отрисовка динамического HTML (EJS, Pug, Handlebars)
  • Обработка ошибок (Error handling): Централизованное промежуточное ПО для обработки ошибок
  • Статические файлы (Static files): Обслуживание статических ресурсов
  • JSON parsing: Встроенный парсинг тела запроса для JSON и URL-encoded данных

Базовый пример:

const express = require('express');
const app = express();

app.use(express.json());

app.get('/', (req, res) => {
  res.json({ message: 'Hello World' });
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

Почему Express:

  • Минималистичный и не навязывает определенное мнение
  • Большая экосистема
  • Легко выучить
  • Гибкая система промежуточного ПО

Редкость: Распространенный Сложность: Легкий


17. Что такое промежуточное ПО (middleware) в Express.js? Приведите примеры.

Ответ: Функции промежуточного ПО - это функции, которые имеют доступ к объекту запроса (req), объекту ответа (res) и функции next в цикле запрос-ответ приложения.

Типы промежуточного ПО:

1. Промежуточное ПО уровня приложения:

app.use((req, res, next) => {
  console.log('Request received:', req.method, req.path);
  next(); // Передать управление следующему промежуточному ПО
});

2. Промежуточное ПО уровня маршрута:

app.get('/users', authenticateUser, (req, res) => {
  res.json({ users: [] });
});

3. Промежуточное ПО для обработки ошибок:

app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({ error: err.message });
});

4. Встроенное промежуточное ПО:

app.use(express.json()); // Парсинг JSON тел запросов
app.use(express.urlencoded({ extended: true })); // Парсинг URL-encoded
app.use(express.static('public')); // Обслуживание статических файлов

5. Стороннее промежуточное ПО:

const cors = require('cors');
const helmet = require('helmet');

app.use(cors());
app.use(helmet());

Пример пользовательского промежуточного ПО для аутентификации:

function authenticateUser(req, res, next) {
  const token = req.headers.authorization;
  if (!token) {
    return res.status(401).json({ error: 'No token provided' });
  }
  // Проверить токен
  req.user = decodedToken;
  next();
}

Редкость: Распространенный Сложность: Средний


18. Объясните маршрутизацию Express и как организовать маршруты

Ответ: Маршрутизация относится к тому, как endpoints (URI) приложения реагируют на клиентские запросы.

Базовая маршрутизация:

app.get('/users', (req, res) => {
  res.json({ users: [] });
});

app.post('/users', (req, res) => {
  const newUser = req.body;
  res.status(201).json(newUser);
});

app.get('/users/:id', (req, res) => {
  const userId = req.params.id;
  res.json({ user: { id: userId } });
});

app.put('/users/:id', (req, res) => {
  // Обновить пользователя
});

app.delete('/users/:id', (req, res) => {
  // Удалить пользователя
});

Параметры маршрута:

app.get('/users/:userId/posts/:postId', (req, res) => {
  const { userId, postId } = req.params;
  // Доступ к параметрам маршрута
});

Параметры запроса:

app.get('/search', (req, res) => {
  const { q, page, limit } = req.query;
  // ?q=nodejs&page=1&limit=10
});

Организация маршрутов с помощью Express Router:

// routes/users.js
const express = require('express');
const router = express.Router();

router.get('/', (req, res) => {
  res.json({ users: [] });
});

router.get('/:id', (req, res) => {
  res.json({ user: { id: req.params.id } });
});

module.exports = router;

// app.js
const userRoutes = require('./routes/users');
app.use('/api/users', userRoutes);

Редкость: Распространенный Сложность: Легкий-Средний


19. Как вы обрабатываете загрузку файлов в Express?

Ответ: Загрузку файлов можно обрабатывать с помощью промежуточного ПО, такого как multer.

Базовая загрузка файла:

const multer = require('multer');
const upload = multer({ dest: 'uploads/' });

app.post('/upload', upload.single('file'), (req, res) => {
  // req.file содержит информацию о файле
  res.json({ 
    filename: req.file.filename,
    originalname: req.file.originalname,
    size: req.file.size
  });
});

Несколько файлов:

app.post('/upload-multiple', upload.array('files', 10), (req, res) => {
  // req.files - массив файлов
  res.json({ uploaded: req.files.length });
});

Пользовательская конфигурация хранилища:

const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, 'uploads/');
  },
  filename: (req, file, cb) => {
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
    cb(null, file.fieldname + '-' + uniqueSuffix);
  }
});

const upload = multer({ 
  storage: storage,
  limits: { fileSize: 5 * 1024 * 1024 }, // Ограничение 5MB
  fileFilter: (req, file, cb) => {
    if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png') {
      cb(null, true);
    } else {
      cb(new Error('Only JPEG and PNG allowed'));
    }
  }
});

Редкость: Распространенный Сложность: Средний


20. Что такое CORS и как вы обрабатываете это в Express?

Ответ: CORS (Cross-Origin Resource Sharing) - это функция безопасности, которая разрешает или ограничивает веб-страницы в выполнении запросов к другому домену, чем тот, который обслуживает веб-страницу.

Проблема: Браузеры блокируют запросы от http://localhost:3000 к http://localhost:4000 по умолчанию (разные origins).

Решение с помощью промежуточного ПО cors:

const cors = require('cors');

// Разрешить все origins (только для разработки)
app.use(cors());

// Настроить определенные origins
app.use(cors({
  origin: 'https://example.com',
  methods: ['GET', 'POST', 'PUT', 'DELETE'],
  allowedHeaders: ['Content-Type', 'Authorization']
}));

// Несколько origins
app.use(cors({
  origin: ['https://example.com', 'https://app.example.com']
}));

Ручная установка CORS заголовков:

app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', 'https://example.com');
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  
  if (req.method === 'OPTIONS') {
    return res.sendStatus(200);
  }
  next();
});

Редкость: Распространенный Сложность: Легкий-Средний


21. Как вы структурируете большое приложение Express.js?

Ответ: Организуйте код в логические модули и папки для удобства обслуживания.

Рекомендуемая структура:

project/
├── src/
│   ├── controllers/
│   │   └── userController.js
│   ├── models/
│   │   └── User.js
│   ├── routes/
│   │   └── userRoutes.js
│   ├── middleware/
│   │   └── auth.js
│   ├── services/
│   │   └── userService.js
│   ├── utils/
│   │   └── helpers.js
│   ├── config/
│   │   └── database.js
│   └── app.js
├── tests/
├── .env
└── package.json

Пример разделения ответственности:

Контроллер (обрабатывает HTTP):

// controllers/userController.js
const userService = require('../services/userService');

exports.getUsers = async (req, res, next) => {
  try {
    const users = await userService.getAllUsers();
    res.json(users);
  } catch (error) {
    next(error);
  }
};

Сервис (бизнес-логика):

// services/userService.js
const User = require('../models/User');

exports.getAllUsers = async () => {
  return await User.find();
};

Маршруты:

// routes/userRoutes.js
const express = require('express');
const router = express.Router();
const userController = require('../controllers/userController');

router.get('/', userController.getUsers);
router.post('/', userController.createUser);

module.exports = router;

Настройка приложения:

// app.js
const express = require('express');
const userRoutes = require('./routes/userRoutes');

const app = express();
app.use(express.json());
app.use('/api/users', userRoutes);

Редкость: Распространенный Сложность: Средний


Концепции баз данных (5 вопросов)

22. В чем разница между базами данных SQL и NoSQL?

Ответ:

SQL (реляционные) базы данных:

  • Структурированные данные с таблицами, строками, столбцами
  • Схема должна быть определена перед использованием
  • Соответствие ACID (Atomicity, Consistency, Isolation, Durability)
  • Примеры: PostgreSQL, MySQL, SQLite
  • Лучше всего подходит для: Сложных запросов, транзакций, структурированных данных

NoSQL базы данных:

  • Гибкая схема или схема-less
  • Различные модели данных (документ, ключ-значение, граф, столбец)
  • Горизонтальное масштабирование
  • Примеры: MongoDB, Redis, Cassandra
  • Лучше всего подходит для: Крупномасштабных приложений, гибких схем, быстрой разработки

Сравнение:

FeatureSQLNoSQL
SchemaФиксированнаяГибкая
ScalabilityВертикальнаяГоризонтальная
ACIDДаВарьируется
Query LanguageSQLВарьируется
RelationshipsJoinsВстроенные/
Newsletter subscription

Еженедельные советы по карьере, которые действительно работают

Получайте последние идеи прямо на вашу почту

Похожие посты

Decorative doodle

Ваше следующее собеседование — всего одно резюме

Создайте профессиональное оптимизированное резюме за несколько минут. Не нужны навыки дизайна—только проверенные результаты.

Создать моё резюме

Поделиться этим постом

Сократите Время Написания Резюме на 90%

Средний соискатель тратит более 3 часов на форматирование резюме. Наш ИИ делает это менее чем за 15 минут, ускоряя переход к этапу подачи заявки в 12 раз.