Ответ
PostgreSQL — основная реляционная СУБД, с которой я работаю в production. Мой опыт включает:
- Проектирование схем данных: нормализация, выбор подходящих типов данных, использование ограничений (constraints).
- Написание сложных SQL-запросов: активное использование
JOIN
, подзапросов,CTE
(Common Table Expressions) и оконных функций для аналитических задач. - Оптимизация производительности: анализ планов выполнения запросов (
EXPLAIN ANALYZE
), создание и поддержка необходимых индексов (B-Tree, GIN, GiST), оптимизация структуры запросов. - Работа с транзакциями: понимание и применение уровней изоляции транзакций (в основном
Read Committed
иRepeatable Read
) для обеспечения консистентности данных. - Работа с JSON/JSONB: хранение и индексация неструктурированных данных внутри PostgreSQL.
- Настройка и использование репликации: настройка потоковой репликации (streaming replication) для создания read-only реплик и повышения отказоустойчивости.
В Go использую как низкоуровневые драйверы (pgx
), так и ORM (GORM
), выбирая инструмент в зависимости от задачи.
Пример запроса с использованием pgx
:
conn, err := pgx.Connect(ctx, "postgres://user:password@localhost:5432/database_name")
if err != nil {
log.Fatalf("Unable to connect to database: %vn", err)
}
defer conn.Close(ctx)
var name string
var age int
err = conn.QueryRow(ctx, "SELECT name, age FROM users WHERE id = $1", 1).Scan(&name, &age)
if err != nil {
// Важно обрабатывать pgx.ErrNoRows отдельно
if err == pgx.ErrNoRows {
fmt.Println("No user found with that ID")
} else {
log.Fatalf("QueryRow failed: %vn", err)
}
}
Также имею опыт написания и применения миграций базы данных с помощью инструментов goose
и golang-migrate/migrate
.