Console

·

9 min read

Best Databases for Next.js

Enes Akar

Cofounder @Upstash

TLDR
PlanetScale
Supabase
Upstash Redis
Fauna
MongoDB Atlas
DynamoDB
Conclusion

Next.js enables developers to build full stack applications with the Server Side Rendering capability. Vercel and Netlify help them to write the backend API with serverless functions. So the next question is what is the ideal database for Next.js apps. In this post, I will review the databases which are popular among the Next.js community. I will comment on how they fit the serverless model. Two things to check:

  • Serverless pricing: Is the price pay-per-use? When the database is not in use, do you still have to pay?
  • Serverless connections: Is there support for HTTP based connections? So there should not be any connection problems which are common with serverless functions.

TLDR

I have reviewed PlanetScale, Supabase, Upstash, Fauna, DynamoDB and MongoDB Atlas. Check the table below to compare the feature set of each product.

FeaturePlanetScaleSupabaseUpstashFaunaDynamoDBMongoDB Atlas
APIMySQLPostgreSQLRedisFaunaDynamoDBMongoDB
TypeRelationalRelationalKV StoreDocumentDocumentDocument
Free Tier🟢🟢🟢🟢🟢🟢
Serverless Pricing🟡 (min $29)🟡 (min $25)🟢🟡 (min $22.5)🟢🟢
REST API🔴🟢🟢🟢🟢🟢
GraphQL API🔴🔴🔴🟢🔴🔴
Global replication🔴🔴🟢🟢🟢🟡 (only for Dedicated)
Database Branching🟢🔴🔴🔴🔴🔴
Realtime Updates🔴🟢🔴🔴🟢🟡 (via Realm)
Price Reads$1.5 / 10m$0.09 / GB$0.2 / 100K$0.45 / 1m (4KB)$0.25 / 1m (2KB)$0.3 / 1m (4KB)
Price Writes$1.5 / 1m$0.09 / GB$0.2 / 100K$2.25 / 1m (1KB)$1.25 / 1m (1KB)$1.25 / 1m (1KB)
Price Storage$1.25 / GB$0.125 / GB$0.25 / GB$0.23 / GB$0.25 / GB$0.25 / GB

PlanetScale

  • PlanetScale is a MySQL compatible database as a service.
  • It is uses Vitess at the background. This is great as Vitess is being actively used by giants like Youtube.
  • PlanetScale introduced the database branching concept. You can create branches and merge schema changes to your production database just like git. Afaik, this feature is unique for PlanetScale.
  • It has a free tier with 100m reads per month.
  • Paid plans start from $29. The main price components for the paid plan are:
    • Storage/month: $1.25/GB after first 25GB
    • Reads/month: $1.50 per 10m, after first 500m
    • Writes/month: $1.50 per 1m, after first 50m
  • PlanetScale does not have an HTTP/REST based API.

db

My Comments:

  • In the home page, it is said that: Trusted By Github, Square, Slack etc. Do these companies use PlanetScale or Vitess? If these companies use PlanetScale then it is great. Otherwise, I do not feel good about this type of marketing. Trusting Vitess and Trusting PlanetScale are different things
  • PlanetScale requires you to use TCP based connections (MySQL connections). This might be a problem for serverless functions as they are stateless. They say the number of connections is not a problem for Vitess but still there is a max connection limit for the plans.
  • Lack of the HTTP/REST API makes it impossible to use PlanetScale from Cloudflare Workers and Vercel Edge platforms because they do not allow TCP connections.
  • Planetscale paid plans start from $29, so the price does not scale to zero. Even if you are not using a DB, you have to use $29 per db at least. I think this is a conflict with the definition of serverless.

Supabase

  • Supabase is a collection of developer tools including database, authentication service, storage. They call themselves as Open Source Firebase Alternative
  • Supabase provides a PostgreSQL database.
  • Just like Firebase, Supabase enables developers to listen to the changes on the database in real time.
  • Supabase provides a RESTful API using PostgREST. This is useful especially if you plan to use Supabase in serverless functions.
  • Supabase can be used in Cloudflare Workers thanks to its REST API. Check this.
  • Supabase free tier is limited to 500MB storage and 2GB data transfer monthly.
  • Similar to PlanetScale, Supabase has a minimum cost for paid databases which is $25/month. Summary of payg pricing:
    • Storage: $0.125 per GB-month
    • Data transfer: $0.09 per GB

db

My Comments:

  • Supabase provides database, authentication service, object storage and also serverless functions are coming. I am worried that it may be hard for a startup to provide many services with high quality and compete with Firebase backed by Google. I hope they will be successful.
  • Just like PlanetScale, I think their pricing is not true serverless. Their paid plans require a fixed monthly cost so it never scales to zero.

Upstash Redis

  • Upstash provides Redis as a service with per request pricing.
  • It provides both Redis and REST API. So you can use it with both serverless and edge (Cloudflare Workers) functions.
  • Upstash has regional and global options. Global database replicates data to multiple regions.
  • It has a free tier with max 10.000 commands per day. Its pay-as-you-pricing is as follows:
    • Commands: $0.2 per 100K commands
    • Storage: $0.25 per GB

db

My Comments:

  • Both we (Upstash) and RedisLabs think that Redis is powerful enough for many use cases in addition to classic Redis use cases (caching, kv-store). But still I see many developers prefer SQL databases as the primary data store. If you need complex query capabilities, Redis may not be your first choice.

Fauna

  • Fauna provides a Globally Replicated Strongly Consistent database as a cloud service.
  • It provides GraphQL API in addition to Fauna API.
  • Its connections are HTTP based so you can use Fauna in serverless functions without any connection related problems.
  • Its most basic plan (Individual) starts from $22.5/month.
  • Fauna pricing:
    • Reads: $0.45/Million units (4KB)
    • Writes: $2.25/Million units (1KB)
    • Storage: $0.23/GB

db

My Comments:

  • Global strong consistency comes with extra performance costs. Writes have higher latencies than other alternative databases.
  • If you will use GraphQL then it’s great but otherwise FQL was hard for me to learn and use.
  • Fauna pricing has its own units (TRO, TWO, TCO) and many dimensions. You need to read articles to understand the pricing.

MongoDB Atlas

  • Atlas is a MongoDB as a managed service which has serverless, shared and dedicated plans..
  • Data (REST) API has been recently announced. This allows you to access your database using HTTP.
  • MongoDB Atlas has a Serverless plan with some limitations. The pricing of this plan is per operations so it scales to zero as expected from a serverless product.
  • Multi region replication is only available with Dedicated plan.
  • Serverless Pricing:
    • Reads: $0.30 per million unit (4KB)
    • Writes: $1.25 per million unit (1KB)
    • Storage: $0.25/GB-month

db

My Comments:

  • Serverless Plan and Data API tells us that MongoDB Atlas does not ignore the Serverless space. But both solutions are in the preview phase and needs some improvements to be a data solution ideal for serverless applications.

DynamoDB

  • Fully managed NoSQL database with key-value and document data model.
  • The connections are HTTP based so it fits to serverless applications.
  • Pricing is per operation in addition to data transfer cost. So it scales to zero.
  • By default, the reads are eventually consistent. You can also request strongly consistent reads but it has some limitations.
  • You can enable multi region replication with extra cost.
  • The pricing:
    • Reads: $0.25 per million read request units (2KB)
    • Writes: $1.25 per million read request units (1KB)
    • Data transfer (out): $0.09 per GB
    • Storage: $0.25 per GB-month

db

My Comments:

  • For me, DynamoDB API is not as intuitive as Redis or MongoDB.
  • There is a vendor lock-in problem. DynamoDB is only at AWS and you can not move your application to another provider without changing the code.

Conclusion

So what is the best database for Next.js? As expected, there is no single answer. But let's give some conditional answers:

  • If you need a relational DB 👉🏻 Supabase or PlanetScale
  • If you need database branching 👉🏻 PlanetScale
  • If you need real time updates 👉🏻 Supabase or MongoDB Atlas
  • If you need global low latency 👉🏻 Upstash or DynamoDB
  • If you need global strong consistency 👉🏻 Fauna
  • If you need low latency key value store 👉🏻 Upstash
  • If you love PostgreSQL 👉🏻 Supabase
  • If you love MySQL 👉🏻 PlanetScale
  • If you love Redis 👉🏻 Upstash
  • If you love Mongo 👉🏻 MongoDB Atlas
  • If you need GraphQL 👉🏻 Fauna

I tried to be fair and correct. If you think there is something I need to fix, please drop your comments to my twitter