Проектировали ли вы базы данных?

«Проектировали ли вы базы данных?» — вопрос из категории Базы данных, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, проектировал. В контексте C++ приложений чаще всего работал с реляционными СУБД (MySQL, PostgreSQL) через нативные драйверы или ORM вроде ODB. Основные этапы включали анализ требований приложения, нормализацию схемы (обычно до 3НФ), проектирование таблиц, связей, индексов и последующую оптимизацию запросов.

Пример проектирования для простой системы блога на C++ с использованием SQL:

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE posts (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    title VARCHAR(255) NOT NULL,
    content TEXT,
    published BOOLEAN DEFAULT FALSE,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

CREATE INDEX idx_posts_user_id ON posts(user_id);
CREATE INDEX idx_posts_published ON posts(published);

При проектировании учитывал:

  • Целостность данных: внешние ключи, каскадные операции.
  • Производительность: создание индексов для полей, участвующих в JOIN и WHERE, возможная денормализация для часто читаемых данных.
  • Безопасность: использование prepared statements в C++ коде для предотвращения SQL-инъекций.
  • Миграции: ведение скриптов миграции для эволюции схемы.