Short answer: use RDS when your data is connected and you need joins, transactions across tables and flexible queries. Use DynamoDB when you need extremely fast, extremely high-volume lookups by a known key.
The mistake people make is treating this as a permanent allegiance — "we're a Postgres shop" or "we went serverless so we use DynamoDB". In real architectures the question is asked per workload, not per company.
Let me show you a system that uses both, and exactly why each one is where it is.
The system
A live-event ticketing platform. A major artist announces a tour, and half a million people arrive at once.
That system stores two very different kinds of data:
- Event information — artist, venue, date, seating map, pricing tiers. Structured, interconnected, queried in flexible ways.
- Seat status — for one specific seat at one specific event, is it available, reserved or sold? Asked thousands of times per second.
Same application. Completely different data problems. That is why it runs both databases.
Free assessment
Find the AWS domains holding you back.
Get a focused study plan based on your real weak spots — not another generic course checklist.
RDS: for data that connects to other data
RDS — Relational Database Service — is AWS's managed relational database. It runs engines like PostgreSQL, MySQL, MariaDB, Oracle and SQL Server, and handles the operational work: patching, backups, replication, failover.
The easiest way to picture a relational database is a set of connected spreadsheets. An events table. A venues table. A pricing tiers table. The database understands the relationships between them, so it can answer questions that span all three in a single query.
In our platform, RDS holds the event catalogue. When a customer taps a concert, the application asks RDS for artist, venue, date, seat map and pricing — data that lives across multiple related tables and needs to come back joined together.
Reach for RDS when:
- Your data is genuinely relational — entities reference each other
- You need joins across tables
- You need transactions spanning multiple tables
- Query patterns will change, and you cannot predict every access pattern up front
- Your team already knows SQL
That fifth point is underrated. If you know SQL, RDS is immediately productive.
Where RDS sits
RDS lives in a private subnet inside your VPC, behind the application servers. It cannot be reached from the internet. The only things allowed to talk to it are the EC2 instances running your code.
That is deliberate. Your database holds your most sensitive information, so as few things as possible should be able to reach it.
Worth knowing: reaching RDS involves two checkpoints. The Security Group controls whether the instance can connect over the network. Then traditional database credentials control whether it can actually log in and run queries. IAM governs AWS-level permissions around the database, but the login itself is standard database authentication.
DynamoDB: for speed at enormous scale
DynamoDB is a NoSQL key-value and document database, and it works on a completely different model.
Instead of connected tables, think of a very fast index. Each item is stored on its own. You give it a key, it gives you the item back — consistently fast, no matter how many items exist.
In our platform, every seat is its own record. The key is the event ID plus the seat ID. The value is the status: available, reserved or sold. Ask for a seat, get the answer instantly.
Reach for DynamoDB when:
- You know your access patterns in advance
- You look things up by a known key
- Request volume is very high — thousands per second or more
- You need predictable low latency at any scale
- You do not want to manage or size database servers
Why not just use RDS for seats?
This is the important question, and the honest answer is: you could.
RDS could handle seat availability if you designed it carefully with transactions and row locking. It would work.
But for this specific access pattern — millions of simple, high-speed checks of "what is the status of this exact seat?" — DynamoDB is the better fit. There are no joins needed. No complex query. Just fast key-based lookups and safe updates at huge scale, without managing database servers to absorb the launch-day spike.
That is the actual reasoning. Not "NoSQL is modern". Not "relational is legacy". The access pattern decided it.
Where DynamoDB sits
Unlike RDS, DynamoDB is not inside your VPC. It is a regional managed service, run by AWS outside your network.
Your EC2 instances reach out to it over AWS APIs. To keep that traffic off the public internet you use a VPC Endpoint, which lets your servers talk to DynamoDB without traffic leaving AWS's network.
This trips people up on the exam. Private subnet does not mean cut off — it means the internet cannot reach in, while your servers can still reach out to managed services.
The direct comparison
| RDS | DynamoDB | |
|---|---|---|
| Type | Relational (SQL) | NoSQL key-value / document |
| Data shape | Connected tables with relationships | Independent items retrieved by key |
| Query style | Flexible SQL, joins, ad hoc | By key, along designed access patterns |
| Schema | Defined up front, enforced | Flexible per item |
| Scaling | Instance sizing, read replicas | Scales without server management |
| Location | Private subnet inside your VPC | Regional managed service outside VPC |
| Best at | Complex queries over related data | Massive-volume simple lookups |
| In our system | Events, venues, pricing tiers | Individual seat status |
The part most guides skip: conditional writes
Here is where DynamoDB does something genuinely important, and it is the most valuable thing in this article.
Three people click buy on Seat 14 at almost the same instant. Without controls, all three requests race in. Each checks the seat. Each sees "available". Each reserves it. Now three people think they bought the same seat.
That is double-selling, and on a ticketing platform it is a disaster.
The naive fix is to check availability, then mark it reserved. But look at what sits between those two operations: a gap. In that gap, another request can check the same seat and also see it available. That gap is precisely where double-selling happens.
DynamoDB removes the gap with a conditional write — the check and the update become one single atomic action:
"Mark this seat as reserved, but only if it is currently still available."
If the seat is free, it succeeds. If someone already took it, the update fails immediately and that customer is told the seat is gone.
Only the first request to successfully flip the seat from available to reserved wins. Every later attempt fails, because the condition is no longer true.
What about the queue?
Our platform also puts purchase requests through an SQS FIFO queue, grouped by event and seat, so competing attempts on the same seat are processed in order while different seats process in parallel.
But be precise about what does what, because this is a common interview trap:
- The queue controls flow and decouples receiving purchases from processing them
- The conditional write protects the seat
The queue alone would not prevent double-selling. The conditional write is the actual guarantee.
How to decide for your own system
Three questions:
1. Do you know your access patterns?
DynamoDB requires designing around how data will be read before you model it. If access patterns are still shifting, RDS is more forgiving — you can write a new query without redesigning your keys.
2. Do you need joins or cross-table transactions?
If yes, RDS. You can model relationships in DynamoDB, but you are doing work the relational engine would do for you.
3. What does the traffic look like?
Extremely high volume of simple lookups points to DynamoDB. Moderate volume of complex queries points to RDS.
How this shows up on the exam
Signals pointing to DynamoDB:
- "Single-digit millisecond latency"
- "Millions of requests per second"
- "Key-value" / "session store" / "user preferences" / "shopping cart"
- "No servers to manage" / "serverless"
- "Unpredictable or rapidly scaling traffic"
Signals pointing to RDS:
- "Complex queries" / "reporting" / "joins across tables"
- "Existing SQL application" / "migrate an on-premises database"
- "ACID transactions across multiple tables"
- "Relational schema"
Signals pointing to Aurora specifically:
- "MySQL or PostgreSQL compatible" plus "higher performance" or "high availability"
Watch for questions where a system clearly has both kinds of data. The trap answer forces everything into one database.
The takeaway
RDS and DynamoDB are not rivals. They answer different questions.
- Connected data, flexible queries, joins → RDS
- Enormous volume, lookups by known key, predictable latency → DynamoDB
Our ticketing platform uses RDS for the event catalogue inside a private subnet, and DynamoDB for seat status as a managed service outside the VPC. Each does the job it is built for.
Being able to explain why each dataset went where — and why the conditional write, not the queue, is what stops double-selling — is what separates someone who understands architecture from someone who memorised a comparison table.