10 промтов для эффективной работы с базами данных: PostgreSQL, MongoDB и Redis

Введение

Современный разработчик ежедневно сталкивается с десятками запросов к базам данных — от простых SELECT до сложных агрегаций и миграций. AI-ассистенты (вроде ChatGPT, Claude или GitHub Copilot) могут в разы ускорить эту работу, если правильно формулировать промты. В этой подборке — 10 проверенных промтов для PostgreSQL, MongoDB и Redis, которые я использую в продакшене. Каждый сопровождается реальным примером и кодом.

1. PostgreSQL: оптимизация медленного запроса с EXPLAIN ANALYZE

Промт: «Проанализируй следующий EXPLAIN ANALYZE вывод и предложи индексы или рефакторинг для ускорения запроса. Объясни простыми словами, что является узким местом: [вставь вывод].»

Пример: У вас есть запрос поиска заказов по дате и статусу, который выполняется 12 секунд. AI подскажет создать составной индекс на (status, created_at) или переписать условия.

CREATE INDEX idx_orders_status_date ON orders (status, created_at);

2. PostgreSQL: генерация миграции для изменения схемы

Промт: «Напиши безопасную миграцию на SQL для добавления колонки 'phone' в таблицу 'users' с ограничением уникальности и значением по умолчанию NULL. Учти, что в таблице 2 млн строк, и добавление должно пройти без длительной блокировки.»

Пример: AI сгенерирует миграцию с использованием NOT VALID и последующей валидацией:

ALTER TABLE users ADD COLUMN phone VARCHAR(20) UNIQUE;
-- для больших таблиц используйте:
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
CREATE UNIQUE INDEX CONCURRENTLY idx_users_phone ON users (phone);

3. PostgreSQL: поиск дубликатов и дедупликация

Промт: «Найди дубликаты в таблице 'contacts' по полям email и phone. Выведи только те записи, у которых более одного совпадения, и предложи запрос для удаления старых дубликатов, сохранив одну запись с наибольшим id.»

Пример: Сначала CTE для поиска:

WITH dupes AS (
  SELECT email, phone, COUNT(*) cnt
  FROM contacts
  GROUP BY email, phone
  HAVING COUNT(*) > 1
)
SELECT * FROM contacts WHERE (email, phone) IN (SELECT email, phone FROM dupes);

А затем удаление:

DELETE FROM contacts
WHERE id NOT IN (
  SELECT MIN(id) FROM contacts GROUP BY email, phone
);

4. MongoDB: проектирование агрегации для отчёта

Промт: «Напиши aggregation pipeline для MongoDB, который по коллекции 'orders' возвращает топ-10 товаров по сумме выручки за последние 7 дней. Включи название товара, общее количество и сумму. Используй $lookup для присоединения коллекции 'products'.»

Пример:

db.orders.aggregate([
  { $match: { createdAt: { $gte: new Date(Date.now() - 7*24*60*60*1000) } } },
  { $group: { _id: "$productId", totalQty: { $sum: "$quantity" }, totalRevenue: { $sum: { $multiply: ["$quantity", "$price"] } } } },
  { $sort: { totalRevenue: -1 } },
  { $limit: 10 },
  { $lookup: { from: "products", localField: "_id", foreignField: "_id", as: "product" } },
  { $unwind: "$product" },
  { $project: { name: "$product.name", totalQty: 1, totalRevenue: 1 } }
])

5. MongoDB: оптимизация запросов с explain

Промт: «У меня есть коллекция 'logs' с 50 млн документов и запрос по полю 'timestamp'. Вывод explain показывает COLLSCAN. Создай составной индекс, который покроет запрос и сортировку. Учти, что часто фильтруют по userId и timestamp вместе.»

Ответ AI: «Создайте индекс на (userId, timestamp). Для сортировки по убыванию используйте { userId: 1, timestamp: -1 }.»

db.logs.createIndex({ userId: 1, timestamp: -1 });

6. Redis: проектирование структуры данных для рейтинга

Промт: «Нужно хранить рейтинг статей с возможностью быстрого получения топа N. Какие структуры Redis использовать? Напиши примеры команд для добавления голоса и получения топ-10.»

Пример: Использовать Sorted Set:

ZINCRBY article:ratings 1 "article:123"
ZREVRANGE article:ratings 0 9 WITHSCORES

AI также предложит TTL для устаревших статей.

7. Redis: кеширование с инвалидацией

Промт: «Реализуй стратегию кеширования результатов сложного SQL-запроса в Redis. Время жизни кеша — 5 минут. При обновлении данных в БД нужно инвалидировать кеш. Напиши пример на Python с использованием redis-py и декоратора.»

Пример:

import redis, json
r = redis.Redis()

def cache_query(key_func, ttl=300):
    def decorator(func):
        def wrapper(*args, **kwargs):
            key = key_func(*args, **kwargs)
            cached = r.get(key)
            if cached:
                return json.loads(cached)
            result = func(*args, **kwargs)
            r.setex(key, ttl, json.dumps(result))
            return result
        return wrapper
    return decorator

При обновлении вызываем r.delete(key).

8. MongoDB: миграция данных с $merge

Промт: «Мне нужно перенести данные из коллекции 'users_v1' в 'users_v2' с изменённой схемой. В v2 поле 'full_name' разбито на 'first_name' и 'last_name'. Напиши aggregation с $merge для атомарного обновления.»

Пример:

db.users_v1.aggregate([
  { $project: {
    _id: "$_id",
    first_name: { $arrayElemAt: [ { $split: ["$full_name", " "] }, 0 ] },
    last_name: { $arrayElemAt: [ { $split: ["$full_name", " "] }, 1 ] },
    email: 1,
    created_at: 1
  } },
  { $merge: { into: "users_v2", on: "_id", whenMatched: "replace", whenNotMatched: "insert" } }
])

9. PostgreSQL: партиционирование таблицы

Промт: «Таблица 'events' содержит 100 млн строк и запросы по дате становятся медленными. Создай партиционированную таблицу по месяцам и миграцию данных из старой таблицы. Учти индексы и foreign keys.»

Пример:

CREATE TABLE events (
  id BIGSERIAL,
  event_date DATE NOT NULL,
  data JSONB
) PARTITION BY RANGE (event_date);

CREATE TABLE events_2026_07 PARTITION OF events
  FOR VALUES FROM ('2026-07-01') TO ('2026-08-01');

AI предупредит, что foreign keys на партиционированные таблицы требуют осторожности.

10. Redis: блокировки для распределённых систем

Промт: «Напиши реализацию распределённой блокировки с помощью Redis (Redlock-style) на Python. Блокировка должна автоматически сниматься через 10 секунд. Покажи корректную обработку сбоев и повторных попыток.»

Пример (упрощённый):

import redis, time, uuid
r = redis.Redis()

def acquire_lock(lock_name, ttl=10):
    lock_id = str(uuid.uuid4())
    if r.setnx(lock_name, lock_id):
        r.expire(lock_name, ttl)
        return lock_id
    return None

def release_lock(lock_name, lock_id):
    script = """
    if redis.call("get", KEYS[1]) == ARGV[1] then
        return redis.call("del", KEYS[1])
    else
        return 0
    end
    """
    r.eval(script, 1, lock_name, lock_id)

Заключение

Эти 10 промтов покрывают 90% повседневных задач: от диагностики производительности до проектирования схем и написания миграций. Скопируйте их в свой AI-ассистент и адаптируйте под свои данные. Помните: всегда проверяйте сгенерированный код на тестовой базе. Используйте эти промты как шаблоны — со временем вы натренируете AI отвечать ещё точнее.

Подписывайтесь на блог Asibiont — мы делимся практическими инструментами для разработчиков каждый месяц.

← Все статьи

Комментарии

Читайте также

Интеграция OPC-UA (SCADA, DCS) с AI-агентом ASI Biont: как автоматизировать промышленное оборудование и снизить простои

29 июля 2026

Arduino Due + ASI Biont: как подключить 32-битный микроконтроллер к AI-агенту и управлять им через чат

29 июля 2026

Fish Audio привлек $52 млн seed: как AI-голосовые модели меняют индустрию для креаторов и бизнеса

28 июля 2026

Мобильная безопасность — безопасность приложений iOS и Android: Освойте мобильное тестирование на проникновение в 2026 году с помощью обучения на основе ИИ

28 июля 2026

15 промтов для iOS-разработки: SwiftUI, UIKit и Core Data

28 июля 2026

Гарантия попадания в ответы нейросетей: почему это невозможно и что измерять на самом деле

28 июля 2026

Автоматизация DevOps: как AI-агент ASI Biont интегрируется с DigitalOcean и управляет облачной инфраструктурой

28 июля 2026

Обзор курса «Специалист по комплаенс в области ПОД/ФТ»: Является ли обучение с ИИ будущим образования по борьбе с отмыванием денег?

28 июля 2026

12 промтов для iOS-разработки: SwiftUI, UIKit, Core Data и Combine

28 июля 2026