Разберись, как СУБД превращает SQL в план, хранит версии строк и защищает транзакции от гонок. Научись читать план запроса, выбирать индексы и работать с пулом соединений из Go, а затем оценивать варианты репликации и масштабирования по их цене.
Свяжи реляционную модель с тем, что увидишь в запросе: как NULL меняет логику условий, почему JOIN может размножить строки и как физический план влияет на скорость. Это поможет выбирать хранилище по запросам и проверять результат через план, а не по виду SQL.
Посмотри на транзакцию как на способ сохранить бизнес-инвариант при параллельной работе запросов. Разбери аномалии через порядок операций, сопоставь их с уровнями изоляции PostgreSQL и пойми, зачем приложению обрабатывать конфликты и дедлоки.
Свяжи MVCC с повседневным поведением PostgreSQL: обновление создаёт новую версию строки, а старая остаётся видимой уже начатым снимкам. Из этого следуют работа autovacuum, влияние долгих транзакций и причины разрастания таблиц и индексов.
Научись оценивать индекс как отдельную структуру с ценой чтения, записи и хранения. Разбери B-tree, составные и покрывающие индексы и ситуации, когда планировщик выбирает последовательное чтение, хотя индекс существует.
Разбирай медленный запрос по фактическому плану: сравнивай оценки строк с реальностью, ищи лишние чтения и только потом меняй SQL или индекс. Эта глава также показывает, как распознать N+1, дорогой OFFSET и неудачную пакетную загрузку в Go-коде.
Отработай повторяющиеся формы SQL на задачах: антиджойн, дедупликацию, ранжирование внутри группы и рекурсивный обход дерева. Сравнивай решение не только по синтаксису, но и по точной семантике: что считается дублем, как обрабатываются равные значения и как остановить цикл.
Пройди путь запроса от пула до строки результата: соединения ограничены, контекст должен дойти до драйвера, а rows нужно закрыть и проверить после итерации. Научись удерживать транзакцию в одном владельце, параметризовать значения и выкатывать изменение схемы без конфликта со старой версией…
Раздели масштабирование чтения, отказоустойчивость и распределение данных: реплики не решают все три задачи одинаково. Сравни синхронную репликацию, лаг чтения, failover, шардирование и бэкапы, а также разберись, почему распределённая транзакция часто уступает саге с явными промежуточными…