Implementerade en katalogstyrd djupsammanslagning av lagrade JSON‑inställningar som förhindrar krascher på grund av saknade nycklar när schemat utvecklas.
Arbetet utfört: 2025
sparade inställningar som klarar en schemaändring
Situation. Plattformen lagrar inställningar som JSON — aviseringsinställningar och liknande — i form av en användares sparade värden lagda ovanpå en uppsättning standardvärden. Den ursprungliga sammanslagningen gjorde det på en enda nivå. Problemet visar sig senare: lägg till en ny nyckel i standardvärdena, så saknar rader som sparades innan nyckeln fanns den helt enkelt. Sedan läser någon klientkod det fältet, får undefined och kraschar — för just de användare som har varit med längst.
Uppgift. Inställningsschemat behövde kunna utvecklas på ett säkert sätt, så att en ny inställning aldrig kunde ställa till det för de användare som registrerade sig innan den fanns.
Handling. Sammanslagningen på en nivå ersattes med en djup sammanslagning som styrs av standardvärdena som katalog. Standardvärdena behandlas som den auktoritativa listan över varje nyckel som ska finnas; användarens lagrade värden slås samman rekursivt ovanpå, så att allt som finns i katalogen garanterat finns med i resultatet, oavsett om det fanns i den sparade bloben eller inte. Lägg till en nyckel i standardvärdena, så dyker den automatiskt upp i de gällande inställningarna för varje befintlig rad, nästlade nycklar inräknade. Ändringen rullades ut genom en migrering, så att befintliga data fick nyttan direkt i stället för att vänta på att skrivas om.
Resultat. Inställningarna kan växa utan oro. En ny inställning riskerar inte längre en krasch i klienten på grund av ett fält som är undefined, och frontenden slapp behovet av defensiva kontroller utspridda på varje ställe där den läser en inställning. Det gav också resten av plattformen ett pålitligt sätt att utöka vilken lagrad JSON‑blob som helst — mönstret, inte bara den enskilda rättningen.
Se tillbaka på Utformade ett funktionsbaserat dataskikt i PostgreSQL — 1 275 lagrade funktioner i 34 scheman — så att varje läsning och skrivning går via en funktion som databasen kan ge behörighet till, i stället för via en tabell. Läs vidare: Byggde lojalitets- och ryktessystemet — 67 funktioner över en huvudbok i 31 tabeller, med ligor, märken och en inlösenbutik — som tar ett radlås på saldot för att stänga fönstret för dubbelspendering. Eller ta en titt på hela portföljen.
En del av en längre historik — och den finns i sin helhet här.
Varje post är skriven på samma sätt: situationen, uppgiften, vad vi gjorde och vad som förändrades.