В чем разница между реляционной и нереляционной базой данных?

«В чем разница между реляционной и нереляционной базой данных?» — вопрос из категории Базы данных, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Выбор между SQL (реляционные) и NoSQL (нереляционные) базами данных — ключевое архитектурное решение в DevOps.

Реляционные БД (SQL)

  • Модель данных: Строгая, предопределенная схема в виде таблиц со строками и столбцами. Связи между таблицами устанавливаются через внешние ключи.
  • Язык запросов: SQL (стандартизированный, мощный для сложных JOIN-запросов и агрегаций).
  • Свойства транзакций: Поддерживают ACID (Атомарность, Согласованность, Изоляция, Долговечность). Гарантируют целостность данных.
  • Масштабирование: В первую очередь вертикальное (увеличение мощности сервера). Репликация и шардирование (горизонтальное масштабирование) сложны.
  • Примеры: PostgreSQL, MySQL, MariaDB, Oracle, SQL Server.
  • Использование в DevOps: Требуют тщательного планирования схемы, миграций (используются инструменты вроде Liquibase, Flyway), резервного копирования и настройки репликации.

Нереляционные БД (NoSQL)

  • Модель данных: Гибкая или схема-независимая. Основные типы:
    • Документные (MongoDB, Couchbase): Хранение JSON-подобных документов.
    • Ключ-значение (Redis, DynamoDB): Простой доступ по ключу.
    • Колоночные (Cassandra, ScyllaDB): Оптимизированы для запросов по столбцам, а не строкам.
    • Графовые (Neo4j): Хранение связей между сущностями.
  • Гибкость: Структура данных может меняться со временем без сложных миграций.
  • Свойства: Следуют CAP-теореме (Consistency, Availability, Partition Tolerance). Часто жертвуют строгой согласованностью (C) в пользу доступности (A) и устойчивости к разделению (P), предлагая eventual consistency.
  • Масштабирование: Заточены под горизонтальное масштабирование (добавление узлов в кластер).

DevOps-перспектива: Критерии выбора

Критерий Выбрать SQL Выбрать NoSQL
Структура данных Четкая, неизменная, со сложными связями. Динамическая, неоднородная, иерархическая (документы).
Целостность данных Критически важна (финансовые транзакции). Может быть ослаблена в пользу скорости и доступности.
Масштабирование Предсказуемый рост, вертикальное масштабирование. Огромные объемы данных/трафика, горизонтальное масштабирование.
Тип нагрузки Сложные аналитические запросы, отчеты. Высокая скорость записи/чтения, низкая задержка (кэш, сессии).

Пример инфраструктуры как код (Terraform) для создания кластера БД:

# Пример для AWS RDS (SQL) - управляемый сервис
resource "aws_db_instance" "postgres" {
  engine         = "postgres"
  instance_class = "db.t3.micro"
  allocated_storage = 20
  name           = "mydb"
  username       = var.db_username
  password       = var.db_password
  vpc_security_group_ids = [aws_security_group.rds.id]
  db_subnet_group_name   = aws_db_subnet_group.main.name
}

# Пример для MongoDB Atlas (NoSQL) через провайдер
resource "mongodbatlas_cluster" "app_cluster" {
  project_id = var.atlas_project_id
  name       = "app-cluster"
  provider_name = "TENANT"
  backing_provider_name = "AWS"
  provider_region_name = "EU_WEST_1"
  provider_instance_size_name = "M10"
}