Ответ
В Node.js-проектах я активно использовал PostgreSQL, преимущественно с драйвером pg (node-postgres) и ORM Sequelize. Основные задачи включали проектирование схемы, оптимизацию запросов и обеспечение целостности данных.
Пример подключения и запроса с pg:
const { Pool } = require('pg');
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
ssl: { rejectUnauthorized: false }
});
async function getActiveUsers() {
const query = 'SELECT id, email FROM users WHERE is_active = $1 AND created_at > $2';
const values = [true, new Date('2023-01-01')];
const { rows } = await pool.query(query, values);
return rows;
}
Ключевые практики в моем опыте:
- Транзакции: Использование
BEGIN,COMMIT,ROLLBACKчерезpool.queryдля атомарности операций, например, при регистрации пользователя с созданием связанных записей в нескольких таблицах. - JSONB: Хранение динамических конфигураций или метаданных в полях типа
JSONBс использованием индексов GIN для эффективного поиска. - Connection Pooling: Настройка пула соединений в
pgдля управления нагрузкой и избежания переподключений. - Сложные запросы: Часто применял CTE (Common Table Expressions) для читаемых многоступенчатых запросов и оконные функции для аналитики (например,
ROW_NUMBER(),LAG()). - Миграции: Использовал инструменты вроде
node-pg-migrateили миграции в Sequelize для контроля версий схемы БД.
Ответ 18+ 🔞
Да ты представляешь, в Node.js-проектах я с PostgreSQL так наяривал, что удивление пиздец. В основном через драйвер pg и ORM Sequelize. Задачи были — от проектирования схемы до такой оптимизации запросов, чтобы они летали, а не ползали как манда с ушами. И чтобы целостность данных была на уровне, а не доверия ебать ноль.
Вот, смотри, как с pg обычно подключались и запрос гоняли:
const { Pool } = require('pg');
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
ssl: { rejectUnauthorized: false }
});
async function getActiveUsers() {
const query = 'SELECT id, email FROM users WHERE is_active = $1 AND created_at > $2';
const values = [true, new Date('2023-01-01')];
const { rows } = await pool.query(query, values);
return rows;
}
А по поводу ключевых практик — слушай сюда, было весело:
- Транзакции: Это святое. Использовал
BEGIN,COMMIT,ROLLBACKчерезpool.query, чтобы операции были атомарными. Ну, например, когда пользователь регистрируется и надо ему в трёх таблицах сразу записи навтыкать. Чтобы либо всё записалось, либо нихуя — чистая целостность, без этих «ой, а тут половина данных потерялась». - JSONB: О, это моя любовь. Для всяких динамических конфигов или метаданных — идеально. Засунул туда что хотел, да ещё и GIN-индексы навесил для поиска. Удобно, ёпта.
- Connection Pooling: Настраивал пул соединений в
pg, чтобы не дёргать базу на каждое чихание. Иначе при нагрузке можно так взъебать сервер, что он накроется медным тазом. Надо же управлять этим делом. - Сложные запросы: Часто юзал CTE (Common Table Expressions), чтобы многоступенчатые запросы были читаемыми, а не хуй в пальто. И оконные функции для аналитики —
ROW_NUMBER(),LAG()и прочее. Когда нужно ранжирование или сравнение со строкой выше — красота. - Миграции: Без этого никуда. Использовал
node-pg-migrateили миграции в Sequelize, чтобы схема БД была под контролем версий. Иначе в команде начнётся такой пиздец, что волнение ебать — у каждого своя структура базы, и ничего не работает.
Видео-ответы
▶
▶
▶
▶
▶