Комментарии (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 базы данных — это мощный и надёжный выбор для большинства приложений. Основные игроки:
- PostgreSQL — мой №1 для новых проектов (best-of-both-worlds)
- MySQL — классика (если уже есть, не менять)
- SQLite — для мобильных и тестов
- SQL Server — для .NET экосистемы
- Oracle — для enterprise
Выбор зависит от требований: ACID нужна? → SQL. Гибкая схема? → может быть NoSQL. Оба? → PostgreSQL с JSONB.