Лучшая база данных для Next.js, Node.js и Bun.js в 2026 году
Выбор базы данных для JavaScript-проекта в 2026 году — задача со множеством правильных ответов. PostgreSQL, SQLite, Turso, PocketBase, Neon, Supabase — каждый решает конкретные проблемы. В этой статье разберём варианты по сценариям: serverless, edge, полноценный бэкенд, SaaS, MVP. А также — как подключить выбранную БД и настроить автоматические бэкапы.
Почему выбор БД для JS-проектов отличается от других языков
JavaScript (Node.js / Bun.js / Deno) и TypeScript накладывают специфические требования на выбор базы данных:
Edge-окружения: Cloudflare Workers, Vercel Edge Functions, Deno Deploy работают в нестандартном Node.js-окружении. Традиционные TCP-подключения к PostgreSQL там не работают или ограничены. Нужны HTTP-over-SQL API или edge-native базы.
Serverless: AWS Lambda, Vercel Functions, Netlify Functions создают новое соединение с БД при каждом вызове. Это убивает PostgreSQL без connection pooler (pgBouncer, Supabase Supavisor, Neon serverless driver).
TypeScript-first: ORM с полной типизацией — не опция, а стандарт. Drizzle и Prisma дают тип-безопасные запросы без рантайм-ошибок по типу cannot read property of undefined.
Bun.js: встроенный bun:sqlite — быстрейший SQLite-адаптер в экосистеме. Bun-проекты часто выбирают SQLite как нулевую зависимость.
ORM выбор: Drizzle vs Prisma в 2026 году
Прежде чем обсуждать базы данных, нужно выбрать ORM — прослойку между кодом и БД.
Drizzle ORM — победитель 2026 года по большинству опросов:
// drizzle/schema.ts
import { pgTable, text, integer, timestamp, uuid } from 'drizzle-orm/pg-core'
export const users = pgTable('users', {
id: uuid('id').defaultRandom().primaryKey(),
name: text('name').notNull(),
email: text('email').notNull().unique(),
createdAt: timestamp('created_at').defaultNow(),
})
export const posts = pgTable('posts', {
id: uuid('id').defaultRandom().primaryKey(),
title: text('title').notNull(),
content: text('content'),
authorId: uuid('author_id').references(() => users.id),
publishedAt: timestamp('published_at'),
})
// Типобезопасный запрос с JOIN
const postsWithAuthors = await db
.select({
id: posts.id,
title: posts.title,
authorName: users.name,
})
.from(posts)
.leftJoin(users, eq(posts.authorId, users.id))
.where(isNotNull(posts.publishedAt))
.orderBy(desc(posts.publishedAt))
.limit(10)
Drizzle поддерживает PostgreSQL, MySQL, SQLite, Turso (LibSQL), Cloudflare D1, Bun SQLite — одна ORM для любого стека.
Prisma — зрелая альтернатива с более удобным синтаксисом для начинающих:
// prisma/schema.prisma
model User {
id String @id @default(cuid())
name String
email String @unique
posts Post[]
createdAt DateTime @default(now())
}
model Post {
id String @id @default(cuid())
title String
content String?
author User @relation(fields: [authorId], references: [id])
authorId String
publishedAt DateTime?
}
// Запрос с include (JOIN)
const posts = await prisma.post.findMany({
where: { publishedAt: { not: null } },
include: { author: { select: { name: true } } },
orderBy: { publishedAt: 'desc' },
take: 10,
})
Итог: Drizzle — для опытных разработчиков, которые хотят контроль над SQL и edge-совместимость. Prisma — для команд, которые предпочитают декларативную схему и богатую документацию.
Сценарий 1: Next.js App Router + Server Actions (full-stack)
Лучший выбор: PostgreSQL + Drizzle ORM + Neon или Supabase
npm install drizzle-orm @neondatabase/serverless dotenv
npm install -D drizzle-kit
// lib/db.ts — подключение к Neon через serverless driver
import { neon } from '@neondatabase/serverless'
import { drizzle } from 'drizzle-orm/neon-http'
import * as schema from './schema'
const sql = neon(process.env.DATABASE_URL!)
export const db = drizzle(sql, { schema })
// app/actions.ts — Server Action
'use server'
import { db } from '@/lib/db'
import { posts } from '@/lib/schema'
import { revalidatePath } from 'next/cache'
export async function createPost(data: { title: string; content: string }) {
await db.insert(posts).values({
title: data.title,
content: data.content,
authorId: getCurrentUserId(), // из auth session
})
revalidatePath('/blog')
}
Neon — serverless PostgreSQL с HTTP-over-SQL драйвером. Работает в Vercel Edge Functions и Cloudflare Workers без TCP-соединения. Бесплатный тариф: 0.5 GB хранилища, 190 compute-часов в месяц.
Сценарий 2: Next.js + Edge Runtime + Cloudflare Workers
Лучший выбор: Cloudflare D1 + Turso + Drizzle
// lib/db.ts — Turso для edge
import { createClient } from '@libsql/client'
import { drizzle } from 'drizzle-orm/libsql'
const client = createClient({
url: process.env.TURSO_URL!,
authToken: process.env.TURSO_AUTH_TOKEN!,
})
export const db = drizzle(client)
Turso работает везде через HTTP — Cloudflare Workers, Vercel Edge, браузер. Бесплатный тариф: 500 баз данных, 9 GB хранилища.
Сценарий 3: Node.js / Bun.js API-сервер
Лучший выбор: PostgreSQL + Prisma или Drizzle (для полноценного бэкенда), SQLite + Bun (для минималистичного сервиса)
// Bun.js + встроенный SQLite (нулевые зависимости)
import { Database } from 'bun:sqlite'
const db = new Database('app.db')
// Создание таблицы
db.run(`
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
`)
// Типизированный запрос
const getUser = db.prepare<{ id: number; name: string; email: string }, [number]>(
'SELECT id, name, email FROM users WHERE id = ?'
)
const user = getUser.get(1)
// Bun.js + Drizzle + SQLite (типобезопасно)
import { drizzle } from 'drizzle-orm/bun-sqlite'
import { Database } from 'bun:sqlite'
const sqlite = new Database('app.db')
const db = drizzle(sqlite)
// Drizzle даёт типизацию поверх bun:sqlite
const users = await db.select().from(usersTable).all()
Bun.js встроенный SQLite — самый быстрый SQLite-адаптер в экосистеме JS. На бенчмарках — в 3-5 раз быстрее better-sqlite3.
Сценарий 4: SaaS с мультитенантностью
Лучший выбор: PostgreSQL + Drizzle + Row-Level Security или Turso (одна БД на тенанта)
Паттерн «одна БД на тенанта» с Turso:
// Для каждого нового пользователя — отдельная база
import { createClient } from '@turso/api'
const turso = createClient({ token: process.env.TURSO_API_TOKEN! })
async function createTenantDb(tenantId: string) {
// Создаём новую базу для тенанта
const db = await turso.databases.create({
name: `tenant-${tenantId}`,
group: 'default',
})
return db.hostname // connection URL для тенанта
}
Turso даёт 500 баз бесплатно — идеально для мультитенантного SaaS на старте.
Сценарий 5: Indie-проект / MVP
Лучший выбор: PocketBase (SQLite внутри)
PocketBase даёт базу данных, авторизацию, файловое хранилище и REST API без написания бэкенда. Одна команда:
./pocketbase serve
Подключение к Next.js:
// lib/pocketbase.ts
import PocketBase from 'pocketbase'
// Singleton для клиентской стороны
const pb = new PocketBase(process.env.NEXT_PUBLIC_PB_URL!)
export default pb
// Server Component в Next.js
import PocketBase from 'pocketbase'
async function getPosts() {
// Серверная сторона — новый экземпляр без persistence
const pb = new PocketBase(process.env.PB_URL!)
return pb.collection('posts').getList(1, 20, {
filter: 'published = true',
sort: '-created',
})
}
Сравнительная таблица баз данных для JS
| База данных | Next.js | Node.js | Bun.js | Edge | Serverless | Цена (старт) | |---|---|---|---|---|---|---| | PostgreSQL (self-hosted) | ★★★★★ | ★★★★★ | ★★★★★ | ✗ | ⚠️ (pool) | ~500 ₽/мес VPS | | Neon (managed PG) | ★★★★★ | ★★★★☆ | ★★★★☆ | ★★★★★ | ★★★★★ | Бесплатно | | Supabase | ★★★★★ | ★★★★★ | ★★★★☆ | ⚠️ | ★★★★☆ | Бесплатно | | SQLite (local/Bun) | ★★★☆☆ | ★★★★☆ | ★★★★★ | ✗ | ✗ | Бесплатно | | Turso (libSQL) | ★★★★★ | ★★★★★ | ★★★★★ | ★★★★★ | ★★★★★ | Бесплатно | | PocketBase | ★★★★★ | ★★★★☆ | ★★★☆☆ | ✗ | ✗ | VPS (~500 ₽) | | Cloudflare D1 | ★★★★★ | ✗ | ✗ | ★★★★★ | ★★★★★ | Бесплатно | | MongoDB Atlas | ★★★★☆ | ★★★★★ | ★★★★☆ | ⚠️ | ★★★★☆ | Бесплатно (512MB) |
Рекомендации по стеку в 2026 году
Стандартный full-stack Next.js проект: PostgreSQL (Neon) + Drizzle ORM + Next.js App Router + Server Actions
Edge-first приложение: Turso + Drizzle + Cloudflare Workers / Vercel Edge
Быстрый MVP или indiehacker: PocketBase + Next.js (без написания бэкенда)
Bun.js микросервис: bun:sqlite + Drizzle или чистый SQL через bun:sqlite
SaaS с мультитенантностью: Turso (одна БД на тенанта) или PostgreSQL + RLS через Supabase
Высокая нагрузка, российские данные: PostgreSQL на Яндекс Cloud Managed PostgreSQL + pgBouncer
Бэкапы БД в JavaScript-проектах
Независимо от выбора базы данных, бэкапы критичны. dbsend.ru интегрируется в любой JS-стек:
// Бэкап перед деплоем в CI/CD (Node.js / Bun.js)
import { DbSend } from 'dbsend'
const dbsend = new DbSend({ apiKey: process.env.DBSEND_API_KEY! })
// Разовый бэкап с лейблом коммита
await dbsend.backup('production', {
label: `deploy-${process.env.VERCEL_GIT_COMMIT_SHA ?? 'local'}`,
})
console.log('Бэкап перед деплоем создан')
# Переменные в .env.local
DBSEND_API_KEY=ваш_ключ
FAQ
Что лучше: Prisma или Drizzle для Next.js в 2026 году?
По данным опросов 2026 года (Reddit r/node, State of JS), Drizzle обогнал Prisma по удовлетворённости разработчиков. Drizzle: лучше для edge-окружений, меньше бандл (7.4KB vs ~20KB), SQL-близкий синтаксис, нет code generation. Prisma: лучше документация, поддержка MongoDB, удобнее для начинающих. Для нового проекта в 2026 году — Drizzle.
Работает ли Prisma с Bun.js?
Prisma с Bun.js работает начиная с Prisma 5.x, но с ограничениями — не поддерживает bun:sqlite. Для Bun + SQLite рекомендуется Drizzle (поддерживает bun:sqlite нативно). Для Bun + PostgreSQL/MySQL — оба ORM работают.
Можно ли использовать PostgreSQL с Vercel Edge Functions?
Традиционный TCP-драйвер (pg) не работает в Edge Runtime. Нужен HTTP-драйвер: @neondatabase/serverless, @vercel/postgres или суpabase через REST API. Turso также работает на edge через HTTP. В Next.js App Router рекомендуется использовать обычные Server Components (не Edge) для запросов к PostgreSQL.
Что такое serverless PostgreSQL и зачем он нужен?
В serverless-окружении (Vercel Functions, AWS Lambda) функция создаётся и уничтожается при каждом вызове. Традиционные постоянные соединения с PostgreSQL не работают — при каждом вызове создаётся новое соединение, что перегружает БД. Serverless PostgreSQL (Neon, Supabase) использует HTTP-over-SQL или connection pooler, чтобы переиспользовать соединения через прокси.
Какую БД выбрать для хакатона на Next.js?
Supabase — быстрейший старт: dashboard за 30 секунд, REST API автоматически, авторизация из коробки. Или Neon + Drizzle — если нужен чистый TypeScript-контроль. Для совсем быстрого старта: PocketBase на VPS за 10 минут без написания бэкенда.