<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ayra Jett</title>
    <description>The latest articles on DEV Community by Ayra Jett (@op3ratordec).</description>
    <link>https://dev.to/op3ratordec</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2208306%2F88aa3c96-4e44-49e3-b237-da93985f3d89.jpg</url>
      <title>DEV Community: Ayra Jett</title>
      <link>https://dev.to/op3ratordec</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/op3ratordec"/>
    <language>en</language>
    <item>
      <title>Supabase ⚡️ vs. Firebase 🔥: a Complete Comparison ⚔️ in 2025</title>
      <dc:creator>Ayra Jett</dc:creator>
      <pubDate>Thu, 07 Aug 2025 08:07:04 +0000</pubDate>
      <link>https://dev.to/bytebase/supabase-vs-firebase-a-complete-comparison-in-2025-1k80</link>
      <guid>https://dev.to/bytebase/supabase-vs-firebase-a-complete-comparison-in-2025-1k80</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Supabase and Firebase are two leading &lt;strong&gt;Backend-as-a-Service (BaaS) platforms&lt;/strong&gt; that enable developers to build applications without handling backend infrastructure. While they serve similar purposes, they take fundamentally different approaches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Firebase&lt;/strong&gt; began in 2011 as a real-time NoSQL database and was acquired by Google in 2014. Since then, it has evolved into a comprehensive, fully-managed backend platform deeply integrated with the Google ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Supabase&lt;/strong&gt;, launched in 2020, emerged as an &lt;strong&gt;open-source alternative&lt;/strong&gt; to Firebase. It’s built on &lt;strong&gt;PostgreSQL&lt;/strong&gt;, offering a relational model with SQL support, and can be self-hosted for greater control and transparency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Comparison Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Supabase&lt;/th&gt;
&lt;th&gt;Firebase&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Philosophy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Open-source, standards-based&lt;/td&gt;
&lt;td&gt;Proprietary, fully-managed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Database Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PostgreSQL (Relational)&lt;/td&gt;
&lt;td&gt;Firestore (NoSQL) &amp;amp; Realtime Database (NoSQL)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Relational with tables, schemas, and SQL&lt;/td&gt;
&lt;td&gt;Document-based with collections and documents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Query Capabilities&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full SQL support with joins, complex queries&lt;/td&gt;
&lt;td&gt;Limited query options, no native joins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Authentication&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Email/password, social, phone, MFA&lt;/td&gt;
&lt;td&gt;Email/password, social, phone, MFA, anonymous&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Real-time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PostgreSQL logical replication&lt;/td&gt;
&lt;td&gt;Purpose-built real-time infrastructure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Offline Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Basic, still evolving&lt;/td&gt;
&lt;td&gt;Comprehensive, mature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Functions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Edge Functions (Deno)&lt;/td&gt;
&lt;td&gt;Cloud Functions (Node.js, Python, Go, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;S3-compatible with RLS&lt;/td&gt;
&lt;td&gt;Google Cloud Storage with Security Rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI/ML&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vector database for embeddings, OpenAI/Hugging Face integrations, RAG support&lt;/td&gt;
&lt;td&gt;Firebase Studio, Genkit, Gemini API integration, Vertex AI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Predictable tiered pricing&lt;/td&gt;
&lt;td&gt;Usage-based, pay-as-you-go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-hosting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Available&lt;/td&gt;
&lt;td&gt;Not available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Data-intensive apps, SQL expertise, complex relationships&lt;/td&gt;
&lt;td&gt;Mobile apps, real-time features, rapid prototyping&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Core Philosophy and Approach
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Supabase&lt;/strong&gt; embraces open-source technologies and standards, with PostgreSQL at its core. It provides direct SQL access and follows relational database principles, emphasizing data portability and avoiding vendor lock-in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Firebase&lt;/strong&gt; takes a proprietary, fully-managed approach focused on developer experience and seamless integration. It abstracts away infrastructure complexities with NoSQL databases optimized for real-time synchronization and mobile use cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Database Capabilities
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Supabase&lt;/strong&gt; leverages PostgreSQL's powerful relational capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strong data consistency with full ACID compliance&lt;/li&gt;
&lt;li&gt;Support for complex queries, including joins and multi-step transactions&lt;/li&gt;
&lt;li&gt;Rich data types and advanced indexing for performance tuning&lt;/li&gt;
&lt;li&gt;Native support for stored procedures and triggers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Firebase&lt;/strong&gt; offers two NoSQL database options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Firestore:&lt;/strong&gt; A document-based database using collections and documents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Realtime Database:&lt;/strong&gt; A lightweight JSON tree structure optimized for real-time data synchronization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Supabase excels in complex data relationships and advanced querying, while Firebase prioritizes real-time synchronization and automatic scaling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Authentication and Security
&lt;/h2&gt;

&lt;p&gt;Both platforms offer comprehensive authentication with email/password, social logins, and multi-factor authentication.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Supabase&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built on &lt;strong&gt;PostgreSQL Row Level Security (RLS)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Access control is enforced through &lt;strong&gt;SQL-based policies&lt;/strong&gt;, allowing fine-grained, table-level permissions.&lt;/li&gt;
&lt;li&gt;Offers flexibility and transparency, ideal for SQL-savvy teams.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Firebase&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses &lt;strong&gt;Firebase Security Rules&lt;/strong&gt;, written in a &lt;strong&gt;JavaScript-like syntax&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Rules are service-specific (e.g., Firestore, Storage), enabling dynamic access control based on user roles and request context.&lt;/li&gt;
&lt;li&gt;Tight integration with Google services makes setup straightforward, especially for front-end developers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Supabase provides &lt;strong&gt;database-native&lt;/strong&gt; security controls ideal for complex permission schemes, while Firebase offers &lt;strong&gt;service-specific&lt;/strong&gt; rules that are easier to implement for common scenarios. Supabase's SQL-based RLS gives more granular database control, whereas Firebase rules are more approachable for developers without SQL experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-time and Offline Capabilities
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Firebase&lt;/strong&gt; offers battle-tested real-time features with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic data synchronization across clients&lt;/li&gt;
&lt;li&gt;Built-in offline support with local persistence&lt;/li&gt;
&lt;li&gt;Automatic conflict resolution and smooth reconnection handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Supabase Realtime&lt;/strong&gt; is powered by PostgreSQL logical replication and Phoenix Channels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enables database change subscriptions, including INSERT, UPDATE, DELETE events&lt;/li&gt;
&lt;li&gt;Supports presence tracking for multiplayer or collaborative use cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Firebase leads in offline resilience and real-time maturity, while Supabase offers powerful server-driven change tracking with a relational foundation, best suited for applications needing strong data consistency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Serverless Functions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Supabase Edge Functions&lt;/strong&gt; are built on the &lt;strong&gt;Deno runtime&lt;/strong&gt;, supporting &lt;strong&gt;TypeScript and JavaScript&lt;/strong&gt;, and are designed to run at the edge for low-latency performance. These functions have direct access to the Supabase PostgreSQL database, making them ideal for lightweight APIs and custom logic tightly coupled with the database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Firebase Cloud Functions&lt;/strong&gt; support multiple runtimes, including &lt;strong&gt;Node.js, Python, and Go&lt;/strong&gt;, and can be triggered by a wide range of events — such as HTTP requests, Firestore updates, authentication events, and Pub/Sub messages. They are deeply integrated with Google Cloud Platform for scalability and flexibility.&lt;/p&gt;

&lt;p&gt;Supabase Edge Functions are &lt;strong&gt;lightweight, TypeScript-native, and database-aware&lt;/strong&gt;, while Firebase Cloud Functions provide &lt;strong&gt;broad language support, rich trigger options, and tight integration&lt;/strong&gt; with the wider Google Cloud ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI and Machine Learning
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Firebase&lt;/strong&gt; offers a comprehensive, cloud-based AI development ecosystem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Firebase Studio&lt;/strong&gt;: Cloud development environment for AI apps with Gemini integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Genkit&lt;/strong&gt;: Open-source framework for building AI features with generative models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vertex AI Integration&lt;/strong&gt;: Direct access to Google's Gemini models for text, image, video, and audio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-assisted Development&lt;/strong&gt;: Gemini assistance for coding and app development.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Supabase&lt;/strong&gt; takes a database-centric approach to AI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vector Database (pgvector)&lt;/strong&gt;: PostgreSQL extension for vector similarity search.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Toolkit&lt;/strong&gt;: Tools for storing, indexing, and querying vector embeddings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic Search&lt;/strong&gt;: Built-in capabilities for meaning-based search.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Integrations&lt;/strong&gt;: Support for OpenAI, Hugging Face, LangChain, and other providers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Firebase&lt;/strong&gt; excels with its fully integrated AI development environment and seamless access to Google's advanced models. &lt;strong&gt;Supabase&lt;/strong&gt; shines by offering flexible, database-native AI capabilities built on PostgreSQL, ideal for developers who want tight control over their AI data infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing Models
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;
&lt;strong&gt;Supabase&lt;/strong&gt; (Predictable Tiered Pricing)&lt;/th&gt;
&lt;th&gt;
&lt;strong&gt;Firebase&lt;/strong&gt; (Usage-Based, à la Carte Pricing)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Free Tier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Generous limits&lt;/td&gt;
&lt;td&gt;Daily/monthly quotas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Paid Plans&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pro plan ($25/month), plus Team and Enterprise options&lt;/td&gt;
&lt;td&gt;Blaze plan (pay-per-operation), integrated with Google Cloud billing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost Structure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fixed, predictable pricing&lt;/td&gt;
&lt;td&gt;Variable, pay-as-you-go per usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Better for growing teams needing cost predictability&lt;/td&gt;
&lt;td&gt;May be cheaper for small apps, but expensive as usage scales&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Analogy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fixed-price buffet: predictable and straightforward&lt;/td&gt;
&lt;td&gt;À la carte menu: flexible but potentially unpredictable costs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance and Reliability
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Firebase&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built on &lt;strong&gt;Google's global infrastructure&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic scaling&lt;/strong&gt; with minimal configuration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-region replication&lt;/strong&gt; ensures high availability and low latency&lt;/li&gt;
&lt;li&gt;Optimized for &lt;strong&gt;real-time data synchronization&lt;/strong&gt; and global distribution&lt;/li&gt;
&lt;li&gt;Ideal for apps needing instant updates and seamless scalability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Supabase&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hosted on &lt;strong&gt;AWS&lt;/strong&gt; with support for multiple regions&lt;/li&gt;
&lt;li&gt;Offers &lt;strong&gt;read replicas&lt;/strong&gt; for scaling read-heavy workloads&lt;/li&gt;
&lt;li&gt;Requires &lt;strong&gt;manual performance tuning&lt;/strong&gt; for high-traffic or complex queries&lt;/li&gt;
&lt;li&gt;Capable of strong performance, especially for &lt;strong&gt;relational workloads&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More control and flexibility&lt;/strong&gt;, but with added configuration overhead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Firebase offers "set-and-forget" performance at global scale, while Supabase provides more control for database tuning at the cost of manual optimization. Firebase handles traffic spikes automatically, whereas Supabase requires planning for high-load scenarios but can achieve better PostgreSQL-specific performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Choose Supabase for SQL-powered apps needing PostgreSQL flexibility, open-source control, or AI vector support. Opt for Firebase if you prioritize real-time mobile apps, rapid prototyping, and Google's ecosystem. Supabase offers deeper database control; Firebase delivers effortless scaling and real-time sync.&lt;/p&gt;

</description>
      <category>supabase</category>
      <category>firebase</category>
      <category>database</category>
      <category>sql</category>
    </item>
    <item>
      <title>Supabase vs AWS: Feature 🔖 and Pricing 💰 Comparison (2025)</title>
      <dc:creator>Ayra Jett</dc:creator>
      <pubDate>Tue, 29 Jul 2025 06:20:00 +0000</pubDate>
      <link>https://dev.to/bytebase/supabase-vs-aws-feature-and-pricing-comparison-2025-16id</link>
      <guid>https://dev.to/bytebase/supabase-vs-aws-feature-and-pricing-comparison-2025-16id</guid>
      <description>&lt;p&gt;When comparing &lt;strong&gt;Supabase&lt;/strong&gt; and &lt;strong&gt;AWS&lt;/strong&gt;, the key question isn't just about raw features, it's about how much functionality you get &lt;strong&gt;per dollar&lt;/strong&gt; and how easily you can scale from a free plan to enterprise-grade infrastructure.&lt;/p&gt;

&lt;p&gt;In this guide, we break down the pricing and functionality for each of &lt;strong&gt;Supabase’s core features&lt;/strong&gt; and compare them to their &lt;strong&gt;closest AWS counterparts&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supabase Database → AWS RDS PostgreSQL&lt;/li&gt;
&lt;li&gt;Supabase Auth → AWS Cognito&lt;/li&gt;
&lt;li&gt;Supabase Storage → AWS S3&lt;/li&gt;
&lt;li&gt;Supabase Edge Functions → AWS Lambda&lt;/li&gt;
&lt;li&gt;Supabase Realtime (Messages) → AWS SQS/SNS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’ll go &lt;strong&gt;feature by feature&lt;/strong&gt;, then compare &lt;strong&gt;total costs at different usage tiers&lt;/strong&gt;, and conclude with final recommendations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Feature by Feature
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🗄️ Database: Supabase DB vs AWS RDS
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Supabase:&lt;/strong&gt; Built-in PostgreSQL with real-time, REST API, and simple pricing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS RDS/Aurora:&lt;/strong&gt; Fully managed PostgreSQL with high configurability, performance tuning, and multi-AZ support.&lt;/p&gt;

&lt;p&gt;🧬 Supabase is easier and more predictable. RDS gives more control and is better for compliance-heavy or complex workloads.&lt;/p&gt;

&lt;p&gt;See our full comparison here: &lt;a href="https://dev.to/blog/supabase-vs-aws-database-pricing/"&gt;Supabase vs AWS Database Pricing (2025)&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supabase bundles compute, storage, backup, and bandwidth into flat tiers.&lt;/li&gt;
&lt;li&gt;AWS RDS offers cheaper options if you commit to Reserved Instances, but requires piecing together compute, storage, backup, and bandwidth costs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;➡️ If you want more predictable cost and fast setup, choose Supabase. If you need performance tuning or compliance, go with RDS.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔐 Auth: Supabase Auth vs AWS Cognito
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Supabase:&lt;/strong&gt; Easy-to-use auth system with social login, magic links, phone support, and DB integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Cognito:&lt;/strong&gt; Feature-rich identity management with SSO, federation, and enterprise IAM support.&lt;/p&gt;

&lt;p&gt;🧬 &lt;strong&gt;Supabase Auth is simpler and developer-friendly&lt;/strong&gt;, great for fast setup and apps with straightforward auth needs. &lt;strong&gt;Cognito is better for enterprises&lt;/strong&gt; that require SSO, security compliance, and deep AWS integration.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Supabase Auth&lt;/th&gt;
&lt;th&gt;AWS Cognito&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free Tier&lt;/td&gt;
&lt;td&gt;50,000 MAUs&lt;/td&gt;
&lt;td&gt;50,000 MAUs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paid Pricing&lt;/td&gt;
&lt;td&gt;\$0.0015/MAU&lt;/td&gt;
&lt;td&gt;\$0.0055/MAU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSO Support&lt;/td&gt;
&lt;td&gt;Enterprise plan only&lt;/td&gt;
&lt;td&gt;Included (OIDC, SAML)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MFA / Passwords&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rate Limits&lt;/td&gt;
&lt;td&gt;Generous&lt;/td&gt;
&lt;td&gt;Strict (especially SAML)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;➡️ Choose Supabase if you want fast, simple auth for your apps. However, as your business grows, your team will likely need a more sophisticated auth solution. Cognito is one option, but many teams also consider Okta, Azure Entra, or WorkOS.&lt;/p&gt;

&lt;h3&gt;
  
  
  📦 Storage: Supabase Storage vs AWS S3
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Supabase:&lt;/strong&gt; S3-compatible storage with built-in access control, REST API, and CDN.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS S3:&lt;/strong&gt; Scalable object store with advanced features and global durability.&lt;/p&gt;

&lt;p&gt;🧬 Supabase is easier to use for app developers. S3 is more powerful and flexible for enterprise-scale needs.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Supabase Storage&lt;/th&gt;
&lt;th&gt;AWS S3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free Tier&lt;/td&gt;
&lt;td&gt;1GB&lt;/td&gt;
&lt;td&gt;5GB (12 months only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paid Pricing&lt;/td&gt;
&lt;td&gt;\$0.021/GB&lt;/td&gt;
&lt;td&gt;\$0.023/GB (Standard)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API&lt;/td&gt;
&lt;td&gt;Simple REST&lt;/td&gt;
&lt;td&gt;REST/S3 SDKs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permissions&lt;/td&gt;
&lt;td&gt;Built-in (row-level)&lt;/td&gt;
&lt;td&gt;IAM Policies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CDN&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;td&gt;Optional (CloudFront)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;➡️ It seems that Supabase Storage is built on top of AWS S3, providing an easy-to-use interface and lower pricing—likely due to volume discounts they can secure. The tradeoff is reduced flexibility in managing the underlying S3 buckets directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚙️ Edge Functions: Supabase vs AWS Lambda
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Supabase:&lt;/strong&gt; Deno-based edge functions with tight database integration and minimal cold starts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Lambda:&lt;/strong&gt; Flexible, multi-runtime functions with deep AWS service integration.&lt;/p&gt;

&lt;p&gt;🧬 Supabase is simpler for edge APIs. Lambda is better for complex logic, language flexibility, and AWS ecosystem workflows.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Supabase Edge Functions&lt;/th&gt;
&lt;th&gt;AWS Lambda&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Free Tier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;500,000 invocations&lt;/td&gt;
&lt;td&gt;1 million requests/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Runtime&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deno&lt;/td&gt;
&lt;td&gt;Node.js, Python, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cold Starts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Minimal&lt;/td&gt;
&lt;td&gt;Varies by region&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Region&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Global edge&lt;/td&gt;
&lt;td&gt;Region-based&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Request Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;\$2 per million&lt;/strong&gt; (includes compute)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;\$0.20 per million&lt;/strong&gt; (requests only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compute Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Included in flat price&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Additional&lt;/strong&gt;: \$0.00001667 per GB-s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Supabase&lt;/strong&gt; charges a flat fee per call — &lt;strong&gt;simpler but may appear higher&lt;/strong&gt; at first glance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Lambda&lt;/strong&gt; splits billing into two parts:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Requests&lt;/strong&gt; (cheap)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compute&lt;/strong&gt; (based on memory x execution time), which can add up.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;➡️ Supabase Edge charges only an invocation fee, while AWS Lambda has separate charges for invocations and compute time, measured in GB-seconds. Additionally, AWS Lambda supports a wider range of runtimes.&lt;/p&gt;

&lt;h3&gt;
  
  
  📡 Realtime: Supabase Messages vs AWS SQS/SNS
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Supabase:&lt;/strong&gt; WebSocket-based realtime updates triggered by PostgreSQL changes. Great for simple in-app messaging and live UIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS SQS/SNS:&lt;/strong&gt; Scalable, fully managed messaging services. Ideal for decoupled, event-driven architectures and backend pipelines.&lt;/p&gt;

&lt;p&gt;🧬 Supabase is great for realtime UX. AWS is better for complex, distributed systems.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Supabase Realtime&lt;/th&gt;
&lt;th&gt;AWS SQS / SNS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Free Tier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;500,000 messages/month&lt;/td&gt;
&lt;td&gt;1 million requests/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pub/Sub&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;td&gt;SNS only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Queueing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;SQS provides advanced queueing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PostgreSQL triggers&lt;/td&gt;
&lt;td&gt;Broad: Lambda, S3, EC2, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;\$2 per million messages&lt;/strong&gt; (flat)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;\$0.40–\$0.50 per million requests&lt;/strong&gt; + delivery &amp;amp; data transfer costs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Supabase&lt;/strong&gt; charges a flat fee per message, making pricing simple and predictable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS SQS/SNS&lt;/strong&gt; charges separately for requests, message delivery, and data transfer, offering greater flexibility and scalability for complex event-driven systems.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SQS Standard&lt;/strong&gt;: ~\$0.40 per million requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SNS&lt;/strong&gt;: ~\$0.50 per million publishes&lt;/li&gt;
&lt;li&gt;Additional charges: Message delivery (e.g., to Lambda, HTTP endpoints, or SQS) and &lt;strong&gt;Data transfer&lt;/strong&gt; if messages cross regions&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;➡️ &lt;strong&gt;Supabase Realtime charges a flat fee per message&lt;/strong&gt;, making pricing simple and predictable. &lt;strong&gt;AWS SQS/SNS charges separately for requests, message delivery, and data transfer&lt;/strong&gt;, offering greater flexibility and scalability for complex event-driven systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  💰 Pricing Comparison by Tier
&lt;/h2&gt;

&lt;h3&gt;
  
  
  💡 About AWS Reserved Pricing
&lt;/h3&gt;

&lt;p&gt;The AWS prices shown below are based on &lt;strong&gt;on-demand usage&lt;/strong&gt;, which is flexible but more expensive.&lt;br&gt;
If you commit to &lt;strong&gt;1-year or 3-year Reserved Instances&lt;/strong&gt; (RIs), you can cut costs by &lt;strong&gt;30–70%&lt;/strong&gt; — especially for RDS and Lambda.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RDS db.m5.large (Multi-AZ)&lt;/strong&gt; drops from &lt;strong&gt;\$250+/mo&lt;/strong&gt; to &lt;strong&gt;~\$145/mo&lt;/strong&gt; (1-year RI, no upfront)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lambda and compute&lt;/strong&gt; costs can be reduced via &lt;strong&gt;Compute Savings Plans&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Use on-demand for flexibility.&lt;br&gt;
🔐 Use Reserved pricing for long-term, cost-optimized workloads — but it comes with lock-in.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧪 0. Free Tier
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Supabase&lt;/th&gt;
&lt;th&gt;AWS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;✅ Shared CPU /500MB PostgreSQL&lt;/td&gt;
&lt;td&gt;⚠️ 2 vCPU (burstable) / 1GB RAM for t4g.micro (12 months)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth&lt;/td&gt;
&lt;td&gt;✅ 50K MAUs&lt;/td&gt;
&lt;td&gt;✅ 50K MAUs (Cognito)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;✅ 1GB w/ CDN&lt;/td&gt;
&lt;td&gt;⚠️ 5GB (12 months, no CDN)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functions&lt;/td&gt;
&lt;td&gt;✅ 500K Edge calls&lt;/td&gt;
&lt;td&gt;✅ 1M Lambda calls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Messaging&lt;/td&gt;
&lt;td&gt;✅ 500K Realtime messages&lt;/td&gt;
&lt;td&gt;✅ 1M SQS/SNS messages&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;🔍 &lt;strong&gt;Supabase offers a complete full-stack platform for free, with no expiration.&lt;/strong&gt;&lt;br&gt;
AWS has generous limits — but database and storage expire after 12 months.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 1. Startup (10K MAUs, 20GB DB, 50GB Storage, 500GB bandwidth)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Supabase – &lt;strong&gt;\$26.50/month&lt;/strong&gt;
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Included Service&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pro Plan&lt;/td&gt;
&lt;td&gt;8GB DB, 100GB storage, 250GB bandwidth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DB Storage Overage&lt;/td&gt;
&lt;td&gt;12GB extra @ \$0.125/GB = \$1.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth, Functions, Messaging&lt;/td&gt;
&lt;td&gt;Included in plan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bandwidth&lt;/td&gt;
&lt;td&gt;Still within free 250GB – no charge&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;✅ &lt;strong&gt;Flat, all-inclusive plan with tiny storage add-on.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  AWS
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;On-Demand – &lt;strong&gt;\$75.00/month&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;1-Year RI Estimate: &lt;strong&gt;~\$67.73/month&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;3-Year RI Estimate: &lt;strong&gt;~\$59.47/month&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Cost (On-Demand)&lt;/th&gt;
&lt;th&gt;1-Year RI (est. -30%)&lt;/th&gt;
&lt;th&gt;3-Year RI (est. -60%)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RDS (db.t3.small)&lt;/td&gt;
&lt;td&gt;\$24.82&lt;/td&gt;
&lt;td&gt;\$17.37&lt;/td&gt;
&lt;td&gt;\$9.93&lt;/td&gt;
&lt;td&gt;1 vCPU, 2GB RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDS Storage (20GB)&lt;/td&gt;
&lt;td&gt;\$2.30&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;General-purpose SSD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cognito (10K MAUs)&lt;/td&gt;
&lt;td&gt;\$0.00&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Within free tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 (50GB)&lt;/td&gt;
&lt;td&gt;\$1.15&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;\$0.023/GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bandwidth (500GB)&lt;/td&gt;
&lt;td&gt;\$45.00&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;\$0.09/GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda (1M execs)&lt;/td&gt;
&lt;td&gt;\$2.73&lt;/td&gt;
&lt;td&gt;\$1.91&lt;/td&gt;
&lt;td&gt;\$1.09&lt;/td&gt;
&lt;td&gt;512MB, 200ms duration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQS (1M requests)&lt;/td&gt;
&lt;td&gt;\$0.50&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;SNS publish cost&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Most cost comes from bandwidth.&lt;/strong&gt; Setup involves configuring 5+ services.&lt;/p&gt;

&lt;h3&gt;
  
  
  📈 2. Growing Business (100K MAUs, 200GB DB, 1TB Storage, 5TB bandwidth)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Supabase – &lt;strong&gt;\$630.40/month&lt;/strong&gt;
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pro Plan Base&lt;/td&gt;
&lt;td&gt;\$25.00&lt;/td&gt;
&lt;td&gt;Includes basic DB, auth, 100GB storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extra DB Storage (192GB)&lt;/td&gt;
&lt;td&gt;\$24.00&lt;/td&gt;
&lt;td&gt;\$0.125/GB beyond included 8GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compute Upgrade&lt;/td&gt;
&lt;td&gt;\$60.00&lt;/td&gt;
&lt;td&gt;4-core, 2GB RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extra Storage (900GB)&lt;/td&gt;
&lt;td&gt;\$18.90&lt;/td&gt;
&lt;td&gt;\$0.021/GB beyond included 100GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bandwidth (4.75TB)&lt;/td&gt;
&lt;td&gt;\$427.50&lt;/td&gt;
&lt;td&gt;\$0.09/GB beyond 250GB included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Edge Functions&lt;/td&gt;
&lt;td&gt;\$50.00&lt;/td&gt;
&lt;td&gt;Estimate for high usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Messaging&lt;/td&gt;
&lt;td&gt;\$25.00&lt;/td&gt;
&lt;td&gt;Estimate for 10M events&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;✅ &lt;strong&gt;Integrated platform; all services billed under one umbrella.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  AWS
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;On-Demand – &lt;strong&gt;\$2,325.59/month&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;1-Year RI Estimate: &lt;strong&gt;~\$2,000.69/month&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;3-Year RI Estimate: &lt;strong&gt;~\$1,675.79/month&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Cost (On-Demand)&lt;/th&gt;
&lt;th&gt;1-Year RI (est. -30%)&lt;/th&gt;
&lt;th&gt;3-Year RI (est. -60%)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RDS (db.m5.large Multi-AZ)&lt;/td&gt;
&lt;td&gt;\$249.66&lt;/td&gt;
&lt;td&gt;\$174.76&lt;/td&gt;
&lt;td&gt;\$99.86&lt;/td&gt;
&lt;td&gt;2 vCPU, 8GB RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDS Storage (200GB)&lt;/td&gt;
&lt;td&gt;\$46.00&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;SSD, replicated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cognito (90K MAUs)&lt;/td&gt;
&lt;td&gt;\$495.00&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;\$0.0055/MAU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda (50M execs)&lt;/td&gt;
&lt;td&gt;\$833.33&lt;/td&gt;
&lt;td&gt;\$583.33&lt;/td&gt;
&lt;td&gt;\$333.33&lt;/td&gt;
&lt;td&gt;1GB, 500ms execs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 (1TB)&lt;/td&gt;
&lt;td&gt;\$23.00&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;\$0.023/GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bandwidth (5TB)&lt;/td&gt;
&lt;td&gt;\$450.00&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Tiered pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Gateway&lt;/td&gt;
&lt;td&gt;\$175.00&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;50M HTTP requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudWatch&lt;/td&gt;
&lt;td&gt;\$50.00&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Monitoring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQS (10M requests)&lt;/td&gt;
&lt;td&gt;\$3.60&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;\$0.40 per million&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;⚠️ &lt;strong&gt;More expensive due to metered pricing across services. Complex to manage.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🏢 3. Enterprise (1.5M MAUs, 2TB DB, 50TB Storage, 100TB bandwidth)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Supabase – &lt;strong&gt;\$19,383.40/month&lt;/strong&gt;
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Team Plan&lt;/td&gt;
&lt;td&gt;\$599.00&lt;/td&gt;
&lt;td&gt;Enterprise features + support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DB Storage (2TB)&lt;/td&gt;
&lt;td&gt;\$249.00&lt;/td&gt;
&lt;td&gt;Extra beyond base plan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compute (4XL)&lt;/td&gt;
&lt;td&gt;\$960.00&lt;/td&gt;
&lt;td&gt;16-core, 32GB RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth (1.5M MAUs)&lt;/td&gt;
&lt;td&gt;\$4,550.00&lt;/td&gt;
&lt;td&gt;\$0.00325 per MAU beyond 100K included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage (50TB)&lt;/td&gt;
&lt;td&gt;\$1,047.90&lt;/td&gt;
&lt;td&gt;\$0.021/GB beyond 100GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bandwidth (100TB)&lt;/td&gt;
&lt;td&gt;\$8,977.50&lt;/td&gt;
&lt;td&gt;\$0.09/GB beyond 250GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Edge Functions&lt;/td&gt;
&lt;td&gt;\$2,000.00&lt;/td&gt;
&lt;td&gt;Custom pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Messaging&lt;/td&gt;
&lt;td&gt;\$1,000.00&lt;/td&gt;
&lt;td&gt;Custom pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;✅ &lt;strong&gt;Predictable, transparent billing; all services built-in.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  AWS
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;On-Demand – &lt;strong&gt;\$73,122.81/month&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;1-Year RI Estimate: &lt;strong&gt;~\$62,330.91/month&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;3-Year RI Estimate: &lt;strong&gt;~\$51,539.00/month&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Cost (On-Demand)&lt;/th&gt;
&lt;th&gt;1-Year RI (est. -30%)&lt;/th&gt;
&lt;th&gt;3-Year RI (est. -60%)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RDS (r5.4xlarge Multi-AZ)&lt;/td&gt;
&lt;td&gt;\$2,639.68&lt;/td&gt;
&lt;td&gt;\$1,847.78&lt;/td&gt;
&lt;td&gt;\$1,055.87&lt;/td&gt;
&lt;td&gt;16 vCPU, 128GB RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDS Storage (2TB IOPS)&lt;/td&gt;
&lt;td&gt;\$2,500.00&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;High-performance SSD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cognito (1.5M MAUs)&lt;/td&gt;
&lt;td&gt;\$22,350.00&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;\$0.015 per MAU (Essential plan)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda (1B execs)&lt;/td&gt;
&lt;td&gt;\$33,333.33&lt;/td&gt;
&lt;td&gt;\$23,333.33&lt;/td&gt;
&lt;td&gt;\$13,333.33&lt;/td&gt;
&lt;td&gt;2GB RAM, 1s duration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 (50TB)&lt;/td&gt;
&lt;td&gt;\$1,100.00&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Tiered pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bandwidth (100TB)&lt;/td&gt;
&lt;td&gt;\$7,000.00&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Tiered egress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Gateway&lt;/td&gt;
&lt;td&gt;\$3,500.00&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;1B HTTP requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudWatch&lt;/td&gt;
&lt;td&gt;\$500.00&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Logging + monitoring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQS (500M messages)&lt;/td&gt;
&lt;td&gt;\$199.80&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;\$0.40 per million messages&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Enterprise-grade everything — but costs are 3–4x higher.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 4. Hyperscale (10M MAUs, 10TB DB, 200TB Storage, 500TB Bandwidth)
&lt;/h3&gt;

&lt;p&gt;At this scale, you're operating at a level that most platforms — including Supabase — aren't built to serve out of the box.&lt;/p&gt;

&lt;h4&gt;
  
  
  Supabase – ❌ Not Recommended at This Scale
&lt;/h4&gt;

&lt;p&gt;Supabase’s architecture is optimized for small to mid-sized applications. While enterprise plans exist, the platform:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does not offer &lt;strong&gt;horizontal scalability&lt;/strong&gt; for PostgreSQL (no native sharding or clustering).&lt;/li&gt;
&lt;li&gt;Becomes &lt;strong&gt;cost-prohibitive&lt;/strong&gt; with 10M+ MAUs due to flat per-user pricing.&lt;/li&gt;
&lt;li&gt;Lacks fine-grained controls over &lt;strong&gt;networking, observability, and infrastructure&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;May require &lt;strong&gt;custom support contracts&lt;/strong&gt; and offloading core services (e.g., auth to WorkOS, storage to S3) to be viable.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Supabase is a great tool for rapid product development, but &lt;strong&gt;most teams at this scale migrate to cloud-native stacks&lt;/strong&gt; like AWS, GCP, or Azure for performance, reliability, and cost control.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;✅ If you're approaching hyperscale, you can still &lt;strong&gt;start with Supabase&lt;/strong&gt; — but architect with portability in mind.&lt;/p&gt;

&lt;h4&gt;
  
  
  AWS – &lt;strong&gt;\$246,392.81/month (on-demand)&lt;/strong&gt;
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;On-Demand&lt;/th&gt;
&lt;th&gt;1-Year RI (est. -30%)&lt;/th&gt;
&lt;th&gt;3-Year RI (est. -60%)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RDS (r6i.8xlarge Multi-AZ)&lt;/td&gt;
&lt;td&gt;\$10,560.00&lt;/td&gt;
&lt;td&gt;\$7,392.00&lt;/td&gt;
&lt;td&gt;\$4,224.00&lt;/td&gt;
&lt;td&gt;32 vCPU, 256GB RAM x2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDS Storage (10TB IOPS)&lt;/td&gt;
&lt;td&gt;\$12,500.00&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;High IOPS SSD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cognito (9.9M MAUs)&lt;/td&gt;
&lt;td&gt;\$148,500.00&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;\$0.015 per MAU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda (10B execs)&lt;/td&gt;
&lt;td&gt;\$33,333.33&lt;/td&gt;
&lt;td&gt;\$23,333.33&lt;/td&gt;
&lt;td&gt;\$13,333.33&lt;/td&gt;
&lt;td&gt;2GB, 1s exec duration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 (200TB)&lt;/td&gt;
&lt;td&gt;\$4,000.00&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Tiered pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bandwidth (500TB)&lt;/td&gt;
&lt;td&gt;\$35,000.00&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Tiered egress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Gateway (10B reqs)&lt;/td&gt;
&lt;td&gt;\$6,000.00&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;\$3.50/million HTTP requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudWatch&lt;/td&gt;
&lt;td&gt;\$1,000.00&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Extended logs and metrics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQS (1B messages)&lt;/td&gt;
&lt;td&gt;\$499.48&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;\$0.40 per million messages&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;✅ &lt;strong&gt;AWS is built for hyperscale&lt;/strong&gt;: global infra, granular optimization, and predictable cost control through Reserved Instances and architectural tuning.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Supabase is a fantastic platform for startups and growing teams&lt;/strong&gt; — offering a unified experience, generous free tier, and simple pricing across auth, database, storage, edge functions, and realtime.&lt;/p&gt;

&lt;p&gt;It’s ideal for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prototypes and MVPs&lt;/li&gt;
&lt;li&gt;Small-to-mid-scale production apps&lt;/li&gt;
&lt;li&gt;Teams that want to move fast without managing infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But as your product reaches &lt;strong&gt;hyperscale — millions of users, terabytes of data, and high-throughput compute&lt;/strong&gt; — &lt;strong&gt;Supabase starts to hit architectural and economic limits&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL isn’t horizontally scalable in their setup&lt;/li&gt;
&lt;li&gt;Auth and bandwidth costs grow steeply&lt;/li&gt;
&lt;li&gt;Fine-grained performance tuning and compliance become difficult&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛣️ Scale Path
&lt;/h3&gt;

&lt;p&gt;➡️ Many teams &lt;strong&gt;start with Supabase&lt;/strong&gt; to move quickly, then gradually &lt;strong&gt;offload services&lt;/strong&gt; (auth, compute, storage) to cloud-native infrastructure like &lt;strong&gt;AWS, GCP, or Azure&lt;/strong&gt; as scale and complexity grow.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Choose Supabase&lt;/strong&gt; if you want a fast, simple way to build and scale to your first million users.&lt;br&gt;
✅ &lt;strong&gt;Choose AWS&lt;/strong&gt; if you need performance at scale, deep customization, or global enterprise-grade infrastructure.&lt;/p&gt;

&lt;p&gt;👉 For a deep dive into database-specific pricing, see: &lt;a href="https://www.bytebase.com/blog/supabase-vs-aws-database-pricing/" rel="noopener noreferrer"&gt;Supabase vs AWS Database Pricing&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>supabase</category>
      <category>database</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Manage Databases 🛢️ with Terraform</title>
      <dc:creator>Ayra Jett</dc:creator>
      <pubDate>Tue, 22 Jul 2025 07:18:03 +0000</pubDate>
      <link>https://dev.to/bytebase/manage-databases-with-terraform-104o</link>
      <guid>https://dev.to/bytebase/manage-databases-with-terraform-104o</guid>
      <description>&lt;p&gt;This tutorial is part of the &lt;strong&gt;Bytebase Terraform Provider&lt;/strong&gt; series:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Part 1: &lt;a href="https://docs.bytebase.com/tutorials/manage-environments-with-terraform" rel="noopener noreferrer"&gt;Manage Environments with Terraform&lt;/a&gt; - Set up environments with policies&lt;/li&gt;
&lt;li&gt;Part 2: Manage Databases with Terraform 👈&lt;/li&gt;
&lt;li&gt;Part 3: &lt;a href="https://docs.bytebase.com/tutorials/manage-projects-with-terraform" rel="noopener noreferrer"&gt;Manage Projects with Terraform&lt;/a&gt; - Organize databases into projects&lt;/li&gt;
&lt;li&gt;Part 4: &lt;a href="https://docs.bytebase.com/tutorials/manage-general-settings-with-terraform" rel="noopener noreferrer"&gt;Manage Bytebase Settings with Terraform&lt;/a&gt; - Configure workspace profile and approval policies&lt;/li&gt;
&lt;li&gt;Part 5: &lt;a href="https://docs.bytebase.com/tutorials/manage-sql-review-rules-with-terraform" rel="noopener noreferrer"&gt;Manage SQL Review Rules with Terraform&lt;/a&gt; - Define SQL review policies&lt;/li&gt;
&lt;li&gt;Part 6: &lt;a href="https://docs.bytebase.com/tutorials/manage-users-and-groups-with-terraform" rel="noopener noreferrer"&gt;Manage Users and Groups with Terraform&lt;/a&gt; - Configure users and groups&lt;/li&gt;
&lt;li&gt;Part 7: &lt;a href="https://docs.bytebase.com/tutorials/manage-database-access-control-with-terraform" rel="noopener noreferrer"&gt;Manage Database Access Control with Terraform&lt;/a&gt; - Grant database permissions&lt;/li&gt;
&lt;li&gt;Part 8: &lt;a href="https://docs.bytebase.com/tutorials/manage-data-masking-with-terraform" rel="noopener noreferrer"&gt;Manage Data Masking with Terraform&lt;/a&gt; - Protect sensitive data&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;This tutorial series uses separate Terraform files for better organization. Files are numbered bytutorial part and sub-step (e.g., &lt;a href="https://github.com/bytebase/terraform-provider-bytebase/blob/main/tutorials/1-1-env-setting.tf" rel="noopener noreferrer"&gt;1-1-env-setting.tf&lt;/a&gt;, &lt;a href="https://github.com/bytebase/terraform-provider-bytebase/blob/main/tutorials/1-2-env-policy-rollout.tf" rel="noopener noreferrer"&gt;1-2-env-policy-rollout.tf&lt;/a&gt; for Part 1, &lt;a href="https://github.com/bytebase/terraform-provider-bytebase/blob/main/tutorials/2-instances.tf" rel="noopener noreferrer"&gt;2-instances.ti&lt;/a&gt; for Part 2, etc.). Terraform automatically handles dependencies between files.&lt;/p&gt;

&lt;p&gt;View sample code&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What You'll Learn
&lt;/h2&gt;

&lt;p&gt;Register database instances in Bytebase using Terraform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before starting this tutorial, ensure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Completed &lt;a href="https://docs.bytebase.com/tutorials/manage-environments-with-terraform" rel="noopener noreferrer"&gt;Part 1&lt;/a&gt;&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Bytebase running with built-in sample data&lt;/li&gt;
&lt;li&gt;Service account created&lt;/li&gt;
&lt;li&gt;Terraform initialized&lt;/li&gt;
&lt;li&gt;Environments configured&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1 - Explore Built-in Instances
&lt;/h2&gt;

&lt;p&gt;Bytebase sample data includes two sample PostgreSQL instances. Let's explore them:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In Bytebase, click &lt;strong&gt;Instances&lt;/strong&gt; on the left sidebar. You'll see two PostgreSQL instances:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Test Sample Instance&lt;/strong&gt; (port 8083)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prod Sample Instance&lt;/strong&gt; (port 8084)&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;+Add Instance&lt;/strong&gt;, you may add more database instances.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fewi1d28u30o0dy18hzoi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fewi1d28u30o0dy18hzoi.png" alt=" " width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Projects&lt;/strong&gt; on the left sidebar to see the &lt;code&gt;Sample Project&lt;/code&gt;, then click it. You'll see:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;hr_test&lt;/code&gt; database on Test instance&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hr_prod&lt;/code&gt; database on Prod instance&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;+ New DB&lt;/strong&gt;, you may create more databases on the existing instances.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffzoq1tquq11p1qyqgxej.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffzoq1tquq11p1qyqgxej.png" alt=" " width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 - Register Instances with Terraform
&lt;/h2&gt;

&lt;p&gt;Now let's import these instances into Terraform management.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Terraform resource&lt;/td&gt;
&lt;td&gt;&lt;a href="https://registry.terraform.io/providers/bytebase/bytebase/latest/docs/resources/instance" rel="noopener noreferrer"&gt;bytebase_instance&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sample file&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/bytebase/terraform-provider-bytebase/blob/main/tutorials/2-instances.tf" rel="noopener noreferrer"&gt;2-instances.tf&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Create &lt;code&gt;2-instances.tf&lt;/code&gt; with the following configuration:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```hcl 2-instances.tf&lt;/p&gt;

&lt;h1&gt;
  
  
  Test Sample Instance - PostgreSQL on port 8083
&lt;/h1&gt;

&lt;p&gt;resource "bytebase_instance" "test" {&lt;br&gt;
  depends_on  = [bytebase_setting.environments]&lt;br&gt;
  resource_id = "test-sample-instance"&lt;br&gt;
  environment = "environments/test"&lt;br&gt;
  title       = "Test Sample Instance"&lt;br&gt;
  engine      = "POSTGRES"&lt;br&gt;
  # Assign instance license&lt;br&gt;
  activation  = true&lt;/p&gt;

&lt;p&gt;# Connection settings for the built-in test database&lt;br&gt;
  data_sources {&lt;br&gt;
    id       = "admin-test"&lt;br&gt;
    type     = "ADMIN"&lt;br&gt;
    host     = "/tmp"      # Unix socket for local connection&lt;br&gt;
    port     = "8083"&lt;br&gt;
    username = "bbsample"&lt;br&gt;
    password = ""          # Empty for local auth&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;
&lt;h1&gt;
  
  
  Production Sample Instance - PostgreSQL on port 8084
&lt;/h1&gt;

&lt;p&gt;resource "bytebase_instance" "prod" {&lt;br&gt;
  depends_on  = [bytebase_setting.environments]&lt;br&gt;
  resource_id = "prod-sample-instance"&lt;br&gt;
  environment = "environments/prod"&lt;br&gt;
  title       = "Prod Sample Instance"&lt;br&gt;
  engine      = "POSTGRES"&lt;br&gt;
  activation  = true&lt;/p&gt;

&lt;p&gt;data_sources {&lt;br&gt;
    id       = "admin-prod"&lt;br&gt;
    type     = "ADMIN"&lt;br&gt;
    host     = "/tmp"&lt;br&gt;
    port     = "8084"&lt;br&gt;
    username = "bbsample"&lt;br&gt;
    password = ""&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


**Understanding the Configuration**

- **depends_on**: Ensures environments from Part 1 exist first
- **resource_id**: Must match the existing instance ID
- **environment**: Links instance to Test or Prod environment
- **data_sources**: Connection details for the database

## Step 3 - Apply Configuration

Now apply the configuration:



```bash
terraform plan
terraform apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Step 4 - Verify Setup
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Instances&lt;/strong&gt; in Bytebase.&lt;/li&gt;
&lt;li&gt;Verify both instances show:

&lt;ul&gt;
&lt;li&gt;Correct environment assignment&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Y&lt;/code&gt; under License column (if using Enterprise)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can now modify instance properties through Terraform. For example, to rename an instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"bytebase_instance"&lt;/span&gt; &lt;span class="s2"&gt;"test"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;# ... other config ...&lt;/span&gt;
  &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Development Database"&lt;/span&gt;  &lt;span class="c1"&gt;# Changed title&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://docs.bytebase.com/tutorials/manage-projects-with-terraform" rel="noopener noreferrer"&gt;Further Reading: Manage Projects with Terraform&lt;/a&gt;&lt;/p&gt;

</description>
      <category>terraform</category>
      <category>database</category>
      <category>tooling</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Supabase vs AWS: Database Pricing 🛢️💰 Comparison in 2025</title>
      <dc:creator>Ayra Jett</dc:creator>
      <pubDate>Tue, 22 Jul 2025 03:59:21 +0000</pubDate>
      <link>https://dev.to/bytebase/supabase-vs-aws-database-pricing-comparison-in-2025-3ah3</link>
      <guid>https://dev.to/bytebase/supabase-vs-aws-database-pricing-comparison-in-2025-3ah3</guid>
      <description>&lt;p&gt;When choosing a PostgreSQL database platform, whether for a side project or a production app, you need to look beyond features and assess the &lt;strong&gt;total cost of ownership&lt;/strong&gt; — including compute, storage, backups, and bandwidth.&lt;/p&gt;

&lt;p&gt;In this guide, we compare &lt;strong&gt;Supabase vs AWS (RDS and Aurora)&lt;/strong&gt; across &lt;strong&gt;free, entry-level, and production tiers&lt;/strong&gt;. We focus strictly on database-related costs and explain &lt;strong&gt;on-demand vs reserved pricing&lt;/strong&gt; where applicable.&lt;/p&gt;

&lt;h2&gt;
  
  
  0. Free Plans: What Do You Get for \$0?
&lt;/h2&gt;

&lt;p&gt;Both platforms offer free tiers, but they differ significantly in &lt;strong&gt;duration&lt;/strong&gt;, &lt;strong&gt;compute power&lt;/strong&gt;, and &lt;strong&gt;resource isolation&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Supabase Free Tier&lt;/th&gt;
&lt;th&gt;AWS Free Tier (12 months)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Duration&lt;/td&gt;
&lt;td&gt;Forever&lt;/td&gt;
&lt;td&gt;12 months from signup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compute&lt;/td&gt;
&lt;td&gt;Shared CPU / 500MB RAM&lt;/td&gt;
&lt;td&gt;2 vCPU (burstable) / 1GB RAM (t4g.micro, 750 hrs/mo)*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compute Type&lt;/td&gt;
&lt;td&gt;Shared container environment&lt;/td&gt;
&lt;td&gt;Dedicated EC2 instance (Graviton2, burstable)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU Architecture&lt;/td&gt;
&lt;td&gt;x86&lt;/td&gt;
&lt;td&gt;ARM (AWS Graviton2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage (DB)&lt;/td&gt;
&lt;td&gt;500MB&lt;/td&gt;
&lt;td&gt;20GB gp2*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backup&lt;/td&gt;
&lt;td&gt;7-day snapshot&lt;/td&gt;
&lt;td&gt;20GB snapshot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bandwidth&lt;/td&gt;
&lt;td&gt;5GB outbound&lt;/td&gt;
&lt;td&gt;15GB outbound&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS / Isolation&lt;/td&gt;
&lt;td&gt;Serverless (no OS access)&lt;/td&gt;
&lt;td&gt;Full OS-level isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Supabase Free&lt;/strong&gt; is ideal for hobby projects, quick MVPs, or internal tools with light traffic. It requires no setup and stays free forever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Free Tier&lt;/strong&gt; gives you significantly more power and isolation but is limited to the first 12 months after signup.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Entry-Level (Low Cost)
&lt;/h2&gt;

&lt;p&gt;When you outgrow the free tier but don’t need production-grade resources, these plans offer low-cost paths. Supabase simplifies everything with a flat rate. AWS offers more control and deeper savings through reserved pricing.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Supabase Pro Tier&lt;/th&gt;
&lt;th&gt;RDS t4g.micro (On-Demand)&lt;/th&gt;
&lt;th&gt;RDS t4g.micro (1yr Reserved)&lt;/th&gt;
&lt;th&gt;RDS t4g.micro (3yr Reserved)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Monthly Price&lt;/td&gt;
&lt;td&gt;\$25 (includes \$10 compute)*&lt;/td&gt;
&lt;td&gt;\$11.68&lt;/td&gt;
&lt;td&gt;\$6.69&lt;/td&gt;
&lt;td&gt;\$4.76&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compute&lt;/td&gt;
&lt;td&gt;1 vCPU (shared) / 1GB RAM&lt;/td&gt;
&lt;td&gt;2 vCPU (burstable) / 1GB RAM&lt;/td&gt;
&lt;td&gt;2 vCPU (burstable) / 1GB RAM&lt;/td&gt;
&lt;td&gt;2 vCPU (burstable) / 1GB RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compute Type&lt;/td&gt;
&lt;td&gt;Shared container environment&lt;/td&gt;
&lt;td&gt;Dedicated ARM instance (Graviton2)&lt;/td&gt;
&lt;td&gt;Dedicated ARM instance (Graviton2)&lt;/td&gt;
&lt;td&gt;Dedicated ARM instance (Graviton2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS Access&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage Included&lt;/td&gt;
&lt;td&gt;8GB&lt;/td&gt;
&lt;td&gt;20GB gp2&lt;/td&gt;
&lt;td&gt;20GB gp2&lt;/td&gt;
&lt;td&gt;20GB gp2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extra Storage&lt;/td&gt;
&lt;td&gt;\$0.125/GB&lt;/td&gt;
&lt;td&gt;\$0.115/GB&lt;/td&gt;
&lt;td&gt;\$0.115/GB&lt;/td&gt;
&lt;td&gt;\$0.115/GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backups&lt;/td&gt;
&lt;td&gt;7-day snapshot&lt;/td&gt;
&lt;td&gt;Free up to DB size, then \$0.095/GB*&lt;/td&gt;
&lt;td&gt;Free up to DB size, then \$0.095/GB&lt;/td&gt;
&lt;td&gt;Free up to DB size, then \$0.095/GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bandwidth&lt;/td&gt;
&lt;td&gt;250GB outbound included, then $0.09/GB&lt;/td&gt;
&lt;td&gt;\$0.09/GB outbound&lt;/td&gt;
&lt;td&gt;\$0.09/GB outbound&lt;/td&gt;
&lt;td&gt;\$0.09/GB outbound&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Supabase Pro&lt;/strong&gt; is great if you want simple, predictable pricing without dealing with EC2, storage classes, or IOPS tuning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RDS On-Demand&lt;/strong&gt; offers low-cost dedicated compute with more configurability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reserved instances&lt;/strong&gt; (1yr and 3yr) reduce costs dramatically, but require long-term commitment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Mid-Tier Production (100GB Storage + Moderate Usage)
&lt;/h2&gt;

&lt;p&gt;For established applications with real user traffic and non-trivial data volumes, cost differences and platform flexibility become more significant.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Supabase (Large)&lt;/th&gt;
&lt;th&gt;RDS m5.large (On-Demand)&lt;/th&gt;
&lt;th&gt;RDS m5.large (1yr Reserved)&lt;/th&gt;
&lt;th&gt;RDS m5.large (3yr Reserved)&lt;/th&gt;
&lt;th&gt;Aurora r5.large (On-Demand)&lt;/th&gt;
&lt;th&gt;Aurora r5.large (1yr Reserved)&lt;/th&gt;
&lt;th&gt;Aurora r5.large (3yr Reserved)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Monthly Price&lt;/td&gt;
&lt;td&gt;\$110 (flat)*&lt;/td&gt;
&lt;td&gt;\$130&lt;/td&gt;
&lt;td&gt;\$81&lt;/td&gt;
&lt;td&gt;\$56&lt;/td&gt;
&lt;td&gt;\$211&lt;/td&gt;
&lt;td&gt;\$138&lt;/td&gt;
&lt;td&gt;\$96&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compute&lt;/td&gt;
&lt;td&gt;2 vCPU (shared) / 8GB RAM&lt;/td&gt;
&lt;td&gt;2 vCPU / 8GB RAM&lt;/td&gt;
&lt;td&gt;2 vCPU / 8GB RAM&lt;/td&gt;
&lt;td&gt;2 vCPU / 8GB RAM&lt;/td&gt;
&lt;td&gt;2 vCPU / 16GB RAM&lt;/td&gt;
&lt;td&gt;2 vCPU / 16GB RAM&lt;/td&gt;
&lt;td&gt;2 vCPU / 16GB RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compute Type&lt;/td&gt;
&lt;td&gt;Shared container environment&lt;/td&gt;
&lt;td&gt;Dedicated EC2 (x86)&lt;/td&gt;
&lt;td&gt;Dedicated EC2 (x86)&lt;/td&gt;
&lt;td&gt;Dedicated EC2 (x86)&lt;/td&gt;
&lt;td&gt;Aurora cluster (I/O-Optimized)*&lt;/td&gt;
&lt;td&gt;Aurora cluster (I/O-Optimized)&lt;/td&gt;
&lt;td&gt;Aurora cluster (I/O-Optimized)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS Access&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage (100GB)&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;td&gt;\$11.50 (gp2)&lt;/td&gt;
&lt;td&gt;\$11.50 (gp2)&lt;/td&gt;
&lt;td&gt;\$11.50 (gp2)&lt;/td&gt;
&lt;td&gt;\$10 (I/O-Optimized)&lt;/td&gt;
&lt;td&gt;\$10 (I/O-Optimized)&lt;/td&gt;
&lt;td&gt;\$10 (I/O-Optimized)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backup&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;td&gt;Free up to DB size*&lt;/td&gt;
&lt;td&gt;Free up to DB size&lt;/td&gt;
&lt;td&gt;Free up to DB size&lt;/td&gt;
&lt;td&gt;\$0.021/GB*&lt;/td&gt;
&lt;td&gt;\$0.021/GB&lt;/td&gt;
&lt;td&gt;\$0.021/GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bandwidth (500GB)&lt;/td&gt;
&lt;td&gt;\$22.50 (250GB included + $0.09/GB)&lt;/td&gt;
&lt;td&gt;\$45 (\$0.09/GB)&lt;/td&gt;
&lt;td&gt;\$45 (\$0.09/GB)&lt;/td&gt;
&lt;td&gt;\$45 (\$0.09/GB)&lt;/td&gt;
&lt;td&gt;\$45 (\$0.09/GB)&lt;/td&gt;
&lt;td&gt;\$45 (\$0.09/GB)&lt;/td&gt;
&lt;td&gt;\$45 (\$0.09/GB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total/Month&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;\$145&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;\$186&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;\$138&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;\$112.50&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;\$266&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;\$193&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;\$161&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Supabase (Large)&lt;/strong&gt; bundles all costs and removes infrastructure complexity — ideal for fast-moving teams.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RDS Reserved&lt;/strong&gt; (especially 3-year) cuts monthly bills by over 50%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aurora Reserved&lt;/strong&gt; costs more, but adds built-in high availability, multi-AZ replication, and better scaling.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Heavy Workload (500GB+ Storage, High Throughput)
&lt;/h2&gt;

&lt;p&gt;For mission-critical workloads with large storage, high concurrency, and peak traffic, this tier shows how pricing stacks up across platforms.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Supabase 2XL&lt;/th&gt;
&lt;th&gt;RDS r5.xlarge (On-Demand)&lt;/th&gt;
&lt;th&gt;RDS r5.xlarge (1yr Reserved)&lt;/th&gt;
&lt;th&gt;RDS r5.xlarge (3yr Reserved)&lt;/th&gt;
&lt;th&gt;Aurora r5.xlarge (On-Demand)&lt;/th&gt;
&lt;th&gt;Aurora r5.xlarge (1yr Reserved)&lt;/th&gt;
&lt;th&gt;Aurora r5.xlarge (3yr Reserved)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Monthly Price&lt;/td&gt;
&lt;td&gt;\$410 (flat)*&lt;/td&gt;
&lt;td&gt;\$422&lt;/td&gt;
&lt;td&gt;\$246&lt;/td&gt;
&lt;td&gt;\$170&lt;/td&gt;
&lt;td&gt;\$422&lt;/td&gt;
&lt;td&gt;\$287&lt;/td&gt;
&lt;td&gt;\$210&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compute&lt;/td&gt;
&lt;td&gt;4 vCPU (shared) / 16GB RAM&lt;/td&gt;
&lt;td&gt;4 vCPU / 32GB RAM&lt;/td&gt;
&lt;td&gt;4 vCPU / 32GB RAM&lt;/td&gt;
&lt;td&gt;4 vCPU / 32GB RAM&lt;/td&gt;
&lt;td&gt;4 vCPU / 32GB RAM&lt;/td&gt;
&lt;td&gt;4 vCPU / 32GB RAM&lt;/td&gt;
&lt;td&gt;4 vCPU / 32GB RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compute Type&lt;/td&gt;
&lt;td&gt;Shared container&lt;/td&gt;
&lt;td&gt;Dedicated EC2 (x86)&lt;/td&gt;
&lt;td&gt;Dedicated EC2 (x86)&lt;/td&gt;
&lt;td&gt;Dedicated EC2 (x86)&lt;/td&gt;
&lt;td&gt;Aurora cluster (I/O-Optimized)*&lt;/td&gt;
&lt;td&gt;Aurora cluster (I/O-Optimized)&lt;/td&gt;
&lt;td&gt;Aurora cluster (I/O-Optimized)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS Access&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage (500GB)&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;td&gt;\$57.50 (gp2)&lt;/td&gt;
&lt;td&gt;\$57.50 (gp2)&lt;/td&gt;
&lt;td&gt;\$57.50 (gp2)&lt;/td&gt;
&lt;td&gt;\$50 (I/O-Optimized)&lt;/td&gt;
&lt;td&gt;\$50 (I/O-Optimized)&lt;/td&gt;
&lt;td&gt;\$50 (I/O-Optimized)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IOPS / Throughput&lt;/td&gt;
&lt;td&gt;Included (abstracted)*&lt;/td&gt;
&lt;td&gt;\$100+ (io1 estimated)*&lt;/td&gt;
&lt;td&gt;\$100+ (io1 estimated)&lt;/td&gt;
&lt;td&gt;\$100+ (io1 estimated)&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backup (500GB extra)&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;td&gt;\$47.50*&lt;/td&gt;
&lt;td&gt;\$47.50&lt;/td&gt;
&lt;td&gt;\$47.50&lt;/td&gt;
&lt;td&gt;\$10.50&lt;/td&gt;
&lt;td&gt;\$10.50&lt;/td&gt;
&lt;td&gt;\$10.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bandwidth (1TB)&lt;/td&gt;
&lt;td&gt;\$67.50 (250GB included + $0.09/GB)&lt;/td&gt;
&lt;td&gt;\$90 (\$0.09/GB)&lt;/td&gt;
&lt;td&gt;\$90 (\$0.09/GB)&lt;/td&gt;
&lt;td&gt;\$90 (\$0.09/GB)&lt;/td&gt;
&lt;td&gt;\$90 (\$0.09/GB)&lt;/td&gt;
&lt;td&gt;\$90 (\$0.09/GB)&lt;/td&gt;
&lt;td&gt;\$90 (\$0.09/GB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total/Month&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;\$477.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;\$717&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;\$541&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;\$465&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;\$572&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;\$437&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;\$361&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Supabase 2XL&lt;/strong&gt; is an all-inclusive bundle that scales without requiring DBAs or infra tuning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RDS Reserved&lt;/strong&gt; (3yr) delivers maximum cost-efficiency if your workload is stable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aurora Reserved&lt;/strong&gt; is ideal for high-volume, multi-region, or high-availability requirements.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cost Reference for Storage &amp;amp; Compute
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Supabase&lt;/th&gt;
&lt;th&gt;AWS RDS (On-Demand)&lt;/th&gt;
&lt;th&gt;AWS RDS (Reserved)*&lt;/th&gt;
&lt;th&gt;Aurora (I/O-Optimized)*&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;\$0.125/GB&lt;/td&gt;
&lt;td&gt;\$0.115/GB (gp2)*&lt;/td&gt;
&lt;td&gt;\$0.115/GB (gp2)&lt;/td&gt;
&lt;td&gt;\$0.10–\$0.225/GB*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backup&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;td&gt;\$0.095/GB*&lt;/td&gt;
&lt;td&gt;\$0.095/GB&lt;/td&gt;
&lt;td&gt;\$0.021/GB (snapshot)*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bandwidth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;250GB outbound included&lt;/td&gt;
&lt;td&gt;\$0.09/GB outbound&lt;/td&gt;
&lt;td&gt;\$0.09/GB outbound&lt;/td&gt;
&lt;td&gt;\$0.09/GB outbound&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compute&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;\$10–\$3,730 (flat)&lt;/td&gt;
&lt;td&gt;\$11–\$1,688&lt;/td&gt;
&lt;td&gt;\$6–\$1,080&lt;/td&gt;
&lt;td&gt;\$67–\$3,376&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reserved pricing&lt;/strong&gt; can reduce compute cost by 30–60%, especially for year-long or 3-year commitments.&lt;/li&gt;
&lt;li&gt;Aurora charges &lt;strong&gt;by I/O operations&lt;/strong&gt;, unless you're on their newer I/O-optimized pricing model.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📝 Explanatory Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;t4g.micro (burstable)&lt;/strong&gt;: AWS uses burstable instances like &lt;code&gt;t4g.micro&lt;/code&gt; for its Free and entry-level RDS tiers. These provide 2 ARM-based vCPUs with a CPU credit system — ideal for low-to-moderate workloads with occasional spikes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;gp2 Storage (AWS)&lt;/strong&gt;: gp2 volumes offer 3 IOPS per GB, with a &lt;strong&gt;minimum baseline of 100 IOPS&lt;/strong&gt; at 20GB. They also include &lt;strong&gt;burst capacity&lt;/strong&gt;, giving better performance than basic shared storage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Supabase Flat Pricing&lt;/strong&gt;: Supabase’s pricing includes compute, storage, backups, and bandwidth in a &lt;strong&gt;single monthly rate&lt;/strong&gt; — simplifying cost tracking and reducing surprise bills.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Backup Costs (AWS)&lt;/strong&gt;: RDS provides &lt;strong&gt;free backup storage up to the size of your DB&lt;/strong&gt;. Additional snapshot storage is charged at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;\$0.095/GB for RDS&lt;/li&gt;
&lt;li&gt;\$0.021/GB for Aurora&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Aurora I/O-Optimized&lt;/strong&gt;: This newer Aurora pricing tier eliminates per-I/O charges and instead bills a flat rate per GB stored. Ideal for write-heavy or high-throughput workloads with unpredictable I/O.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;IOPS Costs (RDS)&lt;/strong&gt;: For high-performance needs, RDS users may upgrade to &lt;code&gt;io1&lt;/code&gt; or &lt;code&gt;gp3&lt;/code&gt; storage with provisioned IOPS — typically adding \$100+ per month for workloads requiring consistent low-latency throughput.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reserved Pricing (AWS)&lt;/strong&gt;: RDS and Aurora support &lt;strong&gt;1-year and 3-year reservations&lt;/strong&gt;, reducing monthly compute costs by 30–60%. These are billed upfront or monthly and require workload stability.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Best Choice&lt;/th&gt;
&lt;th&gt;Price Range (Monthly)&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free hobby project&lt;/td&gt;
&lt;td&gt;Supabase Free&lt;/td&gt;
&lt;td&gt;\$0&lt;/td&gt;
&lt;td&gt;No time limit, zero config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Low-cost dev/test DB&lt;/td&gt;
&lt;td&gt;Supabase Pro&lt;/td&gt;
&lt;td&gt;\$25&lt;/td&gt;
&lt;td&gt;Simple flat rate, includes compute, storage, and bandwidth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS trial or AWS-focused team&lt;/td&gt;
&lt;td&gt;AWS Free Tier&lt;/td&gt;
&lt;td&gt;\$0 (12 mo)&lt;/td&gt;
&lt;td&gt;Best value compute &amp;amp; storage for teams already using AWS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost-sensitive production workload&lt;/td&gt;
&lt;td&gt;RDS Reserved&lt;/td&gt;
&lt;td&gt;\$4.76–\$96&lt;/td&gt;
&lt;td&gt;Long-term commitment cuts RDS compute cost by up to 60%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simple mid-sized app&lt;/td&gt;
&lt;td&gt;Supabase or RDS&lt;/td&gt;
&lt;td&gt;\$110–\$186&lt;/td&gt;
&lt;td&gt;Supabase for ease, RDS for control &amp;amp; cost tuning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High write/read throughput&lt;/td&gt;
&lt;td&gt;Aurora Reserved&lt;/td&gt;
&lt;td&gt;\$96–\$437&lt;/td&gt;
&lt;td&gt;Built-in performance, replication, and I/O-optimized pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-region / enterprise scale&lt;/td&gt;
&lt;td&gt;Aurora or RDS&lt;/td&gt;
&lt;td&gt;\$161–\$717&lt;/td&gt;
&lt;td&gt;Supports replication, multi-AZ, and enterprise-grade configurations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Supabase&lt;/strong&gt; offers &lt;strong&gt;simple pricing and easy setup&lt;/strong&gt;, ideal for fast-moving projects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS RDS Reserved&lt;/strong&gt; is best for &lt;strong&gt;long-term, cost-optimized workloads&lt;/strong&gt; with more control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aurora&lt;/strong&gt; suits &lt;strong&gt;high-performance, high-availability needs&lt;/strong&gt;, but at a higher cost.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choose based on your need for &lt;strong&gt;simplicity vs control&lt;/strong&gt;, and how stable your usage will be. Supabase works well for early-stage apps; AWS shines for scaled, mature systems.&lt;/p&gt;

&lt;p&gt;Need more than a database? Our next post will compare &lt;a href="https://www.bytebase.com/blog/supabase-vs-aws-pricing/" rel="noopener noreferrer"&gt;Supabase vs AWS pricing across auth, messaging, and more&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>supabase</category>
      <category>database</category>
      <category>tooling</category>
    </item>
    <item>
      <title>How LayerX Achieves “Painless” Governance and Security 🛡️ in the Cloud ☁️</title>
      <dc:creator>Ayra Jett</dc:creator>
      <pubDate>Fri, 11 Jul 2025 03:57:53 +0000</pubDate>
      <link>https://dev.to/bytebase/how-layerx-achieves-painless-governance-and-security-in-the-cloud-3hpk</link>
      <guid>https://dev.to/bytebase/how-layerx-achieves-painless-governance-and-security-in-the-cloud-3hpk</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo2ygcr5ix8ais7z1nl75.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo2ygcr5ix8ais7z1nl75.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At CloudNative Days Summer 2025, Hokuto Hoshi—CISO and Head of SRE/Corporate Engineering at LayerX—shared how the company has built a cloud-native governance framework that balances compliance, security, and developer agility. The presentation, titled &lt;a href="https://speakerdeck.com/kanny/effortless-governance-and-security-enabled-by-the-cloud" rel="noopener noreferrer"&gt;Realizing "Painless" Governance and Security in the Cloud&lt;/a&gt;, resonated with platform teams facing growing audit requirements without wanting to slow down development.&lt;/p&gt;

&lt;h2&gt;
  
  
  About LayerX
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwyo2vkvw0zl78brdkotg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwyo2vkvw0zl78brdkotg.png" alt=" " width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://layerx.co.jp/" rel="noopener noreferrer"&gt;LayerX&lt;/a&gt; is a Tokyo-based technology company with a mission to enable digitalization across all economic activities. The company operates across several domains, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://bakuraku.jp/" rel="noopener noreferrer"&gt;Bakuraku&lt;/a&gt;: A suite of AI-powered SaaS tools streamlining core enterprise workflows such as expense management, invoice processing, and approval flows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://corp.mitsui-x.com/" rel="noopener noreferrer"&gt;Fintech&lt;/a&gt;: Asset management and securities solutions delivered through a joint venture model.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://getaiworkforce.com/" rel="noopener noreferrer"&gt;AI/LLM&lt;/a&gt;: An internal platform that transforms organizational knowledge into structured, retrievable data using large language models.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LayerX builds its products with a strong emphasis on automation, auditability, and developer experience—making it a prime example of a cloud-native enterprise balancing innovation with compliance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Governance Without the Pain
&lt;/h2&gt;

&lt;p&gt;For many organizations, audit readiness still means manually collecting logs, managing permissions through spreadsheets, and retrofitting access controls into existing workflows. LayerX takes a different approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Automate controls using infrastructure-as-code and cloud-native platforms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integrate security practices directly into development workflows&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Maintain transparency and explainability for auditors and engineers alike&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Treat compliance not as a checkbox but as part of system reliability&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Their implementation spans the entire stack—from user account management to infrastructure provisioning, from application deployment to database change management.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Identity to Infrastructure: A Systems Approach
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SSO as a Security Backbone
&lt;/h3&gt;

&lt;p&gt;LayerX uses &lt;a href="https://www.microsoft.com/en-us/security/business/identity-access/microsoft-entra-id" rel="noopener noreferrer"&gt;Microsoft Entra ID&lt;/a&gt; to unify identity across systems. Employee onboarding and offboarding are fully automated via HR data and Notion, with Slack-integrated workflows for approvals. Access is consistently enforced through SSO across all internal tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  Group-Based Permissioning
&lt;/h3&gt;

&lt;p&gt;User groups are defined via &lt;a href="https://smarthr.jp/" rel="noopener noreferrer"&gt;SmartHR&lt;/a&gt; and translated to &lt;a href="https://developer.hashicorp.com/terraform/language" rel="noopener noreferrer"&gt;Terraform HCL&lt;/a&gt;, then synced to Entra ID. This bridges HR systems with access control, enabling scalable role-based access patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  Time-Bound Privilege Escalation
&lt;/h3&gt;

&lt;p&gt;To handle temporary elevated permissions, LayerX leverages &lt;a href="https://learn.microsoft.com/en-us/entra/id-governance/privileged-identity-management/pim-configure" rel="noopener noreferrer"&gt;Entra PIM&lt;/a&gt;, allowing just-in-time access with automatic expiration—a modern answer to long-standing privilege management issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  Change Management in GitHub
&lt;/h3&gt;

&lt;p&gt;Application and infrastructure changes are governed by pull request approvals using &lt;a href="https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners" rel="noopener noreferrer"&gt;GitHub's CODEOWNERS&lt;/a&gt;. Even emergency changes are logged and traceable, and deployments are automated via tools like &lt;a href="https://github.com/kayac/ecspresso" rel="noopener noreferrer"&gt;ecspresso&lt;/a&gt; and &lt;a href="https://www.terraform.io/" rel="noopener noreferrer"&gt;Terraform&lt;/a&gt; within a monorepo setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unified Logging and Simplified Audits
&lt;/h3&gt;

&lt;p&gt;Logs from &lt;a href="https://aws.amazon.com/cloudtrail/" rel="noopener noreferrer"&gt;AWS CloudTrail&lt;/a&gt;, Entra ID, &lt;a href="https://www.datadoghq.com/" rel="noopener noreferrer"&gt;Datadog&lt;/a&gt;, and &lt;a href="https://aws.amazon.com/athena/" rel="noopener noreferrer"&gt;Amazon Athena&lt;/a&gt; are aggregated and searchable via APIs and CLI commands. LayerX stores logs in &lt;a href="https://www.snowflake.com/" rel="noopener noreferrer"&gt;Snowflake&lt;/a&gt;, making it easy to visualize and retrieve audit evidence. Log extraction is automated—no more ad hoc queries or manual exports.&lt;/p&gt;

&lt;h2&gt;
  
  
  Database Governance with Bytebase
&lt;/h2&gt;

&lt;p&gt;Traditionally, database operations are disconnected from CI/CD and governance workflows. LayerX addressed this gap by adopting &lt;a href="https://dev.to/"&gt;Bytebase&lt;/a&gt; to introduce structured, auditable change management for their databases.&lt;/p&gt;

&lt;p&gt;With Bytebase, LayerX can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Review and approve schema changes through a web interface or API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Maintain audit trails for all SQL operations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Eliminate the need for bastion hosts by shifting to a secure, review-based model&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This brings the same rigor to database operations that exist for code and infrastructure—an essential step for aligning security, reliability, and developer velocity.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Model for Modern Platform Teams
&lt;/h2&gt;

&lt;p&gt;LayerX shows that auditability and agility are not mutually exclusive. By embedding governance into the developer workflow and codifying it through infrastructure and policy engines, they’ve created a foundation that’s secure, scalable, and operationally efficient.&lt;/p&gt;

&lt;p&gt;For teams managing database changes, LayerX’s use of Bytebase highlights a growing trend: bringing CI/CD, approval workflows, and visibility to one of the last remaining blind spots in DevSecOps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary of Tools and Vendors Used
&lt;/h2&gt;

&lt;p&gt;What LayerX has accomplished is a pragmatic example of how modern engineering practices, when paired with the right tools, can turn governance from a bottleneck into a built-in strength.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool / Platform&lt;/th&gt;
&lt;th&gt;Vendor&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Entra ID&lt;/td&gt;
&lt;td&gt;Microsoft&lt;/td&gt;
&lt;td&gt;SSO, identity provider, group and access control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SmartHR&lt;/td&gt;
&lt;td&gt;SmartHR&lt;/td&gt;
&lt;td&gt;HR system for managing employee roles and attributes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terraform&lt;/td&gt;
&lt;td&gt;HashiCorp&lt;/td&gt;
&lt;td&gt;Infrastructure-as-code, role syncing with IdP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entra PIM (Privileged Identity Mgmt)&lt;/td&gt;
&lt;td&gt;Microsoft&lt;/td&gt;
&lt;td&gt;Time-limited elevated access with approvals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub + CODEOWNERS&lt;/td&gt;
&lt;td&gt;Microsoft (GitHub)&lt;/td&gt;
&lt;td&gt;Pull request approval workflow for app and infra changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ecspresso&lt;/td&gt;
&lt;td&gt;KAYAC&lt;/td&gt;
&lt;td&gt;ECS deployment tool integrated with GitHub and Terraform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bytebase&lt;/td&gt;
&lt;td&gt;Bytebase&lt;/td&gt;
&lt;td&gt;CI/CD for database schema and data changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS CloudTrail&lt;/td&gt;
&lt;td&gt;Amazon Web Services&lt;/td&gt;
&lt;td&gt;Logging of AWS resource activities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon Athena&lt;/td&gt;
&lt;td&gt;Amazon Web Services&lt;/td&gt;
&lt;td&gt;Serverless log querying and analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Snowflake&lt;/td&gt;
&lt;td&gt;Snowflake&lt;/td&gt;
&lt;td&gt;Data warehouse for storing and visualizing audit logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Datadog&lt;/td&gt;
&lt;td&gt;Datadog&lt;/td&gt;
&lt;td&gt;System monitoring and additional log aggregation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slack&lt;/td&gt;
&lt;td&gt;Salesforce&lt;/td&gt;
&lt;td&gt;Notification and approval workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notion&lt;/td&gt;
&lt;td&gt;Notion&lt;/td&gt;
&lt;td&gt;Internal metadata and account provisioning source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLI / APIs / Scripts&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;Automating log extraction and compliance tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>security</category>
      <category>productivity</category>
      <category>database</category>
      <category>tooling</category>
    </item>
    <item>
      <title>How to Configure MariaDB 🦦 SSL Connection 🔌</title>
      <dc:creator>Ayra Jett</dc:creator>
      <pubDate>Wed, 02 Jul 2025 06:18:30 +0000</pubDate>
      <link>https://dev.to/bytebase/how-to-configure-mariadb-ssl-connection-1cg</link>
      <guid>https://dev.to/bytebase/how-to-configure-mariadb-ssl-connection-1cg</guid>
      <description>&lt;p&gt;This tutorial shows you how to configure MariaDB SSL connection using self-signed certificates. You'll learn to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate SSL certificates (CA, server, client)&lt;/li&gt;
&lt;li&gt;Configure MariaDB server for SSL&lt;/li&gt;
&lt;li&gt;Test SSL connections from clients&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verify MariaDB installation&lt;/span&gt;
mariadb &lt;span class="nt"&gt;--version&lt;/span&gt;

&lt;span class="c"&gt;# Verify OpenSSL installation&lt;/span&gt;
openssl version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensure you have &lt;a href="https://mariadb.org/download/" rel="noopener noreferrer"&gt;MariaDB&lt;/a&gt; and &lt;a href="https://www.openssl.org/source/" rel="noopener noreferrer"&gt;OpenSSL&lt;/a&gt; installed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generate SSL Related Files
&lt;/h2&gt;

&lt;h3&gt;
  
  
  OpenSSL Config
&lt;/h3&gt;

&lt;p&gt;Set up the configuration file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;req.conf &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
[ req ]
distinguished_name = req_distinguished_name
x509_extensions = v3_ca
prompt = no
[ req_distinguished_name ]
C = CN
ST = GD
O = Bytebase
CN = root
[ v3_ca ]
basicConstraints = critical,CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
[ v3_req ]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[ alt_names ]
IP.1 = YOUR_SERVER_IP
DNS.1 = YOUR_SERVER_HOSTNAME
DNS.2 = localhost
IP.2 = 127.0.0.1
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Replace &lt;code&gt;YOUR_SERVER_IP&lt;/code&gt; with your actual server IP address. You can find it with &lt;code&gt;ifconfig&lt;/code&gt; or &lt;code&gt;ip addr show&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Generate Certificates
&lt;/h3&gt;

&lt;p&gt;Generate Root CA key and certificate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl genrsa &lt;span class="nt"&gt;-out&lt;/span&gt; ca-key.pem 2048
openssl req &lt;span class="nt"&gt;-x509&lt;/span&gt; &lt;span class="nt"&gt;-new&lt;/span&gt; &lt;span class="nt"&gt;-key&lt;/span&gt; ca-key.pem &lt;span class="nt"&gt;-sha256&lt;/span&gt; &lt;span class="nt"&gt;-days&lt;/span&gt; 36500 &lt;span class="nt"&gt;-out&lt;/span&gt; ca-cert.pem &lt;span class="nt"&gt;-extensions&lt;/span&gt; &lt;span class="s1"&gt;'v3_ca'&lt;/span&gt; &lt;span class="nt"&gt;-config&lt;/span&gt; req.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generate Server key and certificate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl genrsa &lt;span class="nt"&gt;-out&lt;/span&gt; server-key.pem 2048
openssl req &lt;span class="nt"&gt;-new&lt;/span&gt; &lt;span class="nt"&gt;-sha256&lt;/span&gt; &lt;span class="nt"&gt;-key&lt;/span&gt; server-key.pem &lt;span class="nt"&gt;-out&lt;/span&gt; server-req.pem &lt;span class="nt"&gt;-subj&lt;/span&gt; &lt;span class="s2"&gt;"/C=CN/ST=GD/O=Bytebase/CN=YOUR_SERVER_IP"&lt;/span&gt;
openssl x509 &lt;span class="nt"&gt;-req&lt;/span&gt; &lt;span class="nt"&gt;-days&lt;/span&gt; 36500 &lt;span class="nt"&gt;-sha256&lt;/span&gt; &lt;span class="nt"&gt;-extensions&lt;/span&gt; v3_req &lt;span class="nt"&gt;-CA&lt;/span&gt; ca-cert.pem &lt;span class="nt"&gt;-CAkey&lt;/span&gt; ca-key.pem &lt;span class="nt"&gt;-CAcreateserial&lt;/span&gt; &lt;span class="nt"&gt;-in&lt;/span&gt; server-req.pem &lt;span class="nt"&gt;-out&lt;/span&gt; server-cert.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Replace YOUR_SERVER_IP with your real server IP.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Generate Client key and certificate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl genrsa &lt;span class="nt"&gt;-out&lt;/span&gt; client-key.pem 2048
openssl req &lt;span class="nt"&gt;-new&lt;/span&gt; &lt;span class="nt"&gt;-sha256&lt;/span&gt; &lt;span class="nt"&gt;-key&lt;/span&gt; client-key.pem &lt;span class="nt"&gt;-out&lt;/span&gt; client-req.pem &lt;span class="nt"&gt;-subj&lt;/span&gt; &lt;span class="s2"&gt;"/C=CN/ST=GD/O=Bytebase/CN=mariadb-client"&lt;/span&gt;
openssl x509 &lt;span class="nt"&gt;-req&lt;/span&gt; &lt;span class="nt"&gt;-days&lt;/span&gt; 36500 &lt;span class="nt"&gt;-sha256&lt;/span&gt; &lt;span class="nt"&gt;-extensions&lt;/span&gt; v3_req &lt;span class="nt"&gt;-CA&lt;/span&gt; ca-cert.pem &lt;span class="nt"&gt;-CAkey&lt;/span&gt; ca-key.pem &lt;span class="nt"&gt;-CAcreateserial&lt;/span&gt; &lt;span class="nt"&gt;-in&lt;/span&gt; client-req.pem &lt;span class="nt"&gt;-out&lt;/span&gt; client-cert.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configure MariaDB Server
&lt;/h2&gt;

&lt;p&gt;Copy SSL files and set permissions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For macOS (Homebrew):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# For Apple Silicon Macs&lt;/span&gt;
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/homebrew/etc/mariadb/ssl
&lt;span class="nb"&gt;sudo cp &lt;/span&gt;ca-cert.pem server-cert.pem server-key.pem /opt/homebrew/etc/mariadb/ssl/
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;whoami&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:admin /opt/homebrew/etc/mariadb/ssl/
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;600 /opt/homebrew/etc/mariadb/ssl/&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="nt"&gt;-key&lt;/span&gt;.pem
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;644 /opt/homebrew/etc/mariadb/ssl/ca-cert.pem /opt/homebrew/etc/mariadb/ssl/server-cert.pem

&lt;span class="c"&gt;# For Intel Macs&lt;/span&gt;
&lt;span class="c"&gt;# sudo mkdir -p /usr/local/etc/mariadb/ssl&lt;/span&gt;
&lt;span class="c"&gt;# sudo cp ca-cert.pem server-cert.pem server-key.pem /usr/local/etc/mariadb/ssl/&lt;/span&gt;
&lt;span class="c"&gt;# sudo chown -R $(whoami):admin /usr/local/etc/mariadb/ssl/&lt;/span&gt;
&lt;span class="c"&gt;# sudo chmod 600 /usr/local/etc/mariadb/ssl/*-key.pem&lt;/span&gt;
&lt;span class="c"&gt;# sudo chmod 644 /usr/local/etc/mariadb/ssl/ca-cert.pem /usr/local/etc/mariadb/ssl/server-cert.pem&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For Linux systems:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/mariadb/ssl
&lt;span class="nb"&gt;sudo cp &lt;/span&gt;ca-cert.pem server-cert.pem server-key.pem /etc/mariadb/ssl/
&lt;span class="nb"&gt;sudo chown &lt;/span&gt;mysql:mysql /etc/mariadb/ssl/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;600 /etc/mariadb/ssl/&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="nt"&gt;-key&lt;/span&gt;.pem
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;644 /etc/mariadb/ssl/ca-cert.pem /etc/mariadb/ssl/server-cert.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Edit MariaDB configuration file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# For macOS (Apple Silicon)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /opt/homebrew/etc/my.cnf

&lt;span class="c"&gt;# For macOS (Intel)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /usr/local/etc/my.cnf

&lt;span class="c"&gt;# For Linux (Ubuntu/Debian)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/mysql/mariadb.conf.d/50-server.cnf

&lt;span class="c"&gt;# For Linux (CentOS/RHEL)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/my.cnf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add SSL configuration:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For macOS (Apple Silicon):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[mysqld]&lt;/span&gt;
&lt;span class="py"&gt;ssl-ca&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/opt/homebrew/etc/mariadb/ssl/ca-cert.pem&lt;/span&gt;
&lt;span class="py"&gt;ssl-cert&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/opt/homebrew/etc/mariadb/ssl/server-cert.pem&lt;/span&gt;
&lt;span class="py"&gt;ssl-key&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/opt/homebrew/etc/mariadb/ssl/server-key.pem&lt;/span&gt;
&lt;span class="py"&gt;bind-address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;0.0.0.0&lt;/span&gt;
&lt;span class="py"&gt;port&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;3306&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For macOS (Intel):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[mysqld]&lt;/span&gt;
&lt;span class="py"&gt;ssl-ca&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/usr/local/etc/mariadb/ssl/ca-cert.pem&lt;/span&gt;
&lt;span class="py"&gt;ssl-cert&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/usr/local/etc/mariadb/ssl/server-cert.pem&lt;/span&gt;
&lt;span class="py"&gt;ssl-key&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/usr/local/etc/mariadb/ssl/server-key.pem&lt;/span&gt;
&lt;span class="py"&gt;bind-address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;0.0.0.0&lt;/span&gt;
&lt;span class="py"&gt;port&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;3306&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For Linux systems:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[mysqld]&lt;/span&gt;
&lt;span class="py"&gt;ssl-ca&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/etc/mariadb/ssl/ca-cert.pem&lt;/span&gt;
&lt;span class="py"&gt;ssl-cert&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/etc/mariadb/ssl/server-cert.pem&lt;/span&gt;
&lt;span class="py"&gt;ssl-key&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/etc/mariadb/ssl/server-key.pem&lt;/span&gt;
&lt;span class="py"&gt;bind-address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;0.0.0.0&lt;/span&gt;
&lt;span class="py"&gt;port&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;3306&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart MariaDB:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# For macOS (Homebrew)&lt;/span&gt;
brew services restart mariadb

&lt;span class="c"&gt;# For Linux (systemd)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart mariadb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Test SSL Connection
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mariadb &lt;span class="nt"&gt;-h&lt;/span&gt; localhost &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So that you'll be entering MariaDB CLI. You can also verify remote connection by replacing the &lt;code&gt;localhost&lt;/code&gt; above with your server IP to connect. Check your SSL connection with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seeing something like &lt;code&gt;SSL: Cipher in use is TLS_AES_256_GCM_SHA384, cert is OK&lt;/code&gt;, so that the SSL connection is ready.&lt;/p&gt;

&lt;p&gt;Or use command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;STATUS&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'Ssl_version'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll see something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="c1"&gt;---------------+---------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Variable_name&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="c1"&gt;---------------+---------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Ssl_version&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;TLSv1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="c1"&gt;---------------+---------+&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;row&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;006&lt;/span&gt; &lt;span class="n"&gt;sec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;You have successfully configured SSL for MariaDB:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generated CA, server, and client certificates&lt;/li&gt;
&lt;li&gt;Configured MariaDB with SSL settings&lt;/li&gt;
&lt;li&gt;Tested secure connections from clients&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your MariaDB server now accepts encrypted connections only.&lt;/p&gt;

</description>
      <category>ssl</category>
      <category>mariadb</category>
      <category>database</category>
      <category>sql</category>
    </item>
    <item>
      <title>Features I Wish Postgres 🐘 Had but MySQL 🐬 Already Has 😼</title>
      <dc:creator>Ayra Jett</dc:creator>
      <pubDate>Thu, 26 Jun 2025 07:20:30 +0000</pubDate>
      <link>https://dev.to/bytebase/features-i-wish-postgres-had-but-mysql-already-has-216b</link>
      <guid>https://dev.to/bytebase/features-i-wish-postgres-had-but-mysql-already-has-216b</guid>
      <description>&lt;p&gt;At Bytebase, we work extensively with both Postgres and MySQL. In our &lt;a href="https://dev.to/blog/features-i-wish-mysql-had-but-postgres-already-has"&gt;previous post&lt;/a&gt;, we highlighted features where Postgres shines compared to MySQL. In this post, we'll examine where MySQL excels and Postgres falls short.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performant Storage Engine for Write-Intensive Workloads
&lt;/h2&gt;

&lt;p&gt;Postgres' heap-based storage with tuple versioning MVCC creates more overhead for write-intensive scenarios (write amplification). While Postgres has made improvements with features like HOT updates, it still generates more WAL (Write-Ahead Log) traffic and requires more frequent VACUUM operations under heavy write loads.&lt;/p&gt;

&lt;p&gt;On the other hand, MySQL employs clustered index storage and undo logging, which is more performant especially for write heavy workload.&lt;/p&gt;

&lt;p&gt;The comparison is detailed in &lt;a href="https://www.uber.com/blog/postgres-to-mysql-migration/" rel="noopener noreferrer"&gt;Uber's switch From Postgres to MySQL&lt;/a&gt; and &lt;a href="https://www.cs.cmu.edu/~pavlo/blog/2023/04/the-part-of-Postgres-we-hate-the-most.html" rel="noopener noreferrer"&gt;The Part of Postgres We Hate the Most&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Postgres users need to deal with the infamous &lt;a href="https://blog.sentry.io/transaction-id-wraparound-in-postgres/" rel="noopener noreferrer"&gt;transaction ID wraparound&lt;/a&gt;, and the not-so-famous &lt;a href="https://metronome.com/blog/root-cause-analysis-Postgres-multixact-member-exhaustion-incidents-may-2025" rel="noopener noreferrer"&gt;MultiXact member exhaustion&lt;/a&gt;. &lt;a href="https://github.com/orioledb/orioledb" rel="noopener noreferrer"&gt;OrioleDB&lt;/a&gt; is tackling these issues, but it's still years until it reaches the maturity of MySQL's InnoDB.&lt;/p&gt;

&lt;h2&gt;
  
  
  Replication
&lt;/h2&gt;

&lt;p&gt;MySQL's Group Replication provides both single-primary and multi-primary replication with automatic failover and conflict detection built-in. It handles network partitions gracefully with built-in quorum logic, automatically determining which partition remains writable.&lt;/p&gt;

&lt;p&gt;Postgres relies on external tools like Patroni, pg_auto_failover for similar functionality. These solutions work but require non-trivial operational overhead and expertise to configure and maintain properly.&lt;/p&gt;

&lt;p&gt;Postgres' logical replication, introduced in version 10, is also still catching up. Its most significant limitation is DDL operations are not replicated - they must be applied manually to subscribers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Invisible Indexes
&lt;/h2&gt;

&lt;p&gt;MySQL's invisible indexes allow you to test index effectiveness without impacting existing queries or disable indexes temporarily - a crucial feature for production database optimization.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- MySQL: Create invisible index for testing&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_orders_status&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;INVISIBLE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Test queries with the invisible index&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;SESSION&lt;/span&gt; &lt;span class="n"&gt;optimizer_switch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'use_invisible_indexes=on'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;EXPLAIN&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'pending'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Make index visible after confirming it helps&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_orders_status&lt;/span&gt; &lt;span class="n"&gt;VISIBLE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They also help with index maintenance strategies. You can make an index invisible before dropping it, ensuring no queries break, then safely remove it later.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Make index invisible to see if it hurts&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_orders_status&lt;/span&gt; &lt;span class="n"&gt;INVISIBLE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Then drop it if it doesn't break queries&lt;/span&gt;
&lt;span class="k"&gt;DROP&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_orders_status&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Postgres doesn't provide built-in syntax to enable/disable an index. Though you can toggle &lt;code&gt;indisvalid&lt;/code&gt; from the &lt;code&gt;pg_index&lt;/code&gt; table as a workaround.&lt;/p&gt;

&lt;h2&gt;
  
  
  Online Schema Migration Tooling
&lt;/h2&gt;

&lt;p&gt;MySQL's ecosystem provides mature, production-ready tools for online schema changes that Postgres still lacks.&lt;/p&gt;

&lt;p&gt;If your table doesn't have foreign keys, you can use GitHub's trigger-less &lt;a href="https://github.com/github/gh-ost/" rel="noopener noreferrer"&gt;gh-ost&lt;/a&gt;, otherwise, Percona's trigger-based &lt;a href="https://docs.percona.com/percona-toolkit/pt-online-schema-change.html" rel="noopener noreferrer"&gt;pt-online-schema-change&lt;/a&gt; is also a battle-tested solution.&lt;/p&gt;

&lt;p&gt;The Postgres community has developed several solutions, but none has matched the adoption rate of MySQL's gh-ost or pt-online-schema-change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connection Handling
&lt;/h2&gt;

&lt;p&gt;While Postgres' process-per-connection provides better isolation, it consumes more memory per connection, incurs context switching overhead, and is more prune to hit connection limit.&lt;/p&gt;

&lt;p&gt;MySQL's thread-per-connection model is subject to entire server crashes caused by a query of death, but is more scalable.&lt;/p&gt;

&lt;p&gt;There is a comprehensive discussion in the Postgres community about making the switch &lt;a href="https://www.Postgres.org/message-id/flat/31cc6df9-53fe-3cd9-af5b-ac0d801163f4%40iki.fi" rel="noopener noreferrer"&gt;Let's make Postgres multi-threaded&lt;/a&gt;. But because the process model is too deeply coupled with the rest of Postgres, it will be quite a challenging task to tackle.&lt;/p&gt;




&lt;p&gt;MySQL remains the most popular open source database today, serving as the de facto database of the internet era. Looking back, two pillars drove its popularity:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pragmatic core team.&lt;/strong&gt; The original MySQL team prioritized features based on real-world use cases.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Replication, the most critical building block for scalability and fast failover on commodity hardware, was introduced in version 3.23 in 2001—nearly a decade before Postgres added replication in 2010 (version 9.0).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When the core team lacked bandwidth to build a better storage engine, they designed a pluggable storage engine architecture that opened the door to InnoDB.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vibrant community.&lt;/strong&gt; When internet companies experienced hypergrowth and needed an open source database that was performant and scalable on commodity hardware, MySQL was the obvious choice. Google's initial ads system, Twitter, Facebook, Alibaba, and GitHub all chose MySQL. Though exceptions like Instagram chose Postgres, most successful internet-era companies selected MySQL and contributed enhancements like MHA, RocksDB, gh-ost, and replication improvements. This created a generation of MySQL experts advocating the technology and spawned dedicated consulting businesses like Percona, which provided educational resources and indispensable tools like the Percona toolkit.&lt;/p&gt;

&lt;p&gt;Tides are changing, and Postgres has become the new hotness in the AI era. While MySQL retains several architectural advantages over Postgres, will it hold the fort or become obsolete within 10 years?&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>mysql</category>
      <category>database</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Features I Wish MySQL Had but Postgres 🐘 Already Has 😻</title>
      <dc:creator>Ayra Jett</dc:creator>
      <pubDate>Tue, 10 Jun 2025 07:04:15 +0000</pubDate>
      <link>https://dev.to/bytebase/features-i-wish-mysql-had-but-postgres-already-has-4986</link>
      <guid>https://dev.to/bytebase/features-i-wish-mysql-had-but-postgres-already-has-4986</guid>
      <description>&lt;p&gt;At Bytebase, we work extensively with PostgreSQL and MySQL. Both databases have pros and cons. In this post, we’ll highlight where PostgreSQL shines and MySQL falls short.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transactional DDL
&lt;/h2&gt;

&lt;p&gt;One of PostgreSQL's most underrated features is its support for transactional DDL (Data Definition Language). In PostgreSQL, you can wrap schema changes in transactions and roll them back if something goes wrong. Even better, PostgreSQL supports savepoints within DDL transactions for fine-grained control.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- PostgreSQL: This works!&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="k"&gt;COLUMN&lt;/span&gt; &lt;span class="n"&gt;email_verified&lt;/span&gt; &lt;span class="nb"&gt;BOOLEAN&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;FALSE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;SAVEPOINT&lt;/span&gt; &lt;span class="n"&gt;after_column_add&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_users_email_verified&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email_verified&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;-- Oops, index creation failed, but we can keep the column&lt;/span&gt;
&lt;span class="k"&gt;ROLLBACK&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="n"&gt;SAVEPOINT&lt;/span&gt; &lt;span class="n"&gt;after_column_add&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;COMMIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In MySQL, DDL statements are auto-committed, meaning there's no going back once you execute them. This makes database migrations risky, especially in production environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom Types and Domains
&lt;/h2&gt;

&lt;p&gt;PostgreSQL allows you to create custom data types and domains, providing better data modeling capabilities and stronger type safety.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- PostgreSQL: Create custom types&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TYPE&lt;/span&gt; &lt;span class="n"&gt;mood&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="nb"&gt;ENUM&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'sad'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'ok'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'happy'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DOMAIN&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;CHECK&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;VALUE&lt;/span&gt; &lt;span class="o"&gt;~*&lt;/span&gt; &lt;span class="s1"&gt;'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s1"&gt;[A-Za-z]{2,}$'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;-- Custom domain with validation&lt;/span&gt;
    &lt;span class="n"&gt;current_mood&lt;/span&gt; &lt;span class="n"&gt;mood&lt;/span&gt;  &lt;span class="c1"&gt;-- Custom enum type&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MySQL's ENUM support is limited and doesn't offer the same flexibility. Custom domains with built-in validation rules help enforce data integrity at the database level, reducing the need for application-level validation and ensuring consistency across all applications that access the database.&lt;/p&gt;

&lt;h2&gt;
  
  
  Array Types
&lt;/h2&gt;

&lt;p&gt;PostgreSQL's native array support is incredibly powerful for storing and querying lists of values without requiring separate tables.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- PostgreSQL: Arrays are first-class citizens&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;articles&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;  &lt;span class="c1"&gt;-- Array of tags&lt;/span&gt;
    &lt;span class="n"&gt;view_counts&lt;/span&gt; &lt;span class="nb"&gt;INTEGER&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;  &lt;span class="c1"&gt;-- Array of daily view counts&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Query with array operations&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;articles&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="s1"&gt;'postgresql'&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;ANY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;array_length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view_counts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's worth noting that PostgreSQL arrays don't support referential integrity constraints yet - you can't have foreign key relationships on array elements. Despite this limitation, native array support eliminates the need for many-to-many relationship tables in certain scenarios and can significantly simplify data models.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Table Expressions (CTEs)
&lt;/h2&gt;

&lt;p&gt;PostgreSQL has supported CTEs since version 8.4 (2009), while MySQL only added basic CTE support in version 8.0 (2018). PostgreSQL's implementation is more mature and feature-complete.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- PostgreSQL: Recursive CTEs for hierarchical data&lt;/span&gt;
&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="k"&gt;RECURSIVE&lt;/span&gt; &lt;span class="n"&gt;employee_hierarchy&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c1"&gt;-- Base case: top-level managers&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;manager_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="k"&gt;level&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;manager_id&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;

    &lt;span class="k"&gt;UNION&lt;/span&gt; &lt;span class="k"&gt;ALL&lt;/span&gt;

    &lt;span class="c1"&gt;-- Recursive case: subordinates&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;manager_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eh&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;level&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
    &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;employee_hierarchy&lt;/span&gt; &lt;span class="n"&gt;eh&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;manager_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;eh&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employee_hierarchy&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="k"&gt;level&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PostgreSQL's CTE implementation supports more advanced features like &lt;code&gt;MATERIALIZED&lt;/code&gt; and &lt;code&gt;NOT MATERIALIZED&lt;/code&gt; hints, giving you control over query optimization strategies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Row Level Security (RLS)
&lt;/h2&gt;

&lt;p&gt;PostgreSQL's Row Level Security allows you to implement fine-grained access control directly at the database level.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- PostgreSQL: Enable RLS and create policies&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;documents&lt;/span&gt; &lt;span class="n"&gt;ENABLE&lt;/span&gt; &lt;span class="k"&gt;ROW&lt;/span&gt; &lt;span class="k"&gt;LEVEL&lt;/span&gt; &lt;span class="k"&gt;SECURITY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Policy for user-specific data&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;POLICY&lt;/span&gt; &lt;span class="n"&gt;user_documents&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;documents&lt;/span&gt;
    &lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;ALL&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="n"&gt;app_user&lt;/span&gt;
    &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;owner_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current_setting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'app.current_user_id'&lt;/span&gt;&lt;span class="p"&gt;)::&lt;/span&gt;&lt;span class="nb"&gt;INTEGER&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Policy for multi-tenant applications&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;POLICY&lt;/span&gt; &lt;span class="n"&gt;tenant_isolation&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;documents&lt;/span&gt;
    &lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;ALL&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="n"&gt;app_user&lt;/span&gt;
    &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current_setting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'app.tenant_id'&lt;/span&gt;&lt;span class="p"&gt;)::&lt;/span&gt;&lt;span class="nb"&gt;INTEGER&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Users can only see their own documents automatically&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;-- Only returns user's documents in their tenant&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While RLS is excellent for simple &lt;code&gt;user_id&lt;/code&gt; or &lt;code&gt;tenant_id&lt;/code&gt; filtering, it becomes complex for more sophisticated authorization rules involving roles, permissions, or dynamic relationships. However, it still serves as a valuable defense-in-depth mechanism in your database security chain, ensuring that even if application-level security fails, sensitive data remains protected.&lt;/p&gt;

&lt;p&gt;MySQL lacks built-in RLS, forcing developers to implement access control in application code or through complex view structures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Partial Indexes
&lt;/h2&gt;

&lt;p&gt;PostgreSQL allows you to create indexes with WHERE clauses, making them smaller and more efficient for specific query patterns.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- PostgreSQL: Index only active users&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_active_users&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last_login&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'active'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Index only pending orders&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_pending_orders&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'pending'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MySQL requires you to index the entire column, leading to larger indexes and potentially slower performance when you only need to optimize queries for a subset of data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Spatial Support
&lt;/h2&gt;

&lt;p&gt;While both databases support spatial data, PostgreSQL's PostGIS extension provides far more comprehensive geospatial capabilities.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- PostgreSQL with PostGIS: Advanced spatial queries&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;ST_Distance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ST_MakePoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;73&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;935242&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;730610&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;distance_km&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;restaurants&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;ST_DWithin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ST_MakePoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;73&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;935242&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;730610&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;-- Within 1km&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ST_MakePoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;73&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;935242&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;730610&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;-- KNN search&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MySQL's spatial support, while improving, doesn't match the depth and performance of PostGIS. For applications requiring serious geospatial functionality, PostgreSQL with PostGIS is the clear winner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vector Support
&lt;/h2&gt;

&lt;p&gt;With the rise of AI, PostgreSQL has embraced vector storage and similarity search through pgvector.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- PostgreSQL with pgvector: Store and search embeddings&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;documents&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="n"&gt;VECTOR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1536&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;-- OpenAI embedding dimension&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Find similar documents using cosine similarity&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'[0.1, 0.2, ...]'&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;similarity&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;documents&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'[0.1, 0.2, ...]'&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MySQL recently added vector support in version 9.0 with basic VECTOR data types and limited distance functions, but PostgreSQL's pgvector extension remains more mature with broader operator support, better indexing options (IVFFlat, HNSW), and a richer ecosystem of vector operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Parser
&lt;/h2&gt;

&lt;p&gt;PostgreSQL adheres more closely to SQL standards and provides better error messages and more predictable behavior. MySQL's parser has historically been more lenient, which can lead to subtle bugs and makes it harder to write portable SQL.&lt;/p&gt;

&lt;p&gt;For tooling developers, the &lt;a href="https://github.com/pganalyze/libpg_query" rel="noopener noreferrer"&gt;libpg_query&lt;/a&gt; project extracts PostgreSQL's actual parser code, providing 100% compatibility with PostgreSQL's SQL parsing behavior. For MySQL, the most widely used parser is from &lt;a href="https://github.com/pingcap/tidb/tree/master/pkg/parser" rel="noopener noreferrer"&gt;TiDB&lt;/a&gt;, but it has compatibility differences since it was built specifically for TiDB's needs rather than pure MySQL compatibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  Openness
&lt;/h2&gt;

&lt;p&gt;PostgreSQL pairs a permissive PostgreSQL License (akin to BSD) with an extensible architecture, giving developers full freedom to embed, modify, or commercialize the database without license friction. Its community operates in the open: design discussions happen on the public &lt;a href="https://www.postgresql.org/list/pgsql-hackers/" rel="noopener noreferrer"&gt;pgsql-hackers mailing list&lt;/a&gt;, and every commit carries an explanatory message—see, for instance, the recent PG 18 additions of &lt;a href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=83ea6c54025bea67bcd4949a6d58d3fc11c3e21b" rel="noopener noreferrer"&gt;virtual generated columns&lt;/a&gt; and &lt;a href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a379061a22a8fdf421e1a457cc6af8503def6252" rel="noopener noreferrer"&gt;NOT VALID NOT NULL constraints&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;By contrast, MySQL’s dual-licensing model (GPL plus commercial) restricts downstream choices, and its main public touchpoint is an &lt;a href="https://bugs.mysql.com/" rel="noopener noreferrer"&gt;opaque bug tracker&lt;/a&gt;—some issues are hidden from both the community and the original reporter.&lt;/p&gt;

&lt;p&gt;As MongoDB’s CEO put it on the FY26 Q1 earnings call:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7y1692my7k080kbv8ew6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7y1692my7k080kbv8ew6.png" alt=" " width="632" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Open source, open standard, and most importantly, not owned by any one vendor.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;PostgreSQL embodies that ideal in a way MySQL cannot.&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>mysql</category>
      <category>sql</category>
      <category>database</category>
    </item>
    <item>
      <title>Postgres 🐘 vs. MySQL 🐬: DDL Transaction Difference</title>
      <dc:creator>Ayra Jett</dc:creator>
      <pubDate>Tue, 03 Jun 2025 13:30:00 +0000</pubDate>
      <link>https://dev.to/bytebase/postgres-vs-mysql-ddl-transaction-difference-2gjo</link>
      <guid>https://dev.to/bytebase/postgres-vs-mysql-ddl-transaction-difference-2gjo</guid>
      <description>&lt;p&gt;Database schema changes are critical operations that require careful planning and execution. The ability to perform these changes safely and reliably is a key consideration when choosing a database management system. In this post, we'll compare how PostgreSQL 17 and MySQL 8 handle Data Definition Language (DDL) transactions, with a focus on atomicity and rollback capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding DDL Transactions
&lt;/h2&gt;

&lt;p&gt;Before diving into the comparison, let's clarify what we mean by DDL transactions. DDL statements can be grouped together and either committed as a unit or rolled back entirely if something goes wrong.&lt;/p&gt;

&lt;p&gt;There are two important concepts to distinguish:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Transactional DDL&lt;/strong&gt;: The ability to include DDL statements within a multi-statement transaction block, with the option to commit or roll back all statements together.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Atomic DDL&lt;/strong&gt;: The guarantee that individual DDL statements are atomic (all-or-nothing), but not necessarily supporting their inclusion in multi-statement transactions.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  PostgreSQL 17: True Transactional DDL
&lt;/h2&gt;

&lt;p&gt;In PostgreSQL 17, DDL operations are fully transactional, meaning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DDL statements can be included in transaction blocks alongside DML statements&lt;/li&gt;
&lt;li&gt;Multiple DDL operations can be committed or rolled back as a single unit&lt;/li&gt;
&lt;li&gt;Savepoints can be used within transactions that include DDL statements&lt;/li&gt;
&lt;li&gt;If a transaction fails, all DDL changes are rolled back, leaving the database in its original state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are only a few exceptions to this rule: operations on databases and tablespaces themselves (such as &lt;code&gt;CREATE DATABASE&lt;/code&gt; or &lt;code&gt;DROP TABLESPACE&lt;/code&gt;) cannot be rolled back. However, all other catalog operations are reversible.&lt;/p&gt;

&lt;h2&gt;
  
  
  MySQL 8: Atomic DDL
&lt;/h2&gt;

&lt;p&gt;Prior to MySQL 8, DDL operations in MySQL were not atomic at all. If a DDL statement failed partway through execution—such as an &lt;code&gt;ALTER TABLE&lt;/code&gt; operation that was adding multiple columns or indexes—the database could be left in an inconsistent, partially-modified state.&lt;/p&gt;

&lt;p&gt;MySQL 8 introduced a feature called &lt;strong&gt;Atomic DDL&lt;/strong&gt; which represents a significant improvement over previous versions but differs fundamentally from PostgreSQL's approach.&lt;/p&gt;

&lt;p&gt;In MySQL 8, DDL statements are atomic at the statement level, meaning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Individual DDL statements are either fully completed or fully rolled back&lt;/li&gt;
&lt;li&gt;DDL statements &lt;strong&gt;implicitly commit&lt;/strong&gt; any active transaction before execution&lt;/li&gt;
&lt;li&gt;DDL statements cannot be part of a multi-statement transaction that can be rolled back&lt;/li&gt;
&lt;li&gt;Crash recovery ensures statement-level atomicity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MySQL's atomic DDL is implemented through a special internal &lt;code&gt;DDL_LOG&lt;/code&gt; table in InnoDB that tracks the creation of files and structures during DDL execution. This log is used at commit/rollback time to clean up properly, ensuring that no orphaned files or index trees remain after a crash.&lt;/p&gt;

&lt;p&gt;It's important to note that atomic DDL is only supported in MySQL 8 InnoDB storage engine. For tables using other storage engines, partial updates may still occur.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;

&lt;p&gt;To better understand these differences, let's run some DDLs that demonstrate how DDL transactions behave in both systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  PostgreSQL 17
&lt;/h3&gt;

&lt;p&gt;Our 1st example makes all DDL operations wrap in a transaction. When we execute the &lt;code&gt;ROLLBACK&lt;/code&gt; command, all tables and indexes are removed as if they were never created.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Start a transaction block&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Create a simple table&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Add an index&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_username&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Oops! We made a mistake and want to roll back all changes&lt;/span&gt;
&lt;span class="k"&gt;ROLLBACK&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Verify that the table was not created&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;information_schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tables&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;table_schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'public'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'users'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;-- Should return no rows, as the transaction was rolled back&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The 2nd example demonstrates how PostgreSQL allows partial rollbacks using &lt;code&gt;SAVEPOINT&lt;/code&gt;, giving developers fine-grained control over schema changes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;BEGIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Create a table&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Create a savepoint&lt;/span&gt;
&lt;span class="n"&gt;SAVEPOINT&lt;/span&gt; &lt;span class="n"&gt;after_users_table&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Alter the table to add a column&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="k"&gt;COLUMN&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Oops! We only want to roll back the column addition&lt;/span&gt;
&lt;span class="k"&gt;ROLLBACK&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="n"&gt;after_users_table&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Add a different column instead&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="k"&gt;COLUMN&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt; &lt;span class="nb"&gt;BOOLEAN&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;TRUE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Commit the transaction&lt;/span&gt;
&lt;span class="k"&gt;COMMIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  MySQL 8
&lt;/h3&gt;

&lt;p&gt;In this MySQL example, despite wrapping the DDL statements in a transaction block, the &lt;code&gt;ROLLBACK&lt;/code&gt; command does not undo the table creation. This is because each DDL statement implicitly commits the transaction before executing, making it impossible to roll back multiple DDL statements as a unit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Try to use a transaction block (note: this won't work as expected for DDL)&lt;/span&gt;
&lt;span class="k"&gt;START&lt;/span&gt; &lt;span class="n"&gt;TRANSACTION&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Create a simple table&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Add an index&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_username&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Try to roll back all changes (won't work for DDL statements)&lt;/span&gt;
&lt;span class="k"&gt;ROLLBACK&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Verify that the table was created despite the ROLLBACK&lt;/span&gt;
&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;TABLES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;-- Will show 'users' table&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, MySQL 8 does provide statement-level atomicity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- This will either create all users or none&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="s1"&gt;'user1'&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;'localhost'&lt;/span&gt; &lt;span class="n"&gt;IDENTIFIED&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="s1"&gt;'password1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="s1"&gt;'user2'&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;'localhost'&lt;/span&gt; &lt;span class="n"&gt;IDENTIFIED&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="s1"&gt;'password2'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- This will either drop all tables or none&lt;/span&gt;
&lt;span class="k"&gt;DROP&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;table1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;table2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;table3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Let's examine the key differences between PostgreSQL 17 and MySQL 8 in how they handle DDL transactions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;PostgreSQL 17&lt;/th&gt;
&lt;th&gt;MySQL 8&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DDL Transaction Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full transactional DDL&lt;/td&gt;
&lt;td&gt;Atomic DDL (statement-level only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-statement DDL Transactions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DDL Rollback in Transaction&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No (implicit commit)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Atomicity of Single DDL Statement&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes (InnoDB only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Crash Recovery&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full transaction recovery&lt;/td&gt;
&lt;td&gt;Statement-level recovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Savepoints with DDL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Not supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exceptions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Database and tablespace operations&lt;/td&gt;
&lt;td&gt;Database directory removal not part of atomic operation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Implementation Mechanism&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Write-Ahead Log (WAL)&lt;/td&gt;
&lt;td&gt;DDL_LOG in InnoDB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;PostgreSQL's transactional DDL provides a higher level of safety for complex schema migrations. By wrapping multiple related changes in a transaction, administrators can ensure that the database remains in a consistent state, even if something goes wrong during the migration process. In contrast, MySQL 8 introduces atomic DDL at the statement level, meaning each individual DDL statement is executed as an all-or-nothing operation. While this is a notable improvement over earlier versions of MySQL, it still does not support multi-statement DDL transactions.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;PostgreSQL Wiki: &lt;a href="https://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis" rel="noopener noreferrer"&gt;Transactional DDL in PostgreSQL: A Competitive Analysis&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;MySQL Documentation: &lt;a href="https://dev.mysql.com/doc/refman/8.4/en/atomic-ddl.html" rel="noopener noreferrer"&gt;Atomic Data Definition Statement Support&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;MySQL Blog: &lt;a href="https://dev.mysql.com/blog-archive/atomic-ddl-in-mysql-8-0/" rel="noopener noreferrer"&gt;Atomic DDL in MySQL 8.0&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;MySQL Documentation: &lt;a href="https://dev.mysql.com/doc/refman/8.2/en/cannot-roll-back.html" rel="noopener noreferrer"&gt;Statements That Cannot Be Rolled Back&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>postgres</category>
      <category>mysql</category>
      <category>sql</category>
      <category>database</category>
    </item>
    <item>
      <title>PlanetScale vs. ⚔ Neon: the Continued Saga between MySQL 🐬 and PostgreSQL 🐘</title>
      <dc:creator>Ayra Jett</dc:creator>
      <pubDate>Tue, 27 May 2025 08:26:30 +0000</pubDate>
      <link>https://dev.to/bytebase/planetscale-vs-neon-the-continued-saga-between-mysql-and-postgresql-39c</link>
      <guid>https://dev.to/bytebase/planetscale-vs-neon-the-continued-saga-between-mysql-and-postgresql-39c</guid>
      <description>&lt;p&gt;This is a series of articles between MySQL and PostgreSQL:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/blog/postgres-vs-mysql"&gt;MySQL vs. Postgres&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PlanetScale vs. Neon (this one)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/blog/tidb-vs-cockroachdb"&gt;TiDB vs. CockroachDB&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;blockquote&gt;
&lt;p&gt;On May 14, 2025, Databricks has &lt;a href="https://www.databricks.com/blog/databricks-neon" rel="noopener noreferrer"&gt;announced&lt;/a&gt; to acquire Neon.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The last 2 years Stack Overflow survey (&lt;a href="https://survey.stackoverflow.co/2024/technology/#1-databases" rel="noopener noreferrer"&gt;2024&lt;/a&gt;, &lt;a href="https://survey.stackoverflow.co/2023/#most-popular-technologies-database" rel="noopener noreferrer"&gt;2023&lt;/a&gt; shows that PostgreSQL has taken over the first place spot from MySQL and become the most admired, desired database.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4eikmixwe5m1076xky0v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4eikmixwe5m1076xky0v.png" alt="Image description" width="800" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It seems that the love-hate relationship between MySQL and PostgreSQL will never end. From vanilla MySQL vs. PostgreSQL, to distributed TiDB vs. CockroachDB, to cloud-native AWS Aurora vs. GCP AlloyDB, and now we are entering the next chapter, the serverless, developer-oriented PlanetScale vs. Neon.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4weslf86n4n94yt0pkbl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4weslf86n4n94yt0pkbl.png" alt="Image description" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftctntc9319kup9d12zz9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftctntc9319kup9d12zz9.png" alt="Image description" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At Bytebase, we work with the MySQL / PostgreSQL ecosystems extensively. Our founders also build &lt;a href="https://cloud.google.com/sql" rel="noopener noreferrer"&gt;Google Cloud SQL&lt;/a&gt;, one of the largest hosted MySQL &amp;amp; Postgres cloud services.&lt;/p&gt;

&lt;p&gt;Below we give an extensive comparison between PlanetScale and Neon from the following dimensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architecture&lt;/li&gt;
&lt;li&gt;Compatibility&lt;/li&gt;
&lt;li&gt;Developer Workflow&lt;/li&gt;
&lt;li&gt;Reliability&lt;/li&gt;
&lt;li&gt;Scalability&lt;/li&gt;
&lt;li&gt;Operability&lt;/li&gt;
&lt;li&gt;Integration&lt;/li&gt;
&lt;li&gt;Compliance&lt;/li&gt;
&lt;li&gt;Open Source&lt;/li&gt;
&lt;li&gt;Pricing&lt;/li&gt;
&lt;li&gt;Funding&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;PlanetScale is a distributed database based on &lt;a href="https://vitess.io/" rel="noopener noreferrer"&gt;Vitess&lt;/a&gt;. Vitess is a shared-nothing architecture where each shard contains a MySQL primary node and set of replicas. VTGate proxy routes the application request to the respective shard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2p2a7dyzhxdqps84fluf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2p2a7dyzhxdqps84fluf.png" alt="Image description" width="656" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neon is a shared-storage architecture. It separates the compute and storage. The compute part is just normal PostgreSQL server, the storage part is a custom-built multi-tenant storage system shared by all Postgres compute nodes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdjmfuqct8g29bc2kncw0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdjmfuqct8g29bc2kncw0.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Compatibility
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://planetscale.com/docs/reference/mysql-compatibility" rel="noopener noreferrer"&gt;PlanetScale's MySQL compatibility&lt;/a&gt; is constrained.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://vitess.io/docs/15.0/reference/compatibility/mysql-compatibility/" rel="noopener noreferrer"&gt;Underlying Vitess limitations&lt;/a&gt;. Vitess shared-nothing architecture carries inherent compatibility limitations. Features requiring session maintenance or cross-shard coordination are challenging to implement.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Product trade-off. e.g. To support online DDL, PlanetScale disallows foreign keys entirely, which is more strict than Vitess' FK limitation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cloud operating model. No super privilege or LOAD DATA INFILE to access the host file system.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Neon is &lt;a href="https://neon.tech/docs/reference/compatibility" rel="noopener noreferrer"&gt;mostly compatible&lt;/a&gt; with vanilla PostgreSQL.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Neon rebuilds the paging layer and just lightly changes the Postgres codebase. Neon's compatibility is only constrained by its cloud operating model, which are similar to other hosted database services (no superuser or host file system access).&lt;/p&gt;

&lt;h2&gt;
  
  
  Developer Workflow
&lt;/h2&gt;

&lt;p&gt;Both PlanetScale and Neon are targetting developers, and they are telling the same developer workflow story in different ways.&lt;/p&gt;

&lt;p&gt;PlanetScale's story emphasizes the end-to-end experience, from branching, to schema migration, monitoring and revert.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftsrqqcsgxdoobuxwukxk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftsrqqcsgxdoobuxwukxk.png" alt="Image description" width="800" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neon's story highlights the single branching feature. Their purpose-built paging layer has copy-on-write (CoW), which makes branching instantaneous and cost-effective.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkeq81rznliwgkptbw1r8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkeq81rznliwgkptbw1r8.png" alt="Image description" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reliability
&lt;/h2&gt;

&lt;p&gt;Shared-nothing architecture is inherently fault-tolerant as data is sharded and replicated. Vitess is a proven technology used by logos across the globe. PlanetScale has also proved its reliability for not having notable outages for years.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fot36scuv2pdyp2wt37u4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fot36scuv2pdyp2wt37u4.png" alt="Image description" width="800" height="190"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Shared-storage architecture requires more engineering effort to make the logical SPOF storage component fault tolerant. Neon details the work in &lt;a href="https://neon.tech/blog/architecture-decisions-in-neon" rel="noopener noreferrer"&gt;its architecture decisions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As a database trailblazing new architecture, Neon's advantage is it sits on a solid foundation.&lt;br&gt;
PostgreSQL itself is rock solid and fully transactional. Neon's Pageserver approach also aligns perfectly with the WAL-based logging in PostgreSQL. Neon is also able to use Rust, a more suitable system language to implement its storage layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scalability
&lt;/h2&gt;

&lt;p&gt;PlanetScale, as its name suggests, is planet-scale. The shared-nothing architecture grants near-linear scalability &lt;a href="https://planetscale.com/blog/one-million-queries-per-second-with-mysql" rel="noopener noreferrer"&gt;up to 1 million QPS&lt;/a&gt;. The underlying Vitess is originally developed inside YouTube to handle scalability challenges and it's been battle-tested in other large internet companies (&lt;a href="https://slack.engineering/scaling-datastores-at-slack-with-vitess/" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://www.cncf.io/case-studies/jdcom-vitess/" rel="noopener noreferrer"&gt;2&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Neon can not scale as much as PlanetScale. After all, it's a single-node PostgreSQL instance. But this single node can scale up quite well. Neon separates the storage and compute, thus each can scale individually. And in the cloud, storage is infinite, compute is abundant, only the network bandwidth is constrained. The separated architecture also infers elasticity, scale-to-zero is as easy as scale-up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operability
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PlanetScale provides a complete managed database solution. It tries to take care of &lt;a href="https://planetscale.com/blog/all-the-tech-planetscale-replaces" rel="noopener noreferrer"&gt;every aspect of using the database&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg7av24qmnaacm7bt8slz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg7av24qmnaacm7bt8slz.png" alt="Image description" width="800" height="669"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deploy requests&lt;/strong&gt; and &lt;strong&gt;Branches&lt;/strong&gt; for database change workflow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Insights&lt;/strong&gt; for monitoring.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boost&lt;/strong&gt; for speeding up query performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revert&lt;/strong&gt; for reverting the change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Console&lt;/strong&gt; for mysql CLI experience in the browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backup&lt;/strong&gt; for disaster recovery.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's quite a lot to cover and PlanetScale manages to craft every pixel. e.g. &lt;a href="https://planetscale.com/features/boost" rel="noopener noreferrer"&gt;Boost&lt;/a&gt; shows PlanetScale's strength to transform an &lt;a href="https://jon.thesquareplanet.com/papers/phd-thesis.pdf" rel="noopener noreferrer"&gt;academic paper&lt;/a&gt; into a polished product.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9t4pl1g61khno0txvx9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9t4pl1g61khno0txvx9.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Neon is relatively new and provides essentials.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Disaster recovery is provided by its branching feature.&lt;/li&gt;
&lt;li&gt;A visual SQL Editor to interact with the database.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3jk608o7bcck7gft0kra.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3jk608o7bcck7gft0kra.png" alt="Image description" width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The SQL Editor is handy. Here Neon embeds an external view from &lt;a href="https://explain.dalibo.com/" rel="noopener noreferrer"&gt;explain.dalibo.com&lt;/a&gt; to display the query plan. It looks a bit strange visually, but serves the purpose well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration
&lt;/h2&gt;

&lt;p&gt;PlanetScale itself is already a comprehensive database platform. Its &lt;a href="https://planetscale.com/docs" rel="noopener noreferrer"&gt;doc site&lt;/a&gt; also lists a handful of standard database integrations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Application frameworks from major languages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Monitoring with Datadog.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data transfer via Airbyte, Stitch, Hightouch.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neon hasn't accumulated many standard database integrations yet. But Neon's unique capabilities unlock new integration frontiers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.snaplet.dev/tutorials/neon/" rel="noopener noreferrer"&gt;Snaplet&lt;/a&gt; uses Neon to instantaneously prepare production database snapshots for the testing environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://neon.tech/blog/neon-replit-integration" rel="noopener noreferrer"&gt;Replit&lt;/a&gt; leverages Neon's scale-to-zero to offer its users a minimum-cost database service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://neon.tech/blog/neon-vercel-integration" rel="noopener noreferrer"&gt;Vercel&lt;/a&gt; pairs with Neon's database branching to provide a realistic preview deployment in minutes instead of hours.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compliance
&lt;/h2&gt;

&lt;p&gt;PlanetScale has &lt;a href="https://planetscale.com/docs/concepts/security" rel="noopener noreferrer"&gt;SOC2 Type 2 and HIPAA&lt;/a&gt;. Neon has completed &lt;a href="https://neon.tech/docs/security/security-overview" rel="noopener noreferrer"&gt;SOC2 Type 2&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source
&lt;/h2&gt;

&lt;p&gt;PlanetScale and Neon choose an identical strategy, open soucing their database codebase under the same liberal license and only charging the cloud service.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://star-history.com/#planetscale/beam&amp;amp;vitessio/vitess&amp;amp;neondatabase/neon&amp;amp;Date" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fep8pv260k07toxlrwh1t.png" alt="Image description" width="800" height="557"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PlanetScale is based on a &lt;a href="https://github.com/planetscale/vitess" rel="noopener noreferrer"&gt;Vitess fork&lt;/a&gt; under Apache-2.0. The team once built &lt;a href="https://github.com/github/gh-ost" rel="noopener noreferrer"&gt;gh-ost&lt;/a&gt;, the best online schema migration tool for MySQL and probably among all open source RDBMS. They also open sourced &lt;a href="https://github.com/planetscale/beam" rel="noopener noreferrer"&gt;beam&lt;/a&gt;, a message board web app to showcase PlanetScale.&lt;/p&gt;

&lt;p&gt;Neon also &lt;a href="https://github.com/neondatabase/neon" rel="noopener noreferrer"&gt;open sources&lt;/a&gt; its entire database codebase under Apache-2.0 license.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;PlanetScale employs a usage-based pricing on row reads/writes. This is atypical for a database service and raises &lt;a href="https://news.ycombinator.com/item?id=30457960" rel="noopener noreferrer"&gt;controversy&lt;/a&gt;. On one hand, it brings extra incentive for people to optimize queries, on the other hand, bad queries are inevitable and MySQL query optimizer is also &lt;a href="https://news.ycombinator.com/item?id=29455852" rel="noopener noreferrer"&gt;flawed&lt;/a&gt;. To offset this concern, PlanetScale recently introduced a new &lt;a href="https://planetscale.com/blog/announcing-scaler-pro" rel="noopener noreferrer"&gt;Scaler Pro tier&lt;/a&gt; for unlimited row reads/writes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flh9rshrvzuewx8uplw8g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flh9rshrvzuewx8uplw8g.png" alt="Image description" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neon offers a usage-based pricing based on 4 metrics: &lt;strong&gt;active compute time&lt;/strong&gt;, &lt;strong&gt;data storage&lt;/strong&gt;, &lt;strong&gt;data transfer out&lt;/strong&gt; and &lt;strong&gt;data written&lt;/strong&gt;. This pricing model is more traditional and predictable. Neon also provides a pricing calculator to estimate the cost.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbi41jd4qlj577g0yclkp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbi41jd4qlj577g0yclkp.png" alt="Image description" width="800" height="636"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Funding
&lt;/h2&gt;

&lt;p&gt;Both are well-funded companies led by industry veterans. PlanetScale has raised $105M so far, while Neon nabs $103M (including a very recent &lt;a href="https://neon.tech/blog/series-b-funding" rel="noopener noreferrer"&gt;$46M series B&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  PlanetScale or Neon
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;PlanetScale&lt;/th&gt;
&lt;th&gt;Neon&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Architecture&lt;/td&gt;
&lt;td&gt;Shared-nothing, sharded compute and storage unit&lt;/td&gt;
&lt;td&gt;Shared-storage, separated compute and storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compatibility&lt;/td&gt;
&lt;td&gt;Limited by the underlying shared-nothing architecture&lt;/td&gt;
&lt;td&gt;Near-compatible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer Workflow&lt;/td&gt;
&lt;td&gt;End-to-end experience&lt;/td&gt;
&lt;td&gt;Instantaneous and cost-effective branching&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reilability&lt;/td&gt;
&lt;td&gt;Proven technology with track record&lt;/td&gt;
&lt;td&gt;New architecture on a solid foundation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalability&lt;/td&gt;
&lt;td&gt;Scale out to near infinite&lt;/td&gt;
&lt;td&gt;Scale up to an extent, scale-to-zero elasticity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operability&lt;/td&gt;
&lt;td&gt;Comprehensive, polished tooling&lt;/td&gt;
&lt;td&gt;Essential, pragmatic tooling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integration&lt;/td&gt;
&lt;td&gt;Typical database integrations&lt;/td&gt;
&lt;td&gt;Novel integrations enabled by instant branching and elasticity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compliance&lt;/td&gt;
&lt;td&gt;SOC 2 Type 2, HIPAA&lt;/td&gt;
&lt;td&gt;SOC2 Type 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open Source&lt;/td&gt;
&lt;td&gt;Close-sourced paid cloud service; Open-sourced database under Apache-2.0&lt;/td&gt;
&lt;td&gt;Close-sourced paid cloud service; Open-sourced database under Apache-2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing&lt;/td&gt;
&lt;td&gt;Row reads/writes + storage + HA&lt;/td&gt;
&lt;td&gt;Computation + storage + data transfer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funding&lt;/td&gt;
&lt;td&gt;$105M&lt;/td&gt;
&lt;td&gt;$103M&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Overall, PlanetScale provides a cohesive experience for every database task. Originally, it was a hosted MySQL-compatible Vitess service only for hyperscalers. Since &lt;a href="https://planetscale.com/blog/announcing-planetscale-the-database-for-developers" rel="noopener noreferrer"&gt;pivoting to developers&lt;/a&gt;, PlanetScale has transformed into an advanced serverless database platform that happens to speak the MySQL dialect.&lt;/p&gt;

&lt;p&gt;Neon debuted later, and has a very similar value proposition as the new PlanetScale. Unlike PlanetScale, Neon knows its targeting audiences from day 1, and purposefully builds the technology catering to them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Git-like branch management, in particular, the instant branching including both schema and data.&lt;/li&gt;
&lt;li&gt;Serverless database with autoscaling up and down.&lt;/li&gt;
&lt;li&gt;Embrace the rise of Postgres and maintain near-perfect Postgres compatibility.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Beyond PlanetScale and Neon
&lt;/h2&gt;

&lt;p&gt;Today, when choosing the database system for your next project, the very first thing to consider is no longer between &lt;a href="https://dev.to/blog/postgres-vs-mysql"&gt;Postgres vs. MySQL&lt;/a&gt;. Instead, it's whether to choose&lt;br&gt;
RDBMS or other genres. RDBMS still dominates the database market by shares, however, ironically, this space doesn't advance as much as other database segments in the cloud era. Customers do have &lt;a href="https://dev.to/blog/database-as-a-service-dbaas-provider/"&gt;a plethora of choices&lt;/a&gt;, but none is coming close to MongoDB Altas for NoSQL&lt;br&gt;
or Snowflake for OLAP.&lt;/p&gt;

&lt;p&gt;PlanetScale and Neon are similar to each other, they are also similar to MongoDB / Snowflake:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Like MongoDB, PlanetScale uses shared-nothing architecture, provides&lt;br&gt;
a comprehensive database platform, is developer obsessed, and tells great product stories.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Like Snowflake, Neon brings the novel shared-storage approach to the staggering OLTP architecture, uses Postgres dialect, and also values developer experience.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both PlanetScale and Neon could become the next MongoDB / Snowflake for modern RDBMS database-as-a-service (DBaaS). We've all been waiting too long for this.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A side note: PlanetScale has shifted its website art direction to a simplistic style, marking another drastic difference from Neon.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7jf0htbsvob2ev7u3d82.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7jf0htbsvob2ev7u3d82.png" alt="Image description" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftto9b2zhntnaf766tfc2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftto9b2zhntnaf766tfc2.png" alt="Image description" width="800" height="638"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;BTW, if you still stick with vanilla MySQL/Postgres and want PlanetScale's database change workflow or Neon's visual SQL Editor, please check out &lt;a href="https://dev.to/"&gt;Bytebase&lt;/a&gt;. Bytebase is a database tool for all mainstream databases, covering database change, query, security and governance all-in-one. It provides more customizable &lt;a href="https://dev.to/docs/change-database/change-workflow/"&gt;change workflow&lt;/a&gt; and visual &lt;a href="https://dev.to/docs/sql-editor/overview/"&gt;SQL Editor&lt;/a&gt; integrated with &lt;a href="https://dev.to/docs/security/database-permission/overview/"&gt;access control&lt;/a&gt; and &lt;a href="https://dev.to/docs/security/data-masking/overview/"&gt;data masking&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftbhkqzwf4fuz3vc23jn6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftbhkqzwf4fuz3vc23jn6.png" alt="Image description" width="800" height="608"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Further Readings
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://planetscale.com/blog/announcing-planetscale-the-database-for-developers" rel="noopener noreferrer"&gt;Announcing PlanetScale: The database for developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://planetscale.com/blog/all-the-tech-planetscale-replaces" rel="noopener noreferrer"&gt;All of the tech PlanetScale replaces&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://planetscale.com/blog/one-million-queries-per-second-with-mysql" rel="noopener noreferrer"&gt;One million queries per second with MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=31536827" rel="noopener noreferrer"&gt;Neon – Serverless Postgres&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://neon.tech/blog/architecture-decisions-in-neon" rel="noopener noreferrer"&gt;Architecture decisions in Neon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/blog/database-as-a-service-dbaas-provider/"&gt;Database as a Service (DBaaS) Provider&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Other Comparisons
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/blog/postgres-vs-mysql"&gt;Postgres vs. MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/blog/mysql-vs-mariadb"&gt;MySQL vs. MariaDB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/blog/postgres-vs-mongodb"&gt;Postgres vs. MongoDB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/blog/neon-vs-supabase"&gt;Neon vs. Supabase&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>sql</category>
      <category>mysql</category>
      <category>postgres</category>
      <category>database</category>
    </item>
    <item>
      <title>What's New 🆕🤯 in PostgreSQL 18 🐘 - a DBA's Perspective</title>
      <dc:creator>Ayra Jett</dc:creator>
      <pubDate>Tue, 20 May 2025 08:27:19 +0000</pubDate>
      <link>https://dev.to/bytebase/whats-new-in-postgresql-18-a-dbas-perspective-2bp6</link>
      <guid>https://dev.to/bytebase/whats-new-in-postgresql-18-a-dbas-perspective-2bp6</guid>
      <description>&lt;p&gt;PostgreSQL just announced &lt;a href="https://www.postgresql.org/about/news/postgresql-18-beta-1-released-3070/" rel="noopener noreferrer"&gt;18 beta 1&lt;/a&gt; on May 8, 2025. While some features may still be dropped, it's worth taking a look.&lt;/p&gt;

&lt;h2&gt;
  
  
  Asynchronous I/O
&lt;/h2&gt;

&lt;p&gt;PostgreSQL 18 introduces a significant enhancement under the hood with its new asynchronous I/O (AIO) subsystem. According to the official release notes, this feature is designed to increase I/O throughput and to hide I/O latency. It can be enabled via the &lt;code&gt;io_method&lt;/code&gt; server variable. For Linux users, this means &lt;strong&gt;io_uring&lt;/strong&gt; can be leveraged, while a worker-based implementation is available for all platforms. The initial implementation focuses on file system reads, including sequential scans, bitmap heap scans, and vacuums. A new system view, &lt;code&gt;pg_aios&lt;/code&gt;, will also be available to show file handles used for AIO.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DBA Note:&lt;/strong&gt; Finally, AIO! The promise of 2-3x performance improvements on certain reads sounds fantastic (could be true for cloud databases that use network-attached disks). Just remember, it's initially for reads – don't expect your write-heavy OLTP to magically speed up overnight. Still, a giant step forward, if it doesn't introduce a new class of I/O-related bugs for us to chase.&lt;/p&gt;

&lt;h2&gt;
  
  
  UUIDv7
&lt;/h2&gt;

&lt;p&gt;For developers working with distributed systems or requiring globally unique, sortable identifiers, PostgreSQL 18 brings native support for UUIDv7. As highlighted in the PostgreSQL 18 Beta 1 release announcement, the new &lt;code&gt;uuidv7()&lt;/code&gt; function allows for the generation of timestamp-ordered UUIDs. This is a significant improvement over traditional UUIDs (like UUIDv4, for which &lt;code&gt;uuidv4()&lt;/code&gt; is now an alias for &lt;code&gt;gen_rand_uuid()&lt;/code&gt;) when it comes to database performance, particularly for indexing and caching strategies, as the time-ordered nature can lead to better data locality and reduced page splits in B-tree indexes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DBA Note:&lt;/strong&gt; So now our primary keys can be both globally unique AND play nice with indexes. Better late than never.&lt;/p&gt;

&lt;h2&gt;
  
  
  Improved EXPLAIN
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;EXPLAIN&lt;/code&gt; command is a DBA's best friend (and sometimes worst enemy) when it comes to understanding query performance. PostgreSQL 18 brings several welcome improvements to its output, making it even more insightful. According to the release notes, &lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt; will now automatically include &lt;code&gt;BUFFERS&lt;/code&gt; output, saving us an extra keyword. Furthermore, &lt;code&gt;EXPLAIN ANALYZE VERBOSE&lt;/code&gt; will be enhanced to show WAL (Write-Ahead Logging) usage, CPU statistics, and average read statistics. There's also the addition of full WAL buffer count to &lt;code&gt;EXPLAIN (WAL)&lt;/code&gt;, &lt;code&gt;VACUUM/ANALYZE (VERBOSE)&lt;/code&gt;, and autovacuum log output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DBA Note:&lt;/strong&gt; Maybe, just maybe, more developers will actually look at buffer usage now. The WAL, CPU, and average read stats in VERBOSE are useful for those really deep dives. And another autovacuum metric to obsess over when trying to figure out why autovacuum isn't keeping up.&lt;/p&gt;

&lt;h2&gt;
  
  
  NOT NULL Constraints as NOT VALID
&lt;/h2&gt;

&lt;p&gt;PostgreSQL 18 introduces another welcome improvement to schema management with the ability to add &lt;code&gt;NOT NULL&lt;/code&gt; constraints as &lt;code&gt;NOT VALID&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This feature allows users to add &lt;code&gt;NOT NULL&lt;/code&gt; constraints without immediately scanning the entire table, and then validate them later without holding an &lt;code&gt;ACCESS EXCLUSIVE&lt;/code&gt; lock. This is particularly valuable for large tables where adding constraints traditionally required significant downtime.&lt;/p&gt;

&lt;p&gt;The new syntax requires using a named constraint approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt; &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="k"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="k"&gt;constraint_name&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;column&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;VALID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Later, when it's convenient, you can validate the constraint with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt; &lt;span class="n"&gt;VALIDATE&lt;/span&gt; &lt;span class="k"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="k"&gt;constraint_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;During validation, PostgreSQL only holds a &lt;code&gt;ShareUpdateExclusiveLock&lt;/code&gt;, which means normal operations like SELECT, INSERT, UPDATE, and DELETE can continue working while the validation process runs.&lt;/p&gt;

&lt;p&gt;Even when a &lt;code&gt;NOT NULL&lt;/code&gt; constraint is added as &lt;code&gt;NOT VALID&lt;/code&gt;, it still prevents new &lt;code&gt;NULL&lt;/code&gt; values from being inserted into the column. This provides immediate data integrity for new rows while allowing time to clean up any existing &lt;code&gt;NULL&lt;/code&gt; values at your convenience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DBA Note:&lt;/strong&gt; This is a godsend for those of us managing large production databases where downtime is measured in dollars per second. No more scheduling 3 AM maintenance windows just to add a NOT NULL constraint to that 10TB table. The fact that it still prevents new NULLs while being marked as invalid is the perfect balance – forward data integrity without the immediate validation pain.&lt;/p&gt;

&lt;h2&gt;
  
  
  OLD/NEW values in RETURNING
&lt;/h2&gt;

&lt;p&gt;Previously, RETURNING had limitations: it typically returned new values for INSERT and UPDATE, and old values for DELETE. MERGE operations would return values based on the internal query executed. The new syntax is more flexible, allowing INSERT ON CONFLICT to return old values, UPDATE to return old values (previously only new), and DELETE to potentially return new values if an ON DELETE row assignment would produce them. This is facilitated by changeable relation aliases "old" and "new" to specify which values are desired.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DBA Note:&lt;/strong&gt; This simplifies some application logic and reduce the need for those clunky separate SELECT statements or trigger acrobatics just to get the before-and-after picture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Virtual generated column
&lt;/h2&gt;

&lt;p&gt;PostgreSQL 18 changes how generated columns can be handled, making virtual generated columns the default. As per the release notes, these columns compute their values "when the columns are read, not written." This is a departure from the traditional STORED generated columns, though the STORED option remains available if explicit write-time computation and storage are needed. The PostgreSQL 18 Beta 1 announcement also mentions that stored generated columns can now be logically replicated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DBA Note:&lt;/strong&gt; This could save a fair bit of disk space and write overhead for columns that are derived from others and don't need to be physically stored. Think of all those concatenated full names or simple calculations. The trade-off, of course, is compute-on-read, so queries accessing these virtual columns might see a slight performance hit, especially if the generation logic is complex. The fact that stored ones can now be logically replicated is a nice, sensible addition though.&lt;/p&gt;

&lt;h2&gt;
  
  
  Major version upgrade experience
&lt;/h2&gt;

&lt;p&gt;Upgrading a major PostgreSQL version can be a source of anxiety for many DBAs. PostgreSQL 18 aims to smooth out this process with several notable improvements. While the standard methods of &lt;code&gt;pg_dumpall&lt;/code&gt; followed by a restore, or using &lt;code&gt;pg_upgrade&lt;/code&gt;, or logical replication remain the primary paths for migration, there are enhancements to make these less painful.&lt;/p&gt;

&lt;p&gt;The PostgreSQL 18 Beta 1 announcement highlights a significant improvement: the ability to keep planner statistics through a major version upgrade. This is a big deal, as it means your newly upgraded cluster can reach its expected performance state much faster, without waiting for a potentially lengthy &lt;code&gt;ANALYZE&lt;/code&gt; run across all your data. Additionally, &lt;code&gt;pg_upgrade&lt;/code&gt; itself has received performance boosts, including parallel processing of its checks (via the&lt;code&gt;--jobs&lt;/code&gt; flag) and a new &lt;code&gt;--swap&lt;/code&gt; flag to swap upgrade directories instead of copying, which can be a massive time saver for large installations.&lt;/p&gt;

&lt;p&gt;Of course, with any major version, there are compatibility changes to be aware of. The release notes for version 18 list several, including changes to time zone abbreviation handling, the deprecation of MD5 password authentication (finally!), changes to how &lt;code&gt;VACUUM&lt;/code&gt; and &lt;code&gt;ANALYZE&lt;/code&gt; handle inheritance, and modifications to &lt;code&gt;COPY FROM&lt;/code&gt; behavior regarding end-of-file markers. It's crucial to review these incompatibilities thoroughly before planning an upgrade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DBA Note:&lt;/strong&gt; Anything to reduce that terrifying maintenance window during upgrade is welcome. But the list of "incompatibilities" is still there, waiting to trip up the unwary. Anyway, DBAs will still need to read the fine print, test exhaustively in staging, and have a solid rollback plan. Upgrades are still where DBAs earn their hazard pay.&lt;/p&gt;

</description>
      <category>sql</category>
      <category>postgres</category>
      <category>database</category>
      <category>productivity</category>
    </item>
    <item>
      <title>PostgreSQL 🐘 Hosting Options in 2025: Pricing Comparison 💸⚖️</title>
      <dc:creator>Ayra Jett</dc:creator>
      <pubDate>Tue, 13 May 2025 06:27:45 +0000</pubDate>
      <link>https://dev.to/bytebase/postgresql-hosting-options-in-2025-pricing-comparison-pag</link>
      <guid>https://dev.to/bytebase/postgresql-hosting-options-in-2025-pricing-comparison-pag</guid>
      <description>&lt;p&gt;PostgreSQL remains a top choice for relational databases in 2025 due to its reliability, extensibility, and active open-source community. With many hosting options available, choosing the right provider is key to balancing performance, scalability, and cost.&lt;/p&gt;

&lt;p&gt;This article compares PostgreSQL hosting solutions from major clouds (AWS, GCP, Azure) and specialized providers (DigitalOcean, Aiven, Neon, Supabase, Timescale, Heroku), focusing on pricing models and key cost factors to help you make an informed decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Pricing Models
&lt;/h2&gt;

&lt;p&gt;Before comparing providers, it’s important to understand the main cloud database pricing models:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instance-Based:&lt;/strong&gt; Pay hourly for fixed vCPU/RAM; storage and I/O billed separately. Common with major clouds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usage-Based/Serverless:&lt;/strong&gt; Pay only for what you use — compute, storage, I/O, and data transfer. Ideal for variable workloads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tiered Plans:&lt;/strong&gt; Fixed-price bundles from specialized providers offer predictable costs but less flexibility.&lt;/p&gt;

&lt;p&gt;Most providers mix these models, with key cost factors including compute, storage, data transfer, backups, and high availability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparison Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Entry-Level (Monthly)&lt;/th&gt;
&lt;th&gt;Mid-Range (Monthly)&lt;/th&gt;
&lt;th&gt;Enterprise-Level (Monthly)&lt;/th&gt;
&lt;th&gt;Free Tier Available&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS RDS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$12.41 (db.t4g.micro: 2 vCPU, 1 GiB)&lt;/td&gt;
&lt;td&gt;$99.28 (db.m6g.large: 2 vCPU, 8 GiB)&lt;/td&gt;
&lt;td&gt;$794.24 (db.m6g.4xlarge: 16 vCPU, 64 GiB)&lt;/td&gt;
&lt;td&gt;Yes (12 months)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Aurora&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$59.86 (db.t4g.medium: 2 vCPU, 4 GiB)&lt;/td&gt;
&lt;td&gt;$211.70 (db.r6g.large: 2 vCPU, 16 GiB)&lt;/td&gt;
&lt;td&gt;$1,693.60 (db.r6g.4xlarge: 16 vCPU, 128 GiB)&lt;/td&gt;
&lt;td&gt;Yes (12 months)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Cloud SQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$11.32 (db-f1-micro: 0.2 vCPU, 0.6 GiB)&lt;/td&gt;
&lt;td&gt;$122.49 (db-n1-standard-2: 2 vCPU, 7.5 GiB)&lt;/td&gt;
&lt;td&gt;$980.03 (db-n1-standard-16: 16 vCPU, 60 GiB)&lt;/td&gt;
&lt;td&gt;Yes ($300/90 days)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google AlloyDB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$143.68 (2 vCPU, 16 GiB)&lt;/td&gt;
&lt;td&gt;$301.44 (4 vCPU, 32 GiB)&lt;/td&gt;
&lt;td&gt;$1,209.60 (16 vCPU, 128 GiB)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Azure PostgreSQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$14.60 (B1ms: 1 vCPU, 2 GiB)&lt;/td&gt;
&lt;td&gt;$99.28 (GP_Gen5_4: 4 vCPU, 16 GiB)&lt;/td&gt;
&lt;td&gt;$794.24 (GP_Gen5_32: 32 vCPU, 128 GiB)&lt;/td&gt;
&lt;td&gt;Yes (12 months)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DigitalOcean&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$15.00 (1 vCPU, 1 GiB)&lt;/td&gt;
&lt;td&gt;$60.00 (2 vCPU, 4 GiB)&lt;/td&gt;
&lt;td&gt;$244.00 (6 vCPU, 16 GiB)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Aiven&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free (2 vCPU, 1 GiB)&lt;/td&gt;
&lt;td&gt;$110 (4 vCPU, 8 GiB)&lt;/td&gt;
&lt;td&gt;$435 (8 vCPU, 16 GiB)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Neon&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free (1 vCPU, 1 GiB)&lt;/td&gt;
&lt;td&gt;$59 (2 vCPU, 4 GiB)&lt;/td&gt;
&lt;td&gt;$299 (8 vCPU, 16 GiB)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Supabase&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free (1 vCPU, 0.5 GiB)&lt;/td&gt;
&lt;td&gt;$25 (2 vCPU, 1 GiB)&lt;/td&gt;
&lt;td&gt;$99 (4 vCPU, 8 GiB)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Timescale&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free (1 vCPU, 1 GiB)&lt;/td&gt;
&lt;td&gt;$89 (2 vCPU, 4 GiB)&lt;/td&gt;
&lt;td&gt;$499 (8 vCPU, 16 GiB)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Heroku Postgres&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free (0.5 vCPU, 512 MiB)&lt;/td&gt;
&lt;td&gt;$50 (1 vCPU, 1 GiB)&lt;/td&gt;
&lt;td&gt;$500+ (8 vCPU, 16 GiB)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Major Cloud Providers: The Big Three
&lt;/h2&gt;

&lt;p&gt;The top public clouds — &lt;strong&gt;AWS&lt;/strong&gt;, &lt;strong&gt;Google Cloud&lt;/strong&gt;, and &lt;strong&gt;Azure&lt;/strong&gt; — offer powerful managed PostgreSQL services. They provide flexibility and performance, but with complex pricing models.&lt;/p&gt;

&lt;h3&gt;
  
  
  AWS
&lt;/h3&gt;

&lt;p&gt;AWS offers two primary managed PostgreSQL options: Amazon RDS for PostgreSQL and Amazon Aurora (PostgreSQL-compatible edition).&lt;/p&gt;

&lt;h4&gt;
  
  
  RDS for PostgreSQL
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: Instance-based (e.g., &lt;code&gt;db.t3.micro&lt;/code&gt;, &lt;code&gt;db.m6g.large&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Storage&lt;/strong&gt;: gp3 (scalable) or io1/io2 (high-performance)&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;High Availability&lt;/strong&gt;: Multi-AZ; doubles instance cost&lt;/li&gt;
&lt;li&gt;💾 &lt;strong&gt;Backups&lt;/strong&gt;: Free up to DB size; extra charged per GB-month&lt;/li&gt;
&lt;li&gt;🧮 &lt;strong&gt;Discounts&lt;/strong&gt;: Reserved Instances, Savings Plans&lt;/li&gt;
&lt;li&gt;💵 &lt;strong&gt;Entry Point&lt;/strong&gt;: Very low (e.g., &lt;code&gt;db.t3.micro&lt;/code&gt; + minimal storage)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Aurora PostgreSQL-Compatible
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: Cluster-based, compute + storage + I/O billed separately&lt;/li&gt;
&lt;li&gt;⚙️ &lt;strong&gt;Compute&lt;/strong&gt;: Per instance-hour or per ACU-hour (Serverless v2)&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Storage&lt;/strong&gt;: Auto-scaling, charged per GB-month&lt;/li&gt;
&lt;li&gt;🔁 &lt;strong&gt;I/O&lt;/strong&gt;: Pay-per-request (Standard) or free (I/O-Optimized)&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;High Availability&lt;/strong&gt;: Built-in, cross-AZ replication&lt;/li&gt;
&lt;li&gt;💾 &lt;strong&gt;Backups&lt;/strong&gt;: Continuous to S3&lt;/li&gt;
&lt;li&gt;💵 &lt;strong&gt;Entry Point&lt;/strong&gt;: Higher than RDS; designed for heavier workloads&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Google Cloud
&lt;/h3&gt;

&lt;p&gt;GCP provides two main managed PostgreSQL offerings: the standard Cloud SQL for PostgreSQL and the higher-performance AlloyDB for PostgreSQL.&lt;/p&gt;

&lt;h4&gt;
  
  
  Cloud SQL for PostgreSQL
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: Instance-based (&lt;code&gt;db-f1-micro&lt;/code&gt;, &lt;code&gt;db-n1-standard-2&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;⚙️ &lt;strong&gt;Compute&lt;/strong&gt;: Billed per vCPU + RAM hour&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Storage&lt;/strong&gt;: SSD or HDD, per GB-month&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;High Availability&lt;/strong&gt;: Regional standby; doubles cost&lt;/li&gt;
&lt;li&gt;💾 &lt;strong&gt;Backups&lt;/strong&gt;: Charged per GB-month&lt;/li&gt;
&lt;li&gt;🧮 &lt;strong&gt;Discounts&lt;/strong&gt;: Committed Use Discounts (CUDs)&lt;/li&gt;
&lt;li&gt;💵 &lt;strong&gt;Entry Point&lt;/strong&gt;: Very low (&lt;code&gt;db-f1-micro&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  AlloyDB for PostgreSQL
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: Cluster-based with separate compute + storage&lt;/li&gt;
&lt;li&gt;⚙️ &lt;strong&gt;Compute&lt;/strong&gt;: Per vCPU + RAM hour&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Storage&lt;/strong&gt;: Auto-scaling, includes I/O&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;High Availability&lt;/strong&gt;: Built-in, 99.99% SLA&lt;/li&gt;
&lt;li&gt;💾 &lt;strong&gt;Backups&lt;/strong&gt;: Continuous with PITR&lt;/li&gt;
&lt;li&gt;💵 &lt;strong&gt;Entry Point&lt;/strong&gt;: Higher (min: 2 vCPU, 16 GiB RAM)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Microsoft Azure
&lt;/h3&gt;

&lt;p&gt;Azure's primary offering for managed PostgreSQL is Azure Database for PostgreSQL, available in different deployment models. The recommended and most versatile option is the Flexible Server model.&lt;/p&gt;

&lt;h4&gt;
  
  
  PostgreSQL Flexible Server
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: Compute + Storage&lt;/li&gt;
&lt;li&gt;⚙️ &lt;strong&gt;Tiers&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Burstable&lt;/strong&gt;: Low-cost (e.g., B1ms: 1 vCPU, 2 GiB RAM)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;General Purpose&lt;/strong&gt;: Balanced (D-series)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Optimized&lt;/strong&gt;: For in-memory workloads (E-series)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;📦 &lt;strong&gt;Storage&lt;/strong&gt;: Per GB-month with baseline and optional IOPS&lt;/li&gt;

&lt;li&gt;🛡️ &lt;strong&gt;High Availability&lt;/strong&gt;: Optional zone-redundant (doubles cost)&lt;/li&gt;

&lt;li&gt;💾 &lt;strong&gt;Backups&lt;/strong&gt;: Configurable, per GB-month&lt;/li&gt;

&lt;li&gt;🧮 &lt;strong&gt;Discounts&lt;/strong&gt;: Reserved Capacity (up to 70% off compute)&lt;/li&gt;

&lt;li&gt;💵 &lt;strong&gt;Entry Point&lt;/strong&gt;: Very low (B-series)&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Specialized Managed PostgreSQL Providers
&lt;/h2&gt;

&lt;p&gt;Beyond the big three cloud providers, numerous companies offer specialized managed PostgreSQL hosting. These often focus on developer experience, specific features (like serverless or time-series), or simplified pricing, sometimes building on top of the major cloud infrastructure.&lt;/p&gt;

&lt;h3&gt;
  
  
  DigitalOcean
&lt;/h3&gt;

&lt;p&gt;DigitalOcean offers Managed Databases for PostgreSQL, focusing on simplicity and predictable pricing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💰 &lt;strong&gt;Model&lt;/strong&gt;: Tiered monthly plans&lt;/li&gt;
&lt;li&gt;💵 &lt;strong&gt;Entry Point&lt;/strong&gt;: $15/month (1 vCPU, 1 GiB RAM, 10 GB SSD)&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Storage&lt;/strong&gt;: Included in the plan&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Bandwidth&lt;/strong&gt;: 1 TB outbound included; overage billed&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;High Availability&lt;/strong&gt;: Optional standby node (doubles cost)&lt;/li&gt;
&lt;li&gt;💾 &lt;strong&gt;Backups&lt;/strong&gt;: Daily backups + 7-day PITR&lt;/li&gt;
&lt;li&gt;🆓 &lt;strong&gt;Free Tier&lt;/strong&gt;: ❌ Not available&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Aiven
&lt;/h3&gt;

&lt;p&gt;Aiven provides managed PostgreSQL (and other open-source data services) hosted on major cloud providers (AWS, GCP, Azure, DigitalOcean, UpCloud).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💰 &lt;strong&gt;Model&lt;/strong&gt;: Tiered plans by cloud &amp;amp; region&lt;/li&gt;
&lt;li&gt;💵 &lt;strong&gt;Entry Point&lt;/strong&gt;: Free (2 vCPU, 1 GiB RAM, 1–5 GB SSD); paid plans from ~$19/month&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Storage &amp;amp; Network&lt;/strong&gt;: Included in plan; generous allowances&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;High Availability&lt;/strong&gt;: Included in Business and Premium tiers&lt;/li&gt;
&lt;li&gt;💾 &lt;strong&gt;Backups&lt;/strong&gt;: Automatic backups included&lt;/li&gt;
&lt;li&gt;🆓 &lt;strong&gt;Free Tier&lt;/strong&gt;: ✅ Yes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Neon
&lt;/h3&gt;

&lt;p&gt;Neon offers a serverless PostgreSQL platform with a unique architecture separating storage and compute.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💰 &lt;strong&gt;Model&lt;/strong&gt;: Serverless, usage-based&lt;/li&gt;
&lt;li&gt;💵 &lt;strong&gt;Entry Point&lt;/strong&gt;: Free (shared vCPU, 10 GB storage)&lt;/li&gt;
&lt;li&gt;⚙️ &lt;strong&gt;Compute&lt;/strong&gt;: Billed only when active; scales to zero when idle&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Storage&lt;/strong&gt;: Billed per GB-month and GB written&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;High Availability&lt;/strong&gt;: Built into platform architecture&lt;/li&gt;
&lt;li&gt;💾 &lt;strong&gt;Backups&lt;/strong&gt;: Includes time-travel and PITR&lt;/li&gt;
&lt;li&gt;🆓 &lt;strong&gt;Free Tier&lt;/strong&gt;: ✅ Yes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Supabase
&lt;/h3&gt;

&lt;p&gt;Supabase positions itself as an open-source Firebase alternative, providing a suite of backend tools, including a dedicated PostgreSQL database for each project.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💰 &lt;strong&gt;Model&lt;/strong&gt;: Tiered plans + usage-based overages&lt;/li&gt;
&lt;li&gt;💵 &lt;strong&gt;Entry Point&lt;/strong&gt;: Free (shared DB, 500 MB); Pro starts at $25/month&lt;/li&gt;
&lt;li&gt;⚙️ &lt;strong&gt;Compute &amp;amp; Storage&lt;/strong&gt;: Varies by tier; add-ons available&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;High Availability&lt;/strong&gt;: Included in Team and Enterprise tiers&lt;/li&gt;
&lt;li&gt;💾 &lt;strong&gt;Backups&lt;/strong&gt;: PITR; retention depends on tier&lt;/li&gt;
&lt;li&gt;🆓 &lt;strong&gt;Free Tier&lt;/strong&gt;: ✅ Yes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Timescale Cloud
&lt;/h3&gt;

&lt;p&gt;Timescale Cloud is a managed PostgreSQL platform optimized for time-series data, built upon the TimescaleDB extension, but fully compatible with standard PostgreSQL.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💰 &lt;strong&gt;Model&lt;/strong&gt;: Pure usage-based (compute + storage)&lt;/li&gt;
&lt;li&gt;💵 &lt;strong&gt;Entry Point&lt;/strong&gt;: ~$0.02/hr (smallest compute unit)&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Storage&lt;/strong&gt;: Includes hypertables + regular tables&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;High Availability&lt;/strong&gt;: Optional (adds to cost)&lt;/li&gt;
&lt;li&gt;💾 &lt;strong&gt;Backups&lt;/strong&gt;: Continuous with PITR&lt;/li&gt;
&lt;li&gt;🆓 &lt;strong&gt;Free Tier&lt;/strong&gt;: ✅ $300 in trial credits&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Heroku Postgres
&lt;/h3&gt;

&lt;p&gt;Heroku Postgres is one of the original and well-known managed PostgreSQL services, tightly integrated with the Heroku PaaS.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💰 &lt;strong&gt;Model&lt;/strong&gt;: Tiered hourly/monthly billing&lt;/li&gt;
&lt;li&gt;💵 &lt;strong&gt;Entry Point&lt;/strong&gt;: $5/month (Essential-0)&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Storage&lt;/strong&gt;: Included based on plan&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;High Availability&lt;/strong&gt;: Premium and above tiers only&lt;/li&gt;
&lt;li&gt;💾 &lt;strong&gt;Backups&lt;/strong&gt;: PG Backups (free); PITR on paid tiers&lt;/li&gt;
&lt;li&gt;🆓 &lt;strong&gt;Free Tier&lt;/strong&gt;: ✅ Yes (Essential-0, limited)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In 2025, PostgreSQL hosting ranges from flexible cloud platforms (AWS, GCP, Azure) to simple, developer-focused options (Neon, Supabase, Aiven, etc.).&lt;/p&gt;

&lt;p&gt;Cloud providers offer power and scale, but with complex pricing. Specialized hosts are easier to use, often with free tiers and clear pricing. Match your choice to workload needs, budget, and team expertise. Start small, test with free plans, and scale as needed.&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>sql</category>
      <category>aws</category>
      <category>azure</category>
    </item>
  </channel>
</rss>
