Aller au contenu
TKTech-KarlProduct Engineer
Langue affichée : Anglais.
4 min de lecture

Why your MVP doesn't need a database

A database is often the first reflex — and rarely the first necessity. When it actually helps, and when it only adds complexity.

ArchitectureMVPProduct Engineering
Minimal composition of black shapes and green lines on a light grid

Demo article. This text is generated and exists to test the content workflow. Review, adapt or remove it before launch.

The first idea is barely sketched, and it is already in the room: the database. PostgreSQL, Supabase, Mongo, “something with Prisma”. But the more important question is rarely “Which database?” It is: which data is actually dynamic?

For many MVPs, the honest answer is: almost none. And that is an opportunity.

The wrong question

“Which database fits our stack?” sounds like a technical decision. Most of the time it is a habit. We have learned that applications have a database. So the new application gets one too — before anyone knows whether it needs one.

The more useful question is: which piece of information must change without someone deploying code?

For a portfolio, a blog, a marketing site or documentation, the answer is often: the content. And content is very good at living in Git. A commit is a record, a pull request is a review, a merge is a publication. A database would be a second source of truth that has to be kept in sync with the first.

What an MVP actually needs

An MVP is supposed to test a hypothesis. Not to build infrastructure for the next five years. For many first versions, this is enough:

  • statically rendered pages from files,
  • a form that sends an email,
  • a search index generated at build time,
  • a few interactive islands for filters, menus or validation.

This is not a compromise. It is often the faster and more robust option. Static HTML is hard to break, needs no database migration, and can be served worldwide from a CDN.

When a database really makes sense

There are clear signals that a database is the right answer:

  • Multiple users write at the same time. Bookings, orders, comments, collaborative documents.
  • Transactions are a business requirement. Inventory must not go negative; a payment must not be booked twice.
  • Data must be queried in real time. Live dashboards, notifications, presence.
  • Authentication and roles enter the picture. Once there are accounts, you need a reliable source for identities and permissions.
  • Historical events need to be analysed. Not just the current state, but every change.
  • Background jobs process data and need to hold state across multiple steps.

These are real requirements. But they rarely all arrive on day one.

What a database costs

A database is not a neutral building block. It brings operations with it:

  • schema and migrations,
  • backups and recovery,
  • connection management and pooling,
  • authentication, roles and row-level security,
  • monitoring, alerts and failure modes,
  • privacy, retention and deletion policies,
  • a second environment that must be maintained.

This is manageable. But it is work you should take on deliberately — not accidentally, because a template included it.

An example from this portfolio

This site has no database. Projects and articles live as MDX in Git. Search is generated at build time with Pagefind. The contact form validates on the server and sends an email; it does not store the inquiry.

This is not a religious belief. It is the smallest architecture that satisfies the current requirements. If a dashboard, stored inquiries or a newsletter arrive later, a database can be added. To keep that from becoming a rewrite, the content layer is wrapped in an adapter:

interface ContentRepository {
  getProjects(lang: Lang): Promise<Project[]>;
  getProject(lang: Lang, slug: string): Promise<Project | null>;
  getArticles(lang: Lang): Promise<Article[]>;
  getArticle(lang: Lang, slug: string): Promise<Article | null>;
}

Today the implementation reads files. Tomorrow it could read Supabase or a CMS. The pages only know the interface.

A pragmatic order

  1. Write down which data must change. Not which tables might exist.
  2. Start with the simplest source that satisfies the requirement. Often that is a file, a form and an email inbox.
  3. Wrap access in an adapter. An adapter is cheaper than a migration.
  4. Add the database when a feature forces it. Not when a template suggests it.

A database is a tool. Not a badge. And an MVP that ships without one is not less professional — it just has one fewer decision to regret.

Un projet en tête ?

Explique-moi brièvement de quoi il s’agit. Je réponds généralement sous 24 à 48 heures.

Demander un projet