Service · Software development

Custom database development.

A database isn't something you fill in afterwards. It determines how quickly your application keeps running as you grow, how secure the data is, and how expensive hosting becomes over five years. We design, build and maintain databases that grow with your product, from schema design for a new SaaS to performance tuning of a slow legacy system.

PostgreSQLSchema designPerformance tuningData migrationHigh availability

Database work as a specialism.

Many development teams treat the database as an implementation detail of the application. That works fine, until the first hundred thousand users arrive, the first audit comes knocking, or the first migration to the cloud is on the table. Then it turns out the schema isn't indexed, read replicas aren't configured, and there's no audit log.

We treat database development as a discipline in its own right. Whether we're designing a schema for a greenfield product, tuning a slow production database, or migrating a legacy Oracle environment to PostgreSQL, we work from the demands of the domain, not from whichever ORM the developers happen to be used to. The result is a data layer that scales predictably, can be maintained by your team, and doesn't need redesigning within a year.

We work both within our broader cloud-native platform development and as standalone database engagements. Many of our clients come to us with a specific problem (a query that's too slow, a migration that feels risky, an audit requirement that has suddenly appeared) and don't want a completely new platform straight away.

Three types of database engagement.

What we do depends on where your organisation stands. A new application needs different attention from a ten-year-old system that has suddenly stopped scaling.

Greenfield: schema design for a new application

Schema design from scratch

For new SaaS products, e-commerce platforms or custom applications, we help design the data model. Together we decide which entities, relationships and indexes are needed, which columns may be polymorphic, and which normalisation choices will keep the system manageable five years from now. We build in multi-tenant design (row-level security or schema-per-tenant), audit logging and an encryption strategy from the very start.

PostgreSQLMulti-tenantAudit logMigrations
Performance tuning and optimisation

Making a slow database faster

The classic call: "our app has become slow over the past year." We analyse slow query logs, EXPLAIN plans and index statistics. We tackle N+1 problems, rewrite poorly written joins, add missing indexes and, where needed, review the connection pool configuration. Often we achieve order-of-magnitude improvements without the schema having to change fundamentally.

EXPLAIN ANALYZEpg_stat_statementsIndexing strategyQuery rewriting
Migration and architecture programme

Database migration and redesign

Oracle to PostgreSQL, on-premise SQL Server to Aurora, splitting a monolithic database, or moving from SQL to a hybrid model with document or time-series storage. We map the data model, design the target architecture, and carry out the migration in phases using dual-write or CDC so that production keeps running. We often work alongside our platform migration teams.

Oracle → PostgreSQLSQL Server → AuroraCDC / DebeziumZero downtime

What you get at the end.

No loose dump files or a Confluence page. A working production database, documented in a way your own team can carry on with.

  • The database environment itselfProduction and staging, with replication, backups and monitoring set up. Runs in your cloud (GCP, AWS, Azure) or with us.
  • Schema and migrations as codeVersioned migrations via Flyway, Liquibase, Atlas or Prisma Migrate. Every change is traceable, reversible and reproducible.
  • Documentation and ERDsSchema diagrams (dbdiagram, DBeaver), a column glossary and an architecture overview. Written to be handed over, not as a box-ticking exercise.
  • Backup and recovery procedurePoint-in-time recovery, a tested restore script, and clearly documented RPO/RTO figures. We carry out at least one real restore before handover.
  • Monitoring and alertingpg_stat dashboards, Prometheus exporters, slow-query alerts. Your team sees peaks coming, rather than only learning of them when users complain.
  • Managed service contract (optional)Patching, capacity planning, ongoing performance reviews. Fixed monthly fee, four response-time levels.

When database work deserves its own project.

Not every database question is a service in its own right. But we keep recognising these patterns, and this is where dedicated database work makes the difference between patching symptoms and solving the underlying problem.

Performance

Queries keep getting slower

The application was fast, but with every release another quarter of a second of response time creeps in. The slow-query log keeps growing, users complain, and the developers are afraid to touch the schema.

Scale

A single database is hitting its limits

You are reaching the limits of what a single instance can handle. Sharding, partitioning, read replicas or a split between OLTP and OLAP workloads becomes unavoidable.

Migration

Legacy has to go

Oracle licences are expensive, SQL Server has to move to the cloud, or an outdated MySQL 5.7 needs replacing. You don't want a big-bang migration, but a phased move with no downtime.

Compliance

Audit requirements are changing

GDPR deletion, the right to be forgotten, retention policies, audit logging of who changed what. Solving this too crudely in the application layer is a mistake; it belongs at database level.

Multi-tenant

Client isolation is becoming risky

Your multi-tenant platform is growing, and the current approach (a single tenant_id column with queries that filter on it) is becoming fragile. Row-level security or schema-per-tenant becomes necessary.

AI / vector search

Adding RAG or semantic search

You want to add an AI feature using retrieval-augmented generation, semantic search or similarity matching. That calls for pgvector, a dedicated vector database, or a hybrid approach where both run side by side.

How a database project works with us.

1

Assessment and analysis

We map out the current model: schema, data volumes, slow queries, monitoring data and usage patterns. For a greenfield project, we do the same but based on the use cases and read/write patterns you anticipate.

2

Architecture decisions

Which database suits this domain? PostgreSQL is our default, but sometimes ClickHouse for analytical queries, TimescaleDB for time-series data, or MongoDB for heavily nested documents. We justify each choice and set the alternatives side by side.

3

Schema and migrations

The data model is presented as an ERD, a migration script and a testable schema definition. Your team can review it, suggest indexes, and see how queries will perform under load through benchmarks on realistic volumes.

4

Implementation and migration

For new databases: build, connect to the application, and load testing. For migrations: dual-write or CDC so production keeps running, followed by a controlled cut-over. We always do a dry run before going to production.

5

Monitoring, handover and maintenance

Dashboards, alerts and runbooks for incident response. Your team receives training on the chosen tools, and we either hand over management entirely or keep it under an ongoing contract with us.

What we work with.

We are not tied to a single vendor or stack. We advise based on what best suits your domain, team and existing systems.

Relational: our default for custom development

SQL databases

PostgreSQL is our standard first choice for custom applications: a rich feature set, strong standards, no licensing lock-in and excellent cloud support. We also work with MySQL and MariaDB (particularly in existing LAMP stacks), Aurora within AWS, Oracle in legacy contexts, and SQL Server in Microsoft environments.

PostgreSQLMySQLMariaDBAuroraOracleSQL Server
NoSQL and specialised stores

Document, key-value, time-series, graph

For heavily nested documents we use MongoDB or CouchDB. Redis, Valkey and DynamoDB for caching and session storage. TimescaleDB or InfluxDB for sensor and metric data. Neo4j or ArangoDB for relationship-heavy problems such as fraud detection or recommendations. For search functionality we choose Elasticsearch, OpenSearch or Meilisearch, depending on scale and budget.

MongoDBRedisDynamoDBTimescaleDBNeo4jElasticsearch
Analytical, vector and wide-column

OLAP, AI and large volumes

For analytical workloads and data warehouses we use ClickHouse, Apache Druid, BigQuery, Snowflake or Databricks. See also our work on real-time analytics platforms. For AI/RAG implementations, pgvector within PostgreSQL or a dedicated vector store such as Pinecone or Weaviate. For extremely high write volumes, Cassandra or ScyllaDB.

ClickHouseBigQuerySnowflakepgvectorPineconeCassandra

Tooling we use.

Database work is a craft with its own toolkit. Below are the tools that almost always come up in our projects. The list is not exhaustive, but it is representative.

  • ORM and query buildersPrisma and TypeORM for TypeScript stacks, SQLAlchemy for Python work, Hibernate or jOOQ in Java environments. We write SQL where the ORM falls short.
  • Schema migrationsFlyway and Liquibase for enterprise contexts, Atlas for declarative schemas, Prisma Migrate or TypeORM migrations for JS/TS work. Always version-controlled, always reversible where possible.
  • Performance analysispg_stat_statements, pgBadger, EXPLAIN ANALYZE, auto_explain. For MySQL/MariaDB, the Performance Schema and sys schema. For SQL Server, Query Store and DMVs.
  • Schema design and visualisationdbdiagram.io for quick ERDs, DBeaver and DataGrip for day-to-day work, SchemaSpy for automatically generated documentation.
  • Backup and recoverypgBackRest and Barman for PostgreSQL, native point-in-time recovery in Aurora and Cloud SQL, and tested restore scripts in our runbooks.
  • MonitoringPrometheus exporters, Grafana dashboards, Datadog Database Monitoring, and CloudWatch where it fits. Slow-query alerts and index bloat checks as standard.
  • CDC and data pipelinesDebezium for change data capture, Kafka or Pulsar as the transport, and dbt for transformations towards analytical environments.

Frequently asked questions.

What clients usually want to know before we start on database work.

PostgreSQL or MongoDB: which should I choose?
By default, we choose PostgreSQL for custom applications. Relational work, transactions, complex queries and consistent data are where it excels. MongoDB comes into its own if you have heavily nested, loosely structured documents (think content management, IoT payloads, event data) or if you have a team already deeply embedded in the JavaScript stack. A hybrid approach is often sensible: PostgreSQL for the transactional core, MongoDB or another document store for derived, rarely queried data. We help you make that choice before you commit to a single model.
When is performance tuning enough, and when is a redesign needed?
The vast majority of performance problems can be solved without changing the schema: adding or removing indexes, rewriting queries, addressing N+1 problems, adjusting the connection pool, updating statistics. Redesign only comes into view once the foundations of the schema no longer match how the system is used, for example a highly normalised schema that constantly has to perform forty joins, or a polymorphic model that makes indexing impossible. We always start with an analysis phase so it becomes clear which route will deliver the most gain.
Can you carry out a database migration without downtime?
Yes, in almost all cases. We use a combination of dual-write (the application temporarily writes to both the old and new database), change data capture (Debezium reads the transaction log of the source system and replicates to the target system) and gradual read-switching. A brief cut-over of a few seconds is occasionally needed, but full maintenance windows can almost always be avoided. Our platform migration approach describes the complete method in more detail.
How do you handle GDPR deletion and data retention at database level?
We prefer to build right-to-be-forgotten and retention policies into the database layer rather than the application. That means a deletion pipeline that traces all related records via foreign keys, optional soft deletes with a TTL for compliance windows, and audit log entries that record the deletion itself. For analytical copies, we use hash-based pseudonymisation or full anonymisation during the ETL step. This way, a GDPR request becomes a defined process to execute, not an ad hoc emergency.
Do you work alongside our existing developers, or do you do everything yourselves?
Both. Many clients have a good application team but no dedicated database engineer; in that case we act as a specialist sitting between the team and the data layer. Other clients want the entire process, covering schema, application integration and management, handled by us. We are happy to work alongside your own developers, provide knowledge transfer throughout every sprint, and ensure your team can carry on independently after handover.
What about security: encryption, access control and auditing?
Encryption at rest (transparent data encryption or a cloud-managed equivalent), TLS for all connections, role-based access control following the principle of least privilege, and separate service accounts for each application component. For audit work we log who changed which row, with before and after values, in a separate audit table or via database triggers. For sensitive columns we apply column-level encryption or pseudonymisation. We also support penetration tests and compliance audits where the project falls within a NEN 7510 or ISO 27001 environment.
What does a database project cost?
It varies too much to give a figure without knowing your situation. A performance quick scan of a single production database is a very different project from a full migration from Oracle to PostgreSQL with dual-write. We work on fixed sprint budgets, so you know in advance what a sprint costs and what will be delivered at the end. In the introductory conversation, we give an initial indication of scope and number of sprints; for more complex projects, we first run a short analysis phase before asking for a larger commitment.

Talk to us about your database challenge.

A no-obligation introductory call of half an hour. Tell us where your database is getting stuck, which product you want to build, or which migration is on the table. We'll listen, ask questions and give you direction you can use, even if it turns out we're not the right partner.

Edit content