Какую СУБД ты бы выбрал для проекта со средними нагрузками и почему?

«Какую СУБД ты бы выбрал для проекта со средними нагрузками и почему?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для типичного проекта со средними нагрузками (десятки-сотни тысяч записей, сотни одновременных пользователей) мой выбор — PostgreSQL.

Почему PostgreSQL?

  1. Надежность и соответствие стандартам: Строгое соблюдение ACID, мощная поддержка транзакций, комплексные ограничения целостности данных.
  2. Богатая функциональность:
    • Расширенные типы данных (JSONB, массивы, геоданные).
    • Индексы разных типов (B-tree, Hash, GIN, GiST).
    • Оконные функции, Common Table Expressions (CTE).
  3. Производительность: Эффективный планировщик запросов, развитые механизмы кэширования, возможность репликации для чтения.
  4. Экосистема: Отличная интеграция с ORM (Hibernate), инструментами миграции (Flyway, Liquibase).

Базовая конфигурация для Spring Boot:

# application.properties
spring.datasource.url=jdbc:postgresql://localhost:5432/myapp_db
spring.datasource.username=app_user
spring.datasource.password=${DB_PASSWORD} # Используем переменные окружения

spring.jpa.hibernate.ddl-auto=validate # Не обновлять схему автоматически в проде!
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.show-sql=false # Отключаем для продуктивной среды

# Настройка пула соединений (HikariCP)
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.connection-timeout=30000

Стратегия масштабирования при росте нагрузки:

  1. Оптимизация: Индексы, анализ медленных запросов, кэширование результатов (Redis).
  2. Репликация: Настройка read-replicas для распределения нагрузки на чтение.
  3. Партиционирование: Разделение больших таблиц по диапазонам или хэшу.

Альтернатива — MySQL (InnoDB) — хороший выбор, если критична простота и скорость операций чтения в типовых сценариях, но требуется меньше экзотических функций.