Guide

Building a school database that lasts

Last updated 18 August 2026

Almost every school starts the same way: one spreadsheet for students, maybe another for staff, a third for fees. It works fine for a term or two. Then a student transfers class mid-year, someone fixes a typo in one sheet but not the other three it was copied into, and nobody can say with confidence which version of the admission list is correct. That moment - not the size of the school - is what actually forces the move to a real database.

A spreadsheet is a list. A database is a set of lists that know about each other: a student record that stays linked to its guardian, its class history, its fee payments and its results, even as all four of those change independently over six years of schooling. That difference is the entire reason spreadsheets stop working, and it is what to actually design for.

What "school database" really means

Searching for a school database usually turns up one of three different things, and they solve different problems:

The problem is never storage, it's relationships

Any spreadsheet can store a thousand names. What it cannot do is keep four facts about one student consistent when they change at different times:

A spreadsheet has no way to express "this row is connected to that row, and the connection itself has a history." A database does - it is, structurally, the entire point of one - and it is why a school with growing enrolment eventually hits a wall that adding more columns cannot fix.

The test that tells you it's time. Ask: "if a parent asks for their child's attendance and fee history from two sessions ago, how long does it take to answer, and how sure are we the answer is correct?" If that takes more than a few minutes, or nobody is fully sure, the spreadsheet has already stopped doing its job - the school just hasn't felt the cost yet.

What a real school database needs, at minimum

  1. One student record, one admission number, for life. Every other table - attendance, results, fees, discipline - refers back to that one ID rather than storing the student's name again. This is the single decision that prevents the "which sheet is correct" problem from ever coming back.
  2. A real guardian link, not a text field. "Parent's name" typed fresh into every form is how the same guardian ends up as three slightly different spellings. A guardian should be one record, linked to every child they have in the school.
  3. Session and term as first-class data, not a filename. "Results_2025_Term2_FINAL_v3.xlsx" is a session/term field that never got built. Every record - attendance, grade, fee - needs to know which session and term it belongs to, so history stays queryable instead of scattered across files.
  4. Access that matches the real org chart. A subject teacher should see their own subject's scores; a form teacher, their own class; an account officer, fees but not exam questions. A single shared spreadsheet cannot do this at all - anyone with the link sees everything.
  5. A backup that isn't "the last person to save it." One laptop with the only copy of six years of results is not a database, it's a single point of failure with a bigger name.

Moving off Excel without losing what's already in it

The records that already exist are not a reason to delay - they're the starting data for the new system, not a separate problem to solve first.

  1. Export what you have, as-is. Don't clean it up first; cleaning by hand introduces its own new errors. Get every existing sheet into CSV.
  2. Pick the one field every sheet agrees on. Usually the student's full name plus class, sometimes an existing admission number. That's the key a proper system uses to merge four scattered sheets into one student record.
  3. Import one term at a time, starting with the current one. Get this term's class list and fee status right first, so the school can run today on the new system. Older sessions can be backfilled afterwards without anything being on hold.
  4. Keep the old spreadsheets, read-only, for one full session. Not as the system of record - as the paper trail while the new one earns trust. Delete them once a full term has closed cleanly on the new system.

A realistic first term

  1. Weeks 1-2: import students, staff and classes for the current session only. Confirm every student appears exactly once.
  2. Weeks 3-4: run attendance and one subject's grading fully on the new system, spreadsheet as backup only.
  3. Mid-term: add fees, so a payment and a receipt live on the same student record as everything else.
  4. End of term: generate report cards from the database directly. If every figure reconciles without a manual fix, the migration is done - what's left is backfilling older sessions at your own pace.

Schools that follow roughly this order get a school with one accurate answer to "who is enrolled, who has paid, and what did they score" - instead of a folder of spreadsheets that all disagree with each other by term three.

Running a school in Nigeria?
DasticOS handles admissions, attendance, results, fees and timetables in one place.
See how it works

More guides