Layers in play
Building systems
Software that manages databases — a component beside an existing engine, a tool for a specific administrative problem, or an extension to something running.
Avenue Louise 143, 1050 Brussels, Belgium
Monday to Friday, 9:00 AM – 6:00 PM
HORIZONIS HOLDINGS BV takes on a defined set of database engagements: building and extending management systems, designing schemas, optimising queries, setting up monitoring, and handling migration and recovery. Here is what each of those means in practice.
The work, in practice
Six engagements we take on directly, plus cloud-native PostgreSQL and the situations where the estate already exists. Each one starts from the data model, not the interface.
Layers in play
Software that manages databases — a component beside an existing engine, a tool for a specific administrative problem, or an extension to something running.
Schema
Normalisation, indexes, naming, foreign keys, nullable columns. Each is cheap to change at design time and expensive later.
Query
Execution-plan reading across PostgreSQL, MySQL and SQL Server. We isolate which of four common causes is at work before touching the query.
Recovery
Logical versus physical backups, restore drills, documented procedures. A backup that has never been restored is a hypothesis.
A working summary of scope, typical triggers, and what we deliver. Full detail on each line sits in the sections below.
Spans are the ranges we see on live engagements. Your situation will change the number — a fixed-scope piece can be much shorter, and an estate assessment is usually the shortest first step.
Which layer is the work
Every engagement touches schema, queries, backup and operations to some degree. Pick the layer you are living with right now.
Schema layer engages when
A new store is being designed, or an existing one has drifted from the workloads it was written for. The output is a change plan, not a lecture on normal form.
Query layer engages when
A query that was fine is not any more. We read the execution plan to separate a bad plan from a query that prevents a good one.
Recovery and ops engage when
Nobody has tested a restore, or the team is finding out about problems from users. Documented drills and a short signal list flip that order.
Seven notes on the work: what each engagement is, when it is worth starting, and what a good outcome looks like.
Our core work is software that manages databases. That can mean a component sitting alongside an existing engine, a tool that solves a specific administrative problem, or an extension to something already running. We build for PostgreSQL, MySQL, SQL Server and IBM Db2 environments, and the choice of stack follows the estate rather than our preferences.
Development is database-first, which means we design the data model before the interface. It shows in the result. Systems built this way tend to survive their first year of real use without a redesign, because the assumptions about what the data can and cannot do were made early and on purpose.
Database-first: model, then interface
A schema is a set of decisions about what your organisation will find easy for the next several years. Normalisation, index strategy, naming conventions, foreign key constraints, the use of nullable columns: each one is cheap to change at design time and expensive later.
We work on schemas at both ends. New designs get built with the workload in mind, whether it is a transactional service or an analytical store. Existing schemas get reviewed against how they are actually used, which frequently differs from how they were imagined. The output is a concrete change plan, not a lecture on third normal form.
Reviewed against real workload, not intent
Slow queries usually have one of four causes: a missing or unused index, a plan that the optimiser chose badly, a query written in a way that prevents a good plan, or a data volume the design was never meant to hold. Finding out which one applies requires reading the execution plan, not guessing.
We optimise queries across PostgreSQL, MySQL and SQL Server, and we look at the surrounding causes as well. A query that is slow because the table has grown by a factor of fifty is a different problem from one that is slow because of a bad join order, and the fixes are different too.
Four causes, one execution plan
Monitoring answers a question that query optimisation does not: what is happening over time. Connection counts, cache hit ratios, replication lag, lock contention, the growth rate of the largest tables. Without this, a database is managed reactively, and reactive management means incidents are discovered by users.
We set up monitoring that produces something a person can act on. Alerts that fire constantly get ignored. Dashboards that show forty metrics and no trend get ignored too. The goal is a short list of signals that indicate a problem early enough to do something about it.
A short list, not a wall of gauges
A backup that has never been restored is a hypothesis, not a safeguard. We treat recovery as the thing worth testing, with backups as the means to it. That means documented restore procedures, periodic restore drills, and clarity about the recovery point and recovery time a business can actually tolerate.
The practical work includes choosing between logical and physical backups, deciding where copies live and how long they are kept, and making sure the person who needs to restore at 3am knows where the instructions are. This is unglamorous work and it is the difference between an incident and a catastrophe.
Restore tested, not assumed
Migrations between engines, between hosting models, or between major versions of the same engine. Each has its own failure modes. Version upgrades are usually the least dramatic and the most often deferred, which is why they tend to hurt when they finally happen.
We approach migration in phases with a rollback point at each one. Data type mapping, SQL dialect differences, and the behaviour of client tools all get checked before the cutover rather than after. A migration plan that assumes everything works on the first attempt is a plan that has not been tested.
Phased, with a rollback at each step
CloudNativePG is the tool we reach for when PostgreSQL runs on Kubernetes. It deploys and manages PostgreSQL clusters in cloud-native environments and fits teams working with GitOps and containerized infrastructure. The operational model is genuinely different from running a database on a traditional server, and the failure modes are different too.
We help teams adopt it without losing the fundamentals. A Kubernetes operator does not design your schema, choose your indexes or decide your retention policy. It handles the lifecycle of the cluster, and that is a meaningful amount of work removed, but it is not the whole job.
Operator handles lifecycle; you still own the data
When the estate already exists
Plenty of engagements start with an estate nobody would design from scratch. A SQL Server instance used for reporting, a PostgreSQL cluster for a newer service, MySQL underneath a web application that predates the current team, and possibly an IBM Db2 system in a corner of the organisation that everyone is careful around. That is normal, and it is workable.
We assess what exists, identify what is genuinely at risk, and propose changes in an order that does not require stopping the business. Not every improvement needs to happen this quarter, and saying which ones can wait is part of the value.
What the first weeks of an assessment look like
Read more about how a first engagement runs, or compare the platforms we support.
Next step
Most engagements start with a short conversation about your estate: which engines are in production, what is hurting, and what a reasonable first step looks like. If the answer is that you do not need us yet, we will say so.
Where we work from
HORIZONIS HOLDINGS BV