← All posts

One database per product, and why we say so out loud

“Where does our data live?” deserves an answer with a database name in it.

Every institution that has ever been asked to put its records into someone else's system asks a version of the same question: where does our data actually live, and who else is in there with us?

The comfortable answer is a paragraph about encryption and access controls. The useful answer is a database name. Each Akadesk product runs on its own Postgres database — akadesk_primary, akadesk_secondary, akadesk_tertiary, akadesk_practice, akadesk_aitutor, akadesk_educonnect — and inside each, every row belongs to exactly one tenant.

Two layers, not one

Product separation is the coarse layer: a secondary school's data is not in the same database as a polytechnic's, so no query, migration or bug in one product can reach the other. Tenant isolation is the fine layer, enforced inside each database rather than left to application code to remember.

Neither layer is interesting on its own. Together they mean the honest answer to the question is short, specific, and checkable.