← Назад к вопросам

С какими СУБД работал

1.2 Junior🔥 201 комментариев
#Опыт работы и проекты#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Я работал с несколькими СУБД, каждая из которых имеет свои особенности и применяется для разных задач:

PostgreSQL

Основная СУБД для большинства своих проектов. Использовал для:

  • Высоконагруженных систем с требованиями ACID транзакций
  • Сложных запросов и аналитики благодаря мощному оптимизатору
  • Полнотекстового поиска (встроенный FTS)
  • JSON и JSONB данных
  • Window functions и CTEs для сложной аналитики
// Пример работы с PostgreSQL через libpq
#include <libpq-fe.h>

PGconn* conn = PQconnectdb("host=localhost dbname=mydb");
if (PQstatus(conn) != CONNECTION_OK) {
    fprintf(stderr, "Connection failed: %s", PQerrorMessage(conn));
}

PGresult* res = PQexec(conn, "SELECT id, name FROM users WHERE active = true");
for (int i = 0; i < PQntuples(res); i++) {
    printf("ID: %s, Name: %s\n", 
           PQgetvalue(res, i, 0), 
           PQgetvalue(res, i, 1));
}

PQclear(res);
PQfinish(conn);

MySQL / MariaDB

Использовал для:

  • Web-приложений (LAMP/LEMP стеки)
  • Проектов, требующих простой синхронизации и репликации
  • Облачных провайдеров, где MySQL встроен по умолчанию
// Работа с MySQL через mysql++
#include <mysql++/mysql++.h>

mysqlpp::Connection conn(false);
conn.connect("database_name", "localhost", "user", "password");

mysqlpp::Query query = conn.query("SELECT * FROM products WHERE price > 100");
mysqlpp::StoreQueryResult res = query.store();

for (size_t i = 0; i < res.num_rows(); ++i) {
    mysqlpp::Row row = res[i];
    cout << "Product: " << row["name"] << " - Price: " << row["price"] << endl;
}

SQLite

Для:

  • Встроенных баз данных в desktop приложениях
  • Тестирования (быстро, не требует сервера)
  • Мобильных приложений через wrapper на C++
  • Локального кеширования данных
#include <sqlite3.h>

sqlite3* db;
sqlite3_open("mydb.sqlite", &db);

const char* sql = "SELECT id, name FROM users WHERE age > 18;";
sqlite3_stmt* stmt;
sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);

while (sqlite3_step(stmt) == SQLITE_ROW) {
    int id = sqlite3_column_int(stmt, 0);
    const char* name = (const char*)sqlite3_column_text(stmt, 1);
    printf("User %d: %s\n", id, name);
}

sqlite3_finalize(stmt);
sqlite3_close(db);

MongoDB

Использовал для:

  • Документо-ориентированных приложений (JSON-like структуры)
  • Систем с быстро меняющейся схемой данных
  • Высокопроизводительного кеширования (с подходящей архитектурой)
  • Логирования и аналитики event-driven приложений
#include <mongocxx/client.hpp>
#include <bsoncxx/json.hpp>

mongocxx::client client{mongocxx::uri{"mongodb://localhost:27017"}};
auto db = client["myapp"];
auto collection = db["events"];

// Вставка документа
auto doc = bsoncxx::builder::stream::document{} 
    << "user_id" << 123 
    << "event_type" << "login" 
    << "timestamp" << bsoncxx::types::b_date{std::chrono::system_clock::now()}
    << bsoncxx::builder::stream::finalize;

auto result = collection.insert_one(std::move(doc));

// Поиск
auto cursor = collection.find(
    bsoncxx::builder::stream::document{} << "user_id" << 123 << finalize
);

for (auto&& doc : cursor) {
    std::cout << bsoncxx::to_json(doc) << std::endl;
}

Redis

Для:

  • Высокоскоростного кеширования (in-memory)
  • Session хранилища
  • Очередей сообщений (pub/sub)
  • Rate limiting и счётчиков в реальном времени
  • Распределённых блокировок (Redis locks)
#include <redis-plus-plus/redis++.h>

sw::redis::Redis redis("tcp://127.0.0.1:6379");

// Кеширование
redis.set("user:123:session", "token_abc123", 3600s);
auto token = redis.get("user:123:session");

// Списки (очереди)
redis.lpush("event_queue", "event1", "event2", "event3");
auto event = redis.rpop("event_queue");

// Счётчики
redis.incr("page_views");
auto views = redis.get<long long>("page_views");

// Pub/Sub
redis.subscribe({"notifications"}, 
                [](const auto& msg) {
                    std::cout << "Message: " << msg.get_payload() << std::endl;
                });

Cassandra

Для:

  • Распределённых систем с высокой доступностью
  • Time-series данных (логи, метрики, события)
  • Систем, требующих горизонтального масштабирования без узкого места

Сравнение и рекомендации

СУБДЛучшее применениеСильные стороны
PostgreSQLСложные запросы, транзакцииACID, мощный оптимизатор, JSON, FTS
MySQLВеб-приложения, стартапыПростота, скорость чтения, распространённость
SQLiteВстроенные БД, тестыЛегко развёртывается, нет сервера
MongoDBГибкая схема, документыNoSQL, быстрое развитие, масштабируемость
RedisКеш, сессии, очередиЭкстремальная скорость, в памяти
CassandraБольшие распределённые системыНадёжность, масштабируемость, доступность

Практический опыт

В своей работе обычно комбинировал:

  • PostgreSQL как основной хранилище для бизнес-данных
  • Redis для кеширования и очередей задач
  • MongoDB для логирования и аналитики (если нужна гибкая схема)
  • SQLite для локального хранения и тестирования

Выбор СУБД зависит от конкретных требований: объём данных, паттерны доступа, консистентность, масштабируемость и структурированность данных.