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

С какими БД работает SQL

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

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

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

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

Базы данных, которые работают с SQL

SQL (Structured Query Language) — это стандартный язык для работы с реляционными базами данных. Есть много БД, которые поддерживают SQL или SQL-подобный синтаксис. Расскажу про основные.

1. PostgreSQL (мой фаворит)

-- PostgreSQL пример
CREATE TABLE users (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  name VARCHAR(255) NOT NULL,
  email VARCHAR(255) UNIQUE NOT NULL,
  created_at TIMESTAMPTZ DEFAULT now()
);

INSERT INTO users (name, email) VALUES ('John', 'john@example.com');
SELECT * FROM users WHERE email = 'john@example.com';

Характеристики:

  • Мощный ACID-compliant сервер
  • JSON/JSONB типы данных
  • Full-text search
  • Window functions, CTE (Common Table Expressions)
  • PostGIS для геоданных
  • Горизонтальное масштабирование (pg_partman)
  • Бесплатный и open-source
  • Документация на высочайшем уровне

В Node.js:

import { Pool } from 'pg';

const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
});

const result = await pool.query(
  'SELECT * FROM users WHERE email = $1',
  ['john@example.com']
);

2. MySQL / MariaDB

-- MySQL пример
CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  email VARCHAR(255) UNIQUE NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO users (name, email) VALUES ('John', 'john@example.com');
SELECT * FROM users WHERE email = 'john@example.com';

Характеристики:

  • Самая популярная БД в мире (WordPress, Facebook использовала)
  • InnoDB engine (ACID-compliant)
  • Быстрая для чтения
  • Репликация
  • Partitioning
  • Бесплатный и open-source

MariaDB vs MySQL:

  • MariaDB = форк MySQL, сделан создателем MySQL
  • MariaDB часто быстрее
  • Больше фич (virtual columns, column compression)
  • Оба используют похожий синтаксис

В Node.js:

import mysql from 'mysql2/promise';

const pool = mysql.createPool({
  host: 'localhost',
  user: 'root',
  database: 'mydb',
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0,
});

const connection = await pool.getConnection();
const [rows] = await connection.query(
  'SELECT * FROM users WHERE email = ?',
  ['john@example.com']
);

3. SQLite

-- SQLite пример (работает в памяти или в файле)
CREATE TABLE users (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name TEXT NOT NULL,
  email TEXT UNIQUE NOT NULL,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO users (name, email) VALUES ('John', 'john@example.com');
SELECT * FROM users WHERE email = 'john@example.com';

Характеристики:

  • Встраиваемая БД (работает как локальный файл)
  • Не требует сервера
  • Идеально для мобильных приложений
  • Идеально для тестирования
  • Не поддерживает масштабирование (single file)
  • ACID-compliant

В Node.js:

import Database from 'better-sqlite3';

const db = new Database('database.sqlite');

const stmt = db.prepare('SELECT * FROM users WHERE email = ?');
const user = stmt.get('john@example.com');

// или async
import sqlite3 from 'sqlite3';
const db = new sqlite3.Database('database.sqlite');

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

4. Microsoft SQL Server

-- SQL Server пример
CREATE TABLE users (
  id UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
  name NVARCHAR(255) NOT NULL,
  email NVARCHAR(255) UNIQUE NOT NULL,
  created_at DATETIME2 DEFAULT GETUTCDATE()
);

INSERT INTO users (name, email) VALUES ('John', 'john@example.com');
SELECT * FROM users WHERE email = 'john@example.com';

Характеристики:

  • Корпоративная БД от Microsoft
  • Мощные инструменты аналитики
  • ACID-compliant
  • Дорогая лицензия (есть бесплатная версия — Express)
  • Интеграция с .NET экосистемой
  • Компоненты репликации и синхронизации

В Node.js:

import mssql from 'mssql';

const pool = new mssql.ConnectionPool({
  user: 'sa',
  password: 'your_password',
  database: 'mydb',
  server: 'localhost',
  pool: { max: 10 },
  authentication: {
    type: 'default',
  },
  options: {
    encrypt: true,
    trustServerCertificate: true,
  },
});

const request = new mssql.Request(pool);
const result = await request.query(
  'SELECT * FROM users WHERE email = @email',
);
request.input('email', mssql.VarChar, 'john@example.com');

5. Oracle Database

-- Oracle пример
CREATE TABLE users (
  id NUMBER PRIMARY KEY,
  name VARCHAR2(255) NOT NULL,
  email VARCHAR2(255) UNIQUE NOT NULL,
  created_at TIMESTAMP DEFAULT SYSDATE
);

INSERT INTO users (id, name, email) VALUES (users_seq.NEXTVAL, 'John', 'john@example.com');
SELECT * FROM users WHERE email = 'john@example.com';

Характеристики:

  • Самая мощная и масштабируемая БД
  • Используется в банках, страховых компаниях
  • Дорогая лицензия
  • Есть бесплатная версия для разработки (Oracle Express Edition)
  • Real Application Clustering (RAC)
  • Advanced compression и шифрование

В Node.js:

import oracledb from 'oracledb';

const connection = await oracledb.getConnection({
  user: 'system',
  password: 'oracle',
  connectionString: 'localhost:1521/XE',
});

const result = await connection.execute(
  'SELECT * FROM users WHERE email = :email',
  { email: 'john@example.com' },
  { outFormat: oracledb.OUT_FORMAT_OBJECT }
);

6. PostgreSQL Extensions: NoSQL-как возможности

PostgreSQL поддерживает SQL и JSON:

-- JSON в PostgreSQL
CREATE TABLE users (
  id UUID PRIMARY KEY,
  data JSONB NOT NULL
);

INSERT INTO users (id, data) VALUES (
  gen_random_uuid(),
  '{"name": "John", "email": "john@example.com", "skills": ["Node.js", "TypeScript"]}'
);

-- Запросы к JSON
SELECT data->>'name' as name FROM users;
SELECT * FROM users WHERE data->>'email' = 'john@example.com';

-- Full-text search
SELECT * FROM users WHERE to_tsvector('english', data->>'name') @@ plainto_tsquery('John');

Сравнение основных SQL БД

type DatabaseComparison = {
  name: string;
  scalability: 'horizontal' | 'vertical';
  licensing: 'free' | 'commercial' | 'mixed';
  speed: 'fast' | 'medium' | 'slow'; // Для своего класса
  bestFor: string;
  maxDataSize: string;
};

const comparison: DatabaseComparison[] = [
  {
    name: 'PostgreSQL',
    scalability: 'vertical',
    licensing: 'free',
    speed: 'fast',
    bestFor: 'General purpose, high reliability, ACID',
    maxDataSize: 'Petabytes (sharding)',
  },
  {
    name: 'MySQL',
    scalability: 'vertical',
    licensing: 'free',
    speed: 'fast',
    bestFor: 'Web applications, high read throughput',
    maxDataSize: 'Petabytes (sharding)',
  },
  {
    name: 'SQLite',
    scalability: 'vertical',
    licensing: 'free',
    speed: 'fast',
    bestFor: 'Embedded, mobile, testing',
    maxDataSize: 'Terabytes (single file)',
  },
  {
    name: 'SQL Server',
    scalability: 'vertical',
    licensing: 'commercial',
    speed: 'fast',
    bestFor: 'Enterprise, analytics, .NET stack',
    maxDataSize: 'Petabytes',
  },
  {
    name: 'Oracle',
    scalability: 'horizontal',
    licensing: 'commercial',
    speed: 'fast',
    bestFor: 'Enterprise, banking, data warehouses',
    maxDataSize: 'Unlimited',
  },
];

Что НЕ SQL базы данных

// Это НЕ SQL базы данных (используют другие языки запросов):
const nonSQLDatabases = [
  {
    name: 'MongoDB',
    language: 'MongoDB Query Language',
    type: 'Document database',
    example: 'db.users.find({ email: "john@example.com" })',
  },
  {
    name: 'Redis',
    language: 'Redis commands',
    type: 'Key-value store',
    example: 'GET user:123',
  },
  {
    name: 'Elasticsearch',
    language: 'Query DSL',
    type: 'Search engine',
    example: 'GET /users/_search { "query": { "match": { "email": "john@example.com" } } }',
  },
  {
    name: 'Cassandra',
    language: 'CQL (Cassandra Query Language) — похожа на SQL',
    type: 'Wide-column store',
    example: 'SELECT * FROM users WHERE email = \'john@example.com\';',
  },
];

Мой выбор для разных сценариев

Обычное web приложение:

PostgreSQL + Node.js + Prisma ORM
✅ Надёжно, масштабируется, можно поднять сложные запросы
✅ JSONB для гибкости
✅ Полнотекстовый поиск

High load, много читает:

MySQL (Percona Server) + Read replicas + Redis cache
✅ Быстрое чтение
✅ Репликация для масштабирования чтения

Мобильное приложение:

SQLite (на устройстве) + PostgreSQL (на сервере)
✅ Оффлайн-first подход
✅ Синхронизация когда есть интернет

Тестирование:

SQLite в памяти (:memory:)
✅ Быстро, не надо настраивать сервер
✅ Очищается после каждого теста

Аналитика:

PostgreSQL (OLTP) → Redshift (OLAP)
или
ClickHouse для больших объёмов
✅ Оптимизирована для аналитических запросов

SQL vs NoSQL: когда что использовать

type UseSQL = {
  description: string;
  examples: string[];
};

type UseNoSQL = {
  description: string;
  examples: string[];
};

const useSQL: UseSQL = {
  description: 'Структурированные данные, ACID критична',
  examples: [
    'User profiles (email, phone должны быть уникальны)',
    'Financial transactions (не можем потерять деньги)',
    'E-commerce orders (консистентность важна)',
    'Social graph (сложные JOIN запросы)',
  ],
};

const useNoSQL: UseNoSQL = {
  description: 'Гибкая схема, большие объёмы, горизонтальное масштабирование',
  examples: [
    'Real-time analytics (MongoDB за скоростью)',
    'Content store (разные структуры постов)',
    'Time-series data (InfluxDB, Prometheus)',
    'Cache layer (Redis)',
  ],
};

Итог

SQL базы данных — это мощный и надёжный выбор для большинства приложений. Основные игроки:

  1. PostgreSQL — мой №1 для новых проектов (best-of-both-worlds)
  2. MySQL — классика (если уже есть, не менять)
  3. SQLite — для мобильных и тестов
  4. SQL Server — для .NET экосистемы
  5. Oracle — для enterprise

Выбор зависит от требований: ACID нужна? → SQL. Гибкая схема? → может быть NoSQL. Оба? → PostgreSQL с JSONB.