migrations

  • The partition that could finally be dropped

    A partition where every remaining row was past its retention, eight months after the classification work. The partition scheme from 2023 aligns with the retention classes only at…

  • A denormalised schema that is rebuilt rather than synchronised

    A reporting schema shaped for the questions, populated by a full rebuild, which removes every synchronisation bug. Denormalisation is safe here because the table is truncated and rebuilt…

  • Deleting a module

    A module built in 2022 for a product line discontinued in 2024. Eight thousand lines, a database schema and two scheduled jobs, all still running.

  • The reporting database that is not a replica

    A read replica serving reports, and reports that want a different schema. Eleven indexes on production tables that exist only for reporting.

  • The value object library, five years on

    32 value objects in 2021, 41 now, and a retrospective on which of them earned their place. No symptom — a deliberate look.

  • Ten years of a WordPress site, and what is left of the theme

    A theme that was 61 PHP templates in 2023 and is six block templates and a stylesheet. An audit rather than a problem.

  • A dual-write window, and the check that ran nightly

    Six weeks of writing two columns, and a check that they agree. The nightly agreement check is what makes a dual-write window safe, and it caught exactly the…

  • The integration that outlived the integrator

    A supplier acquired and shut down, and an endpoint returning 200 with an empty body for eleven weeks.

  • An expand-and-contract for a column type

    A VARCHAR(32) becoming an ENUM, on a table with four hundred writes a second. Four releases for a column type is the honest cost of not being able…

  • A copy tool rejected because of a trigger

    An online schema change tool that works by adding triggers, on a table an outbox relay polls. The tool is well understood and the interaction with an existing…