Расскажи про опыт работы с PostgreSQL

«Расскажи про опыт работы с PostgreSQL» — вопрос из категории Базы данных, который задают на 30% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я активно использовал PostgreSQL в нескольких production-проектах для хранения структурированных данных, от сырых логов до агрегированных витрин для аналитики и ML-признаков.

Ключевые задачи и примеры:

  1. Проектирование и оптимизация схемы: Работал с нормализованными схемами, создавал индексы (B-tree, GIN для полнотекстового поиска) для ускорения частых запросов.
  2. Сложные аналитические запросы: Регулярно использовал оконные функции (Window Functions) и CTE (Common Table Expressions) для расчетов.
-- Пример: Расчет скользящего среднего чека по пользователям за последние 7 дней
WITH user_daily_spend AS (
    SELECT
        user_id,
        date,
        SUM(amount) as daily_total
    FROM transactions
    GROUP BY user_id, date
)
SELECT
    user_id,
    date,
    daily_total,
    AVG(daily_total) OVER (
        PARTITION BY user_id
        ORDER BY date
        ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
    ) AS avg_spend_last_7_days
FROM user_daily_spend
ORDER BY user_id, date;
  1. Интеграция с Python-пайплайнами: Использовал psycopg2 и SQLAlchemy для выгрузки данных в Pandas DataFrame и загрузки результатов работы моделей обратно в БД.
import pandas as pd
import psycopg2
from sqlalchemy import create_engine

# Подключение и выгрузка данных для обучения
engine = create_engine('postgresql://user:pass@localhost/db')
query = "SELECT * FROM features WHERE partition = 'train'"
df_train = pd.read_sql(query, engine)

# ... обработка и обучение модели ...

# Загрузка предсказаний обратно в отдельную таблицу
df_predictions.to_sql('model_predictions', engine, if_exists='append', index=False)
  1. Администрирование (базовое): Настройка репликации для отказоустойчивости, мониторинг длительных запросов через pg_stat_activity, планирование задач с помощью pg_cron.