Every new SaaS starts with the same question: which database? The answer used to be "just use Postgres." In 2026, SQLite and DynamoDB have closed enough gaps that the decision is worth reconsidering. Here's the honest breakdown from projects I've shipped with all three.
The default: Postgres
Postgres is the honest default for most SaaS applications. Not because it's the best at everything — because it's good enough at everything and excellent at the things that matter most in early-stage SaaS.
Why it wins for most projects:
- Relational data with flexible querying. SaaS data is relational. Users belong to organizations, organizations have subscriptions, subscriptions have invoices. Joins, aggregations, and complex queries work out of the box.
- JSON support when you need schema flexibility. Postgres's
jsonbtype gives you document-store capabilities without leaving the relational model. User preferences, feature flags, form schemas — store them as JSON, query them with SQL. - Ecosystem depth. Every ORM works with Postgres. Every hosting platform supports it. Every monitoring tool can connect to it. You'll never hit a "not supported" wall.
- Scaling is a later problem. A single Postgres instance handles more traffic than most early-stage SaaS will see. Connection pooling (PgBouncer, Supabase's pooler) pushes that ceiling higher. Read replicas push it further. You won't need to think about this for a long time.
Where it costs you:
- Managed Postgres isn't free. Supabase, Railway, and Neon all have free tiers, but real production usage starts at $10–25/month.
- Connection management with serverless (Vercel, Cloudflare Workers) requires a pooler. Without one, you'll exhaust connections on traffic spikes.
- Self-hosting means you own backups, upgrades, and failover. Not hard, but not free either.
Pick Postgres when: you're building a multi-user SaaS with relational data, need complex queries, or don't have a specific reason to pick something else.
The scale-first option: DynamoDB
DynamoDB is AWS's key-value/document database. It scales horizontally with zero operational overhead. You never run ALTER TABLE, never manage connections, never think about disk space.
Why it wins for specific projects:
- Predictable performance at any scale. Single-digit millisecond reads regardless of table size. For a ticketing platform processing thousands of concurrent seat reservations, this matters.
- Zero operational overhead. No instances to manage, no connections to pool, no vacuuming. You pay per request or provision capacity, and AWS handles the rest.
- Event-driven patterns. DynamoDB Streams trigger Lambda functions on every write. For event sourcing, audit logs, or real-time sync — this is built in, not bolted on.
Where it costs you:
- Access patterns must be designed upfront. You can't just "run a query." Every access pattern needs a pre-designed index. Change your query patterns 6 months in? You might need to rebuild the table.
- No joins. If your data is relational, you'll either denormalize (data duplication) or make multiple queries (latency). For a SaaS with users, teams, billing, and permissions, this gets painful fast.
- Vendor lock-in. DynamoDB is AWS-only. Your local development story is DynamoDB Local (a Java Docker container that mostly matches production). Migrating away means rewriting your data layer.
- Cost surprises. On-demand pricing is simple until a bot hits your API 10M times. Provisioned capacity is cheaper but requires forecasting.
Pick DynamoDB when: you have a single-table design with predictable access patterns, you're on AWS already, and horizontal scaling is a day-one requirement (high-throughput IoT, gaming leaderboards, real-time event ingestion).
The underdog: SQLite
SQLite is an embedded database — it runs in the same process as your application, reading and writing to a single file on disk. It sounds like a toy. In 2026, it's a legitimate production choice for a surprising range of SaaS applications.
Why it's suddenly relevant:
- Zero latency. No network round-trip. Queries execute in microseconds, not milliseconds. For read-heavy applications, nothing is faster.
- Zero operational cost. No database server, no connection strings, no pooling, no backups to schedule. The database is a file. Back it up by copying the file.
- Litestream/LiteFS for replication. Litestream streams WAL changes to S3 in real time. LiteFS (from Fly.io) provides read replicas across regions. These tools made SQLite production-viable for distributed deployments.
- Turso and libSQL. Turso offers managed SQLite with multi-region replication and an HTTP API. libSQL adds features like native vector search. The ecosystem has real momentum.
Where it costs you:
- Single-writer limitation. SQLite handles one write at a time. For write-heavy workloads (chat messages, real-time collaboration), you'll hit this ceiling. WAL mode helps, but doesn't eliminate it.
- No built-in replication. Without Litestream or LiteFS, it's a single file on a single server. Server dies, data dies (unless you backed it up).
- Limited concurrent connections. SQLite doesn't have a client-server model. If your app has 50 concurrent workers hitting the database, contention becomes an issue.
Pick SQLite when: you're building a read-heavy application, a personal SaaS with low write concurrency, an edge-deployed app (one database per region), or you want the simplest possible operational story.
The decision table
| Factor | Postgres | DynamoDB | SQLite |
|---|---|---|---|
| Data model | Relational + JSON | Key-value / document | Relational |
| Query flexibility | Full SQL | Pre-designed patterns | Full SQL |
| Scaling ceiling | High (with pooling + replicas) | Effectively unlimited | Moderate (single-writer) |
| Ops overhead | Medium | Zero | Zero |
| Cost at low traffic | $10–25/mo | Near-zero (on-demand) | $0 |
| Cost at high traffic | Predictable | Variable (watch on-demand) | Near-zero |
| Local development | Native | DynamoDB Local (imperfect) | Native |
| Migration flexibility | High (standard SQL) | Low (AWS-only) | High (standard SQL) |
My default
For the SaaS projects I ship for clients, the default is Postgres on Supabase or Neon. It handles relational data naturally, scales well past the first few thousand users, has excellent tooling, and doesn't lock you into a vendor.
I reach for DynamoDB only when the project is already on AWS and the access patterns are genuinely simple and high-throughput.
I reach for SQLite when the deployment model calls for it — edge-first applications, single-tenant setups, or when the operational simplicity outweighs the write-concurrency limitation.
The "honest default" in the title is Postgres. Not because it's always best — because it's the choice you'll regret least when your requirements change in month 6.
Choosing a database for your SaaS and want a second opinion? Let's talk — I help founders pick the right stack so they ship the right thing, not just the trendy thing.