DEV Community

Aaronjames Kashim
Aaronjames Kashim

Posted on

Database Design Is Underrated — And It’s Why Many Developers Get Stuck

Most developers don’t struggle because they can’t code.

They struggle because they don’t know how to think in systems.

And nothing exposes that gap faster than database design.

You’ve probably experienced it:
You understand the idea. You can picture the app.
But the moment you try to design the database… everything gets messy.

Tables don’t make sense. Relationships feel confusing.
You keep restarting.

So here’s the truth:

👉 You don’t need a more complex method.
👉 You need a clear thinking strategy.

This is the exact step-by-step approach that works consistently.

The Real Problem

Most people jump straight into tables.

That’s the mistake.

A database is not where you start.
It’s where you arrive after understanding the system.

The Strategy That Actually Works

  1. Understand the Real-World Flow

Before writing a single table, ask:

“What actually happens in real life?”

Forget code. Think like a storyteller.

Example (Uber-like system):

A rider opens the app
Requests a ride
System finds a driver
Driver accepts
Trip starts
Trip ends
Payment happens

That’s your flow.

👉 If you can’t explain the system in simple steps, you can’t design the database.

  1. Extract Entities

Now pull out the “things” involved.

From the flow above:

User (Rider)
Driver
Ride
Payment
Location

These are your entities → they become tables.

👉 Rule: If it exists independently in the system, it’s probably an entity.

  1. Define Relationships

Now ask:

“How are these things connected?”

Examples:

A user can request many rides
A driver can complete many rides
A ride belongs to one user and one driver
A ride has one payment

This gives you:

One-to-many
One-to-one
Many-to-many

👉 This step is where most confusion happens — but it becomes easy when tied to real-world logic.

  1. Add States

Real systems are not static.

Things change over time.

A ride isn’t just a ride. It has states:

Requested
Accepted
In Progress
Completed
Cancelled

So instead of just storing data, you store status.

👉 This is what makes your system realistic and scalable.

  1. Track Events (Messages, Reads, Actions)

Modern systems don’t just store data — they track behavior.

Examples:

Driver accepted ride at 10:05
User cancelled ride at 10:07
Notification sent
Message read

This means you may need:

Logs
Activity tables
Message systems

👉 This is how companies build features like notifications, analytics, and history.

  1. Handle Many-to-Many Early

This is a common trap.

Example:

Drivers can serve many locations
Locations can have many drivers

You can’t store this in one table.

You need a junction table:

driver_locations

👉 If you ignore this early, your design breaks later.

  1. Think About Failures

This is what separates beginners from real engineers.

Ask:

What if payment fails?
What if driver cancels?
What if user disconnects?

Your database must handle:

retries
failed states
logs

👉 Systems don’t break because of success cases — they break because of failure cases.

Putting It All Together (Uber Example)

Let’s combine everything:

Entities:

users
drivers
rides
payments

Relationships:

user → rides (1-to-many)
driver → rides (1-to-many)
ride → payment (1-to-1)

States:

ride_status (requested, accepted, completed…)

Events:

ride_events (accepted, cancelled, started…)

Failure Handling:

payment_status (pending, failed, successful)

Now your system is no longer just data…

It’s a living system.

Who Needs This Skill?
Backend developers → to build scalable systems
Startup founders → to avoid rebuilding products
Data engineers → to structure clean pipelines
Product engineers → to design features that actually work

👉 If you build anything real, you need this.

How Companies Actually Use This

Companies don’t “guess” database design.

They:

Map real-world flows
Break systems into entities
Carefully define relationships
Track every important event
Design for failure from day one

That’s why their systems scale.

Not because they use fancy tools —
but because their thinking is structured.

Tools You Can Use (Manual + Automatic)
Manual Tools (Best for Thinking)
Draw.io
Whimsical
Pen and paper (very underrated)

👉 These force you to understand before building

Automatic Tools (Best for Speed)
dbdiagram.io
Prisma ORM (auto schema generation)
Django ORM (models → database)

👉 These help you implement faster

Final Insight

Database design is not about tables.

It’s about:

understanding reality
structuring complexity
thinking in systems

If you follow this process:

Flow
Entities
Relationships
States
Events
Many-to-many
Failures

You’ll never feel stuck again.

If you want to improve as a backend engineer, don’t just practice coding.

Practice thinking like this.

That’s the real skill.
An ER Diagram for a database desgin i made

Top comments (1)

Some comments may only be visible to logged-in visitors. Sign in to view all comments.