Migration'ı Expand-Contract ile Yapmak
NOT NULL'u tek commit'te dayamamak

Tek migration: kolon ekle, NOT NULL, default, backfill. Postgres 11'de default yazmak tabloyu yeniden yazabiliyordu. 16'da çoğu ADD COLUMN DEFAULT hızlı; NOT NULL doğrulaması hâlâ tabloyu tarar. Ben ikisini aynı anda koştum, lock uzadı.
Üç adım
-- 1. expand: nullable kolon, uygulama hem eski hem yeni yolu yazar
ALTER TABLE users ADD COLUMN email_verified boolean;
-- 2. backfill parçalı, kısa transaction
UPDATE users
SET email_verified = false
WHERE id IN (
SELECT id FROM users
WHERE email_verified IS NULL
LIMIT 2000
);
-- 3. contract: doğrula, NOT NULL, eski yolu kapat
ALTER TABLE users
ALTER COLUMN email_verified SET DEFAULT false,
ALTER COLUMN email_verified SET NOT NULL;
Uygulama 1. adımdan itibaren INSERT'te kolonu doldurur. Backfill bitmeden NOT NULL yok. Bitince doğrulama kısa sürer çünkü NULL kalmamıştır. Kodu iki sprint taşırım; lock'u 11 dakikadan 2 saniyeye indiririm.
Rename de aynı
display_name → name tek ALTER RENAME uygulama ile yarışır. Önce yeni kolon, çift yazma, okumayı yeniye alma, eskiyi düşürme. Sıkıcı. Tek rename'den daha sıkıcı olanı, deploy sırasında 500 yemek.
Yorumlar
Yorumlar (0)
Yorumlar üyelere açık. Üye ol · Giriş yap