Software Development

Database Schema Migration Best Practices for a Growing South African Business

A plain-language guide to database schema migration for the person paying for the software, not building it. Covers zero-downtime changes, database version control, and what to ask before a developer touches your live database.

By Arnaud Brunel — Founder, Brunel Studios 28 August 2026 Last updated: 28 August 2026
Software Development

The core best practice for database schema migration is to treat every change as a small, version-controlled, reversible script, tested before it touches production, applied additively first so old and new code can run side by side, and never as a manual, undocumented edit made directly against a live database.

How do you change a database schema without breaking what's already running?

A schema change breaks an application when the code and the data stop agreeing about what exists, not because the underlying change was wrong in itself. Renaming a column, splitting a table, or tightening a constraint are all routine, necessary things to do as a business grows. The danger is doing them in one step, against a database people are actively using, with no way back if something does not match what the application expects.

The safer pattern is additive first, subtractive later. Add the new column or table alongside the old one. Write the application so it can read and write both. Backfill the data. Switch the application over fully. Only once nothing depends on the old structure do you remove it. This is what people mean by database schema changes without downtime: not a clever piece of infrastructure, but a sequence of small, backward-compatible steps where the old and new versions of your data model are both valid at the same time.

This only works if each step is a script, not something typed directly into a database console. A migration script is checked into the same repository as the application code, runs in the same order every time, and gets tested against a copy of production data before it goes near the real thing. That discipline, applied consistently, is what people mean by database version control: the schema has a history, the same way the code does, and anyone can see exactly what changed, when, and why.

Most schema failures are not caused by bad SQL, they are caused by too much confidence

The honest tension in this topic is that a manual schema edit almost always works, right up until the one time it does not. A founder or a junior developer runs an ALTER TABLE directly against production because it is faster than setting up a migration tool, and ninety-nine times out of a hundred, nothing goes wrong. The cost only shows up on the hundredth time, and by then the business is already exposed to it. Downtime is not an abstract risk for a South African SME. Yolo, a South African connectivity and IT provider, found that for a mid-sized business turning over R100 million a year, five downtime incidents in a year can strip away R500,000 in profit, with an average outage costing smaller businesses around R223,000 each time (Yolo, "The True Cost of Downtime for South African SMBs," 2025). Research firm ITIC's 2024 study found the number gets worse, not better, at smaller scale: a micro business under 25 people can lose roughly $1,670 for every minute a system is down (ITIC, via mev.com, 2025). A schema change gone wrong at 11pm on a Friday is exactly the kind of incident that produces those numbers.

We ran into this directly on a property management platform we built for two founders of a South African real estate business, a five and a half month build on a Node.js and Express backend running on PostgreSQL. Rather than set up a basic ORM and edit the schema by hand as requirements changed, we integrated Liquibase from the start, so every schema change was written as a version-controlled, reversible changeset rather than a one-off edit against the live database. The payoff was not a feature anyone could see. It was that as the founders kept adding new requirements mid-build, we could evolve the database structure under an already-running system with no downtime and no risk of losing tenant or property data, because every change had already been tested and could be rolled back on its own if something did not behave as expected. It is the same platform behind our earlier look at property management software built for South African landlords and agents, here from the specific angle of how its database was kept safe to change as the founders' requirements evolved.

That is the actual trade-off most guides skip past. Zero downtime migration is not a tool you buy, it is a habit you adopt, and the habit costs you a little more time upfront on every single change in exchange for never having a change you cannot undo.

What to ask before anyone touches your database

If your business is still running on a handful of spreadsheets or a single admin tool nobody has touched the internals of in two years, this matters less right now, though it is worth building the habit before you need it. If you already have a system customers or staff rely on daily, whether it is a booking tool, a CRM, or an operations dashboard, this should be a standard question for whoever maintains it: what tool tracks our schema changes, and can you show me the history of what has changed in the last six months? A developer who cannot answer that plainly, or who describes changes as things they "just ran," is telling you your data has no safety net. This is also a reasonable thing to raise before commissioning any new custom software that will hold data your business depends on, since the migration discipline is far cheaper to build in on day one than to retrofit once the system is already load-bearing.

Founders evaluating this do not need to understand Liquibase or Flyway to ask the right question. They need to know that "we changed the database" should always come with a record of exactly what changed, an ability to reverse it, and confidence the application kept working the entire time. If a vendor cannot give you that, the risk is not hypothetical. It shows up the day a change goes wrong and there is no way back.

Questions about database schema migration

How can you update a database schema without affecting functionality?

Add new structure before removing old structure: introduce new columns or tables alongside the existing ones, migrate the data across, switch the application over to the new structure, then retire what is no longer used. Version-controlled migration scripts keep the system live and functional throughout the entire process.

How do you change a database design without losing data?

Every change is written as a tracked, reversible migration script rather than an ad hoc edit, and tested against a copy of production data first, through a tool that records exactly what ran and when. A failed step rolls back cleanly instead of leaving the database in an unknown state.

What is zero-downtime database migration?

It means changing a live database's structure, adding a field, splitting a table, or changing a relationship, without taking the application offline or blocking the transactions currently running against it. It is achieved through small, backward-compatible steps rather than one large disruptive change applied all at once.

What is database version control?

Every schema change is written as a numbered, tracked script stored alongside the application code, using the same discipline applied to the code itself. On a property management platform we built with Liquibase managing this from day one, that meant a full, reproducible history of what changed and when, on every environment.

What tools manage database schema migrations?

Purpose-built tools such as Liquibase and Flyway track schema changes as version-controlled scripts, apply them in a defined order, and keep a changelog of what has run against each environment. They replace manual, one-off SQL edits with a system that knows its own history.

What happens if a database migration fails partway through?

Without version control, a failed migration can leave a database in a partially changed, inconsistent state that is difficult to diagnose or undo. A properly tracked migration records each step separately, so a failure stops at a known point and can be rolled back rather than compounding.

Why does this matter more for a growing South African SME than a large enterprise?

A South African SME rarely has a dedicated database administrator or a spare environment to test changes safely, so a schema change is often made directly against the live system a customer is using right now. Version-controlled, reversible migrations protect against exactly that, without needing extra in-house engineering headcount.

Arnaud Brunel

Founder, Brunel Studios

Arnaud Brunel is the founder of Brunel Studios, a software product studio based in Cape Town. He has spent the last 8 years building digital products for founders and SMEs across South Africa and Africa, working across mobile, web and AI-native platforms.

LinkedIn ↗