Почти любой сервис хранит данные в реляционной базе, чаще всего в PostgreSQL. Для LLM-продуктов это пользователи и права, история диалогов, документы и их фрагменты, оценки ответов, расходы на модели.
SELECT d.id, count(m.id) AS messages, avg(f.score) AS rating
FROM dialogs d
JOIN messages m ON m.dialog_id = d.id
LEFT JOIN feedback f ON f.message_id = m.id
WHERE d.created_at > now() - interval '7 days'
GROUP BY d.id
ORDER BY rating NULLS LAST;
Что важно знать
- SELECT, JOIN (INNER, LEFT), GROUP BY, подзапросы, оконные функции.
- Первичные и внешние ключи, нормализация без фанатизма.
- Индексы: когда помогают, когда мешают, как читать EXPLAIN.
- Транзакции и изоляция: два запроса меняют одну запись одновременно.
- Только параметризованные запросы — никакой склейки строк.
- pgvector превращает PostgreSQL в векторную базу — часто это лучший старт для RAG.