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

Какие знаешь виды СУБД?

1.0 Junior🔥 221 комментариев
#Базы данных и SQL

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

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

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

Какие знаешь виды СУБД?

Выбор правильной СУБД — критическое решение при архитектуре приложения. За 10+ лет работы я использовал различные типы баз данных в production и понимаю их сильные и слабые стороны.

1. Реляционные СУБД (SQL)

PostgreSQL — мой выбор для большинства проектов:

import { Pool } from 'pg';

const pool = new Pool({
  host: 'localhost',
  port: 5432,
  database: 'myapp',
  user: 'postgres',
  password: 'password'
});

// Запрос с параметрами
const result = await pool.query(
  'SELECT * FROM users WHERE id = $1',
  [userId]
);

Преимущества:

  • ACID транзакции
  • Сложные JOIN операции
  • JSON поддержка
  • Полнотекстовый поиск
  • Расширяемость

Недостатки:

  • Вертикальное масштабирование
  • Не подходит для сложных иерархических структур

MySQL/MariaDB:

import mysql from 'mysql2/promise';

const connection = await mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'myapp'
});

const [rows] = await connection.query(
  'SELECT * FROM users WHERE status = ?',
  ['active']
);

SQLite — для разработки и встроенных БД:

import sqlite3 from 'sqlite3';

const db = new sqlite3.Database(':memory:');

db.run('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)');

db.all('SELECT * FROM users', (err, rows) => {
  console.log(rows);
});

2. NoSQL: Document Databases

MongoDB — популярный документо-ориентированный СУБД:

const { MongoClient } = require('mongodb');

const client = new MongoClient('mongodb://localhost:27017');
const db = client.db('myapp');
const users = db.collection('users');

// Вставка документа
await users.insertOne({
  _id: new ObjectId(),
  name: 'John',
  email: 'john@example.com',
  preferences: { theme: 'dark', language: 'en' }
});

// Поиск с фильтром
const result = await users.findOne({ email: 'john@example.com' });

Преимущества:

  • Гибкая схема
  • Встроенные документы и массивы
  • Горизонтальное масштабирование (sharding)
  • Простые запросы для иерархических данных

Недостатки:

  • Нет ACID транзакций (в старых версиях)
  • Может привести к несогласованности данных
  • Дублирование данных

CouchDB/PouchDB:

const Pouch = require('pouchdb');

const db = new Pouch('myapp');

// Вставка документа
await db.put({
  _id: 'user:123',
  name: 'John',
  timestamp: new Date()
});

// Синхронизация
await db.sync('https://example.com/db');

3. NoSQL: Key-Value Stores

Redis — in-memory хранилище:

const redis = require('redis');
const client = redis.createClient();

await client.connect();

// Установить значение
await client.set('user:123:name', 'John');
await client.expire('user:123:name', 3600); // TTL

// Получить значение
const name = await client.get('user:123:name');

// Кеширование результатов запроса
const cacheKey = `query:users:${status}`;
let users = await client.get(cacheKey);
if (!users) {
  users = await db.query('SELECT * FROM users WHERE status = ?', [status]);
  await client.set(cacheKey, JSON.stringify(users), { EX: 3600 });
}

Memcached:

const Memcached = require('memcached');
const memcached = new Memcached(['localhost:11211']);

// Кеширование
await memcached.set('user:123', userData, 3600);
const data = await memcached.get('user:123');

4. NoSQL: Column-Family

Cassandra — для высоконагруженных систем:

const cassandra = require('cassandra-driver');

const client = new cassandra.Client({ contactPoints: ['127.0.0.1'] });
await client.connect();

const result = await client.execute(
  'SELECT * FROM users WHERE user_id = ?',
  [userId],
  { prepare: true }
);

Преимущества:

  • Линейное горизонтальное масштабирование
  • Высокая доступность
  • Отказоустойчивость

Недостатки:

  • Сложность операционной поддержки
  • Не подходит для простых приложений

5. NoSQL: Search Engines

Elasticsearch — для полнотекстового поиска:

const { Client } = require('@elastic/elasticsearch');
const client = new Client({ node: 'http://localhost:9200' });

// Индексирование
await client.index({
  index: 'posts',
  document: {
    title: 'Node.js Best Practices',
    content: 'Learn how to build scalable applications',
    author: 'John'
  }
});

// Поиск
const result = await client.search({
  index: 'posts',
  query: {
    multi_match: {
      query: 'Node.js',
      fields: ['title', 'content']
    }
  }
});

6. Graph Databases

Neo4j — для графовых данных:

const neo4j = require('neo4j-driver');
const driver = neo4j.driver('neo4j://localhost', neo4j.auth.basic('neo4j', 'password'));

const session = driver.session();

// Создать связь
await session.run(
  'CREATE (a:User {name: $name})-[:FOLLOWS]->(b:User {name: $follows})',
  { name: 'John', follows: 'Jane' }
);

// Найти путь
const result = await session.run(
  'MATCH (a:User)-[:FOLLOWS*1..3]-(b:User) WHERE a.name = $name RETURN b',
  { name: 'John' }
);

7. Time-Series Databases

InfluxDB — для временных рядов:

const { InfluxDB, Point } = require('@influxdata/influxdb-client');

const influxDB = new InfluxDB({ url, token });
const writeApi = influxDB.getWriteApi('myorg', 'mybucket');

// Записать метрику
const point = new Point('cpu_usage')
  .tag('host', 'server01')
  .floatField('value', 75.5)
  .timestamp(new Date());

writeApi.writePoint(point);

// Запрос
const queryApi = influxDB.getQueryApi('myorg');
const results = await queryApi.collectRows(
  'from(bucket:"mybucket") |> range(start: -1h)'
);

Сравнение типов СУБД

СУБДТипМасштабированиеЯзык запросовОбработкаBest For
PostgreSQLРеляционнаяВертикальноеSQLACIDОсновной выбор
MongoDBDocumentГоризонтальноеJavaScriptГибкоеБыстрая разработка
RedisKey-ValueГоризонтальноеCommandsIn-MemoryКеширование, Sessions
ElasticsearchSearchГоризонтальноеDSLИндексированиеПоиск, Логирование
Neo4jGraphВертикальноеCypherTraversalСоциальные сети
InfluxDBTime-SeriesГоризонтальноеInfluxQLВременные рядыМетрики, Мониторинг

Выбор СУБД для разных сценариев

Стартап или MVP: PostgreSQL + Redis

// Основная БД
const pool = new Pool({ /* PostgreSQL */ });

// Кеш и сессии
const redis = redis.createClient();

Высоконагруженное приложение: PostgreSQL + Redis + Elasticsearch

Социальная сеть: PostgreSQL + Neo4j + Redis

Analytics-ориентированное приложение: ClickHouse или Snowflake

Best Practices

  • Не используй одну БД для всего — комбинируй для разных задач
  • PostgreSQL как основная — надёжна и мощна
  • Redis для кеша и сессий — быстро и эффективно
  • Elasticsearch для поиска — отличает от базового поиска в SQL
  • Выбирай на основе требований, а не тренда
  • Планируй масштабирование с самого начала

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