Какие типы баз данных вы знаете? Расскажите об их ключевых особенностях и сценариях использования.

Ответ

Я знаком с несколькими типами баз данных, которые можно разделить на следующие категории:

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

  • PostgreSQL – мощная, объектно-реляционная СУБД. Известна своей надежностью, расширяемостью (можно писать функции на других языках) и строгим соответствием стандарту SQL (ACID). Отлично подходит для сложных систем, где важна целостность данных. Имеет продвинутую поддержку JSONB.
  • MySQL/MariaDB – самая популярная в мире СУБД, часто используется в веб-разработке. Отличается высокой скоростью на операциях чтения и простотой в настройке.
  • SQLite – встраиваемая, легковесная, сервер-независимая БД. Идеальна для мобильных приложений, десктопных программ или как БД для тестирования.

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

  • Redis – высокопроизводительное in-memory key-value хранилище. Идеально подходит для кэширования, управления сессиями, реализации очередей и Pub/Sub систем.
  • MongoDB – документоориентированная БД. Хранит данные в гибком JSON-подобном формате (BSON), что позволяет легко менять структуру данных. Хороша для быстрой разработки и проектов с нечеткой схемой данных.
  • Cassandra – колоночная, распределенная БД, спроектированная для обработки огромных объемов данных на множестве серверов. Обеспечивает высокую доступность и отказоустойчивость.
  • Elasticsearch – поисковый движок, построенный на Apache Lucene. Используется для полнотекстового поиска, аналитики логов и мониторинга.

3. Временных рядов (Time Series):

  • InfluxDB / Prometheus – оптимизированы для хранения и обработки данных, привязанных ко времени (метрик, событий, логов). Основа для систем мониторинга и IoT.

Пример подключения к PostgreSQL в Go:

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

func main() {
    connStr := "user=user password=pass dbname=db sslmode=disable"
    // sql.Open не устанавливает соединение сразу, а лишь подготавливает его.
    db, err := sql.Open("postgres", connStr)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // Проверка реального соединения с базой.
    if err = db.Ping(); err != nil {
        log.Fatal(err)
    }
}