Обзор баз данных
▸PostgreSQL
Реляционная БД с ACID транзакциями, JSON поддержкой и расширяемостью.
▸MongoDB
Документальная БД с гибкой схемой и горизонтальным масштабированием.
▸Redis
Key-value хранилище для кэширования, сессий и real-time данных.
PostgreSQL
▸Установка и подключение
1npm install pg
1import { Pool } from 'pg';23const pool = new Pool({4 host: 'localhost',5 port: 5432,6 database: 'myapp',7 user: 'postgres',8 password: 'password',9});
▸Запросы
1// SELECT2const { rows } = await pool.query('SELECT * FROM users WHERE id = $1', [1]);34// INSERT5await pool.query(6 'INSERT INTO users (name, email) VALUES ($1, $2)',7 ['Иван', 'ivan@example.com']8);910// UPDATE11await pool.query(12 'UPDATE users SET name = $1 WHERE id = $2',13 ['Николай', 1]14);
▸ORM: Prisma
1npm install prisma @prisma/client
1import { PrismaClient } from '@prisma/client';23const prisma = new PrismaClient();45// Создание6const user = await prisma.user.create({7 data: { name: 'Иван', email: 'ivan@example.com' },8});910// Чтение11const users = await prisma.user.findMany({12 where: { name: { contains: 'Иван' } },13});1415// Обновление16await prisma.user.update({17 where: { id: 1 },18 data: { name: 'Николай' },19});
MongoDB
▸Установка и подключение
1npm install mongoose
1import mongoose from 'mongoose';23await mongoose.connect('mongodb://localhost:27017/myapp');
▸Определение схемы
1const userSchema = new mongoose.Schema({2 name: { type: String, required: true },3 email: { type: String, required: true, unique: true },4 age: { type: Number, min: 0 },5 createdAt: { type: Date, default: Date.now },6});78const User = mongoose.model('User', userSchema);
▸CRUD операции
1// Создание2const user = await User.create({ name: 'Иван', email: 'ivan@example.com' });34// Чтение5const users = await User.find({ name: 'Иван' });6const user = await User.findById(1);78// Обновление9await User.findByIdAndUpdate(1, { name: 'Николай' });1011// Удаление12await User.findByIdAndDelete(1);
Redis
▸Установка и подключение
1npm install redis
1import { createClient } from 'redis';23const client = createClient();4await client.connect();
▸Операции
1// Set/Get2await client.set('user:1', JSON.stringify({ name: 'Иван' }));3const user = JSON.parse(await client.get('user:1'));45// Hash6await client.hSet('user:1', 'name', 'Иван', 'email', 'ivan@example.com');7const name = await client.hGet('user:1', 'name');89// List10await client.lPush('queue', 'task1', 'task2');11const task = await client.lPop('queue');1213// Set14await client.sAdd('tags', 'javascript', 'nodejs');15const tags = await client.sMembers('tags');
▸Кэширование
1async function getUserWithCache(id) {2 const cached = await client.get(`user:${id}`);3 if (cached) return JSON.parse(cached);45 const user = await prisma.user.findUnique({ where: { id } });6 await client.set(`user:${id}`, JSON.stringify(user), { EX: 3600 });7 return user;8}
Сравнение
▸Когда использовать PostgreSQL
▸Когда использовать MongoDB
▸Когда использовать Redis
комбинирование баз данных
▸PostgreSQL + Redis
1// Кэширование запросов к PostgreSQL2async function getCachedUsers() {3 const cached = await redis.get('users');4 if (cached) return JSON.parse(cached);56 const users = await prisma.user.findMany();7 await redis.set('users', JSON.stringify(users), { EX: 300 });8 return users;9}
▸MongoDB + Redis
1// Кэширование документов MongoDB2async function getCachedDocument(id) {3 const cached = await redis.get(`doc:${id}`);4 if (cached) return JSON.parse(cached);56 const doc = await Document.findById(id);7 await redis.set(`doc:${id}`, JSON.stringify(doc), { EX: 600 });8 return doc;9}
Миграции
▸Prisma миграции
1npx prisma migrate dev --name init2npx prisma migrate deploy
Заключение
PostgreSQL — надёжная реляционная БД. MongoDB — гибкая документальная БД. Redis — быстрое кэш-хранилище. Часто используется комбинация: основная БД + Redis для кэширования. Выбирайте исходя из требований проекта.