Row-level security
Access is enforced in the database, not just hidden in the interface. A user's role decides which rows exist for them — a teacher's query cannot return another teacher's class, a branch manager's cannot return another branch's ledger.