DanLevy.net

Волна инноваций в базах данных 2025 года

Спасибо ИИ.

Ещё одна статья про векторные базы данных? Нет.

Вот правило принятия решений, которое я хотел бы использовать раньше:

Если ваши данные можно восстановить из файлов, а пользователи в основном читают их — сначала попробуйте базу данных на основе объектного хранилища. Если пользователи пишут в неё весь день — возьмите настоящую базу данных и перестаньте заставлять S3 косплеить её.

Вот полезная граница. Не «serverless — это будущее». Не «векторные базы данных всё изменили». Эти фразы уже напечатали на достаточном количестве конференционных бейджей.

ИИ действительно изменил форму множества поисковых задач. Вдруг маленьким командам понадобился семантический поиск, гибридный ранжирование, чат по документам, мультимодальный поиск и аналитика над файлами в объектном хранилище. Старый ответ был «запусти Postgres с pgvector» или «эксплуатируй OpenSearch/Elasticsearch» или «купи управляемый поисковый сервис». Это по-прежнему хорошие ответы, когда workload этого заслуживает.

Но многие workload-ы этого не заслуживают. Они читаемо-тяжёлые, восстанавливаемые и терпимы к небольшой задержке между изменением контента и обновлением поиска. Документация. Снимки каталогов. Статические экспорты. Внутренние базы знаний. Локальная аналитика. Прототипы RAG-систем. Для них новый класс инструментов сделал скучную архитектуру необычайно мощной: собери индекс, сохрани его как файлы, отдавай по HTTP.

Заметка на полях: экосистема движется быстро. Количество звёзд, метки функций и цифры производительности ниже — это снимок сентября 2025 года, а не вечная таблица лидеров. Воспринимайте их как ориентацию, а затем проверьте текущую документацию, прежде чем строить производственную миграцию на любой ячейке.

База данных — как ни назови

Эти serverless и CDN-совместимые хранилища полезны для случаев среднего масштаба, примерно от 1 000 до 1 000 000 записей или нескольких гигабайт, где традиционная инфраструктура баз данных может быть сложнее, чем ценность:

Общий ход прост: храните долговременные данные в файлах или объектном хранилище, а затем запрашивайте их из браузера, edge-функции, воркера или лёгкого сервиса. Это не устраняет сложность. Оно перемещает сложность в пайплайны сборки, свежесть индексов, инвалидацию кэша и возможности клиента. Что является вполне приемлемым trade-off, когда доминируют чтения.

Битва чекбоксов

FeaturePagefindOramaChromaLanceDBDuckDB-WASM
Полнотекстовый поиск✅ Продвинутое стеммирование✅ BM25, 30 языков✅ SQLite FTS✅ Tantivy✅ Полноценный SQL
Векторный поиск✅ Косинусное сходство✅ HNSW✅ IVF_PQ, HNSW, GPU⚠️ Расширения
ИИ/RAG интеграцииНет✅ Встроенный пайплайн✅ LangChain, LlamaIndex✅ Продвинутое реранжирование⚠️ Ручная настройка
ХранениеСтатические JSON/WASMПамять + плагины S3Серверное*Lance, совместимый с S3WASM + S3/HTTP
Поддержка записиТолько при сборкеПолный CRUDПолный CRUDПолный CRUDПолный SQL CRUD
ПроизводительностьSub-100мс0,0001мс — 100мсSub-100мс3-5мс вектор, 50мс FTS10мс-1с (сложный SQL)

*Снимок сентября 2025: Chroma требует серверного runtime и не поддерживает прямое объектное хранилище S3 так, как это делают инструменты на основе файлов (issue #1736).

Примеры реализации

Различия в синтаксисе раскрывают настоящий раскол: поиск на этапе сборки, поиск в памяти, векторно-нативное хранилище, мультимодальные таблицы и браузерный SQL — это не одна категория продуктов только потому, что все они появляются в демо ИИ.

Статический поиск по сайту с Pagefind

<link href="/pagefind/pagefind-ui.css" rel="stylesheet">
<script src="/pagefind/pagefind-ui.js"></script>
<div id="search"></div>
<script>new PagefindUI({ element: "#search" });</script>

Корпоративная мультимодальность с LanceDB

Код для создания таблицы LanceDB с автоматическими эмбеддингами OpenAI:

import * as lancedb from "@lancedb/lancedb";
import "@lancedb/lancedb/embedding/openai";
import { LanceSchema, getRegistry } from "@lancedb/lancedb/embedding";
import { Utf8 } from "apache-arrow";
const db = await lancedb.connect("data/multimodal-db");
const func = getRegistry()
.get("openai")
?.create({ model: "text-embedding-ada-002" });
// Схема с автоматической генерацией эмбеддингов
const documentsSchema = LanceSchema({
text: func.sourceField(new Utf8()),
vector: func.vectorField(),
category: new Utf8()
});
const table = await db.createEmptyTable("documents", documentsSchema);
await table.add([
{ text: "machine learning concepts", category: "research" },
{ text: "deep learning fundamentals", category: "research" }
]);

Пример запроса к таблице LanceDB:

import * as lancedb from "@lancedb/lancedb";
import "@lancedb/lancedb/embedding/openai";
// "Подключение" к URL-пути
const db = await lancedb.connect("data/multimodal-db");
const table = db.getTable("documents");
// Комбинация SQL + векторного поиска
const results = await table.search("machine learning concepts")
.where("category = 'research'")
.limit(10)
.toArray();
console.log(results);

Универсальный поиск с Orama

import { create, insert, search } from '@orama/orama'
const db = create({
schema: {
title: 'string',
content: 'string',
embedding: 'vector[1536]'
}
})
await insert(db, {
title: 'Getting Started',
content: 'Learn the basics',
embedding: await generateEmbedding('Learn the basics')
})
const results = await search(db, {
term: 'basics',
mode: 'hybrid' // Combines text + vector search
})

DuckDB-WASM:

import * as duckdb from "https://cdn.jsdelivr.net/npm/@duckdb/duckdb-wasm@latest/dist/duckdb-browser.mjs";
const bundle = await duckdb.selectBundle(duckdb.getJsDelivrBundles());
const worker = new Worker(bundle.mainWorker);
const db = new duckdb.AsyncDuckDB(new duckdb.ConsoleLogger(), worker);
await db.instantiate(bundle.mainModule, bundle.pthreadWorker);
const conn = await db.connect();
await conn.query(`create table t as select * from (values (1,'hybrid search'),(2,'edge sql')) as v(id,txt);`);
// Опциональный полнотекстовый поиск:
await conn.query(`install fts; load fts; select * from t where match_bm25(txt, 'hybrid');`);

ИИ-нативный поиск с Chroma

import { ChromaClient } from "chromadb";
const client = new ChromaClient();
const collection = await client.createCollection({ name: "knowledge-base" });
await collection.add({
documents: ["AI will transform software development"],
metadatas: [{ source: "tech-blog", category: "AI" }],
ids: ["doc1"]
});
const results = await collection.query({
queryTexts: ["future of programming"],
where: { category: "AI" },
nResults: 5
});

Руководство по вариантам использования

Выбирайте Pagefind, когда:

Выбирайте Orama, когда:

Выбирайте Chroma, когда:

Выбирайте LanceDB, когда:

Выбирайте DuckDB-WASM, когда:

Правило принятия решений

Практический вопрос не в том, «какая база данных лучшая?»

Практический вопрос: какие изменения должна поглощать система?

Счастливый путь дешёв. Архитектуру решают крайние случаи.

Большая картина

Эти инструменты снижают минимальную инфраструктуру для полезного поиска. Это важно. В 2020 году «семантический поиск» часто подразумевал кучу сервисов, много клеящего кода и кого-то, объясняющего векторные индексы на совещании, где половина зала хотела обедать. В 2025 году маленькая команда может создать прототип той же идеи продукта с файлами, эмбеддингами и выходными.

Это не значит, что каждый поисковый ящик должен стать RAG-системой. Это значит, что первая версия больше не должна наследовать производственную инфраструктуру до того, как появятся производственные доказательства.

Даже AWS движется в этом направлении с работой над векторным поиском, смежным с S3, что является полезным сигналом: объектное хранилище больше не просто чердак, куда складывают старые файлы. Оно становится поверхностью запросов.

Начните экспериментировать

  1. Сначала выберите паттерн обновлений: сборка, ежечасный батч, живая запись или результаты для каждого пользователя.
  2. Создайте прототип с минимально честным инструментом: Pagefind для статического HTML, DuckDB для аналитических файлов, Orama для лёгкого поиска по приложениям, LanceDB или Chroma для векторно-тяжёлых задач.
  3. Измерьте уродливую часть: время индексации, свежесть, размер бандла, разрешения и первый запрос после холодного старта.
  4. Продвигайте только когда боль реальна: управляемую базу данных легче обосновать после того, как файловая версия покажет, где именно она гнётся.

Посмотрите мой практический гид по Pagefind для практической реализации или исследуйте растущую экосистему edge-нативных баз данных, меняющих работу с данными в масштабе.

Отказ от ответственности: Я использую Pagefind уже несколько лет и стал контрибьютором в 2025 году. Экспериментировал с Orama и Chroma для небольших проектов и изучаю LanceDB для более крупных ИИ-приложений. Никаких финансовых связей с этими проектами — только живой интерес к развивающемуся ландшафту баз данных.