Какие основные типы баз данных вы знаете и в чем их ключевые различия?

Ответ

Все базы данных можно условно разделить на две большие категории: реляционные (SQL) и нереляционные (NoSQL).

1. Реляционные (SQL)

Хранят данные в строго структурированном виде — в таблицах, состоящих из строк и столбцов. Связи между таблицами устанавливаются с помощью ключей. Гарантируют целостность данных через ACID транзакции.

  • Ключевые особенности: Строгая схема, надежность, транзакционность.
  • Примеры: PostgreSQL, MySQL, Oracle, SQLite, MS SQL.
  • Когда использовать: Финансовые системы, e-commerce, системы бронирования — везде, где важна целостность и консистентность данных.

2. Нереляционные (NoSQL)

Предлагают гибкие модели данных и часто оптимизированы для масштабируемости и высокой производительности, иногда в ущерб строгой консистентности (модель BASE).

Основные типы NoSQL баз данных:

  • Документо-ориентированные

    • Описание: Хранят данные в виде JSON-подобных документов. Схема гибкая.
    • Примеры: MongoDB, Couchbase.
    • Использование: Системы управления контентом, профили пользователей, каталоги товаров.
  • Ключ-значение (Key-Value)

    • Описание: Самая простая модель: данные хранятся как пара ключ-значение.
    • Примеры: Redis, Memcached, DynamoDB.
    • Использование: Кэширование, хранение сессий, таблицы лидеров в реальном времени.
  • Колоночные (Column-family)

    • Описание: Хранят данные по колонкам, а не по строкам. Оптимизированы для агрегации и аналитических запросов по большим данным.
    • Примеры: Cassandra, ScyllaDB, ClickHouse.
    • Использование: Аналитика, Big Data, временные ряды (time-series).
  • Графовые (Graph)

    • Описание: Созданы для хранения данных в виде узлов (вершин) и связей (ребер) между ними.
    • Примеры: Neo4j, Amazon Neptune.
    • Использование: Социальные сети, рекомендательные системы, системы обнаружения мошенничества.

Пример работы с PostgreSQL в Go:

import (
    "database/sql"
    _ "github.com/lib/pq" // Драйвер для PostgreSQL
)

// ...
db, err := sql.Open("postgres", "user=... password=... dbname=... sslmode=disable")
if err != nil {
    log.Fatal(err)
}

// Запрос с параметром для защиты от SQL-инъекций
rows, err := db.Query("SELECT id, name FROM users WHERE age > $1", 18)
// ... дальнейшая обработка результата