<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>SchemaDrawer blog</title>
    <link>https://schemadrawer.com/blog/</link>
    <description>Database migrations, schema design, ER diagrams and the tooling around them.</description>
    <language>en</language>
    <lastBuildDate>Fri, 25 Sep 2026 08:00:00 +0000</lastBuildDate>
    <atom:link href="https://schemadrawer.com/feed.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>10 Database Migration Anti-Patterns and What to Do Instead</title>
      <link>https://schemadrawer.com/blog/database-migration-anti-patterns/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/database-migration-anti-patterns/</guid>
      <pubDate>Tue, 22 Sep 2026 08:00:00 +0000</pubDate>
      <category>Migration tools</category>
      <description>Editing applied migrations, environment-specific scripts, ORM auto-DDL in production, untested rollbacks: ten habits that break deployments, with a fix for each.</description>
    </item>
    <item>
      <title>Zero-Downtime Database Migrations: The Expand and Contract Pattern</title>
      <link>https://schemadrawer.com/blog/zero-downtime-database-migrations-expand-contract/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/zero-downtime-database-migrations-expand-contract/</guid>
      <pubDate>Fri, 18 Sep 2026 08:00:00 +0000</pubDate>
      <category>CI/CD and workflow</category>
      <description>How to change a live schema without an outage: expand, backfill in batches, switch reads and writes, then contract. With safe NOT NULL, renames and lock timeouts.</description>
    </item>
    <item>
      <title>Testing Database Migrations in CI with Docker and Testcontainers</title>
      <link>https://schemadrawer.com/blog/testing-database-migrations-with-docker/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/testing-database-migrations-with-docker/</guid>
      <pubDate>Tue, 15 Sep 2026 08:00:00 +0000</pubDate>
      <category>CI/CD and workflow</category>
      <description>Run migrations against a throw-away real database on every change: a Testcontainers and Flyway example, CI service containers, version matrices and schema checks.</description>
    </item>
    <item>
      <title>SQLite in Development, PostgreSQL in Production: What Breaks</title>
      <link>https://schemadrawer.com/blog/sqlite-for-development-differences/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/sqlite-for-development-differences/</guid>
      <pubDate>Fri, 11 Sep 2026 08:00:00 +0000</pubDate>
      <category>Databases</category>
      <description>Type affinity, limited ALTER TABLE and foreign keys that are off by default: what breaks when you develop on SQLite and deploy to PostgreSQL, and how to avoid it.</description>
    </item>
    <item>
      <title>SQL Server Schemas: dbo, Ownership and How Migration Tools Handle Them</title>
      <link>https://schemadrawer.com/blog/sql-server-schemas-dbo-explained/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/sql-server-schemas-dbo-explained/</guid>
      <pubDate>Tue, 08 Sep 2026 08:00:00 +0000</pubDate>
      <category>Databases</category>
      <description>What a schema is in SQL Server, why everything lands in dbo, how default schemas work, and how Flyway, Liquibase, EF Core, DbUp and FluentMigrator target schemas.</description>
    </item>
    <item>
      <title>Why Oracle Shows Your Tables in UPPERCASE: Case Folding Explained</title>
      <link>https://schemadrawer.com/blog/oracle-uppercase-identifiers-explained/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/oracle-uppercase-identifiers-explained/</guid>
      <pubDate>Fri, 04 Sep 2026 08:00:00 +0000</pubDate>
      <category>Databases</category>
      <description>Oracle folds unquoted names to upper case, PostgreSQL to lower case, MySQL depends on a setting, SQL Server on collation. The rules, and how to stay out of trouble.</description>
    </item>
    <item>
      <title>Choosing Column Types: VARCHAR vs TEXT, TIMESTAMPTZ, NUMERIC vs FLOAT</title>
      <link>https://schemadrawer.com/blog/choosing-column-types/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/choosing-column-types/</guid>
      <pubDate>Tue, 01 Sep 2026 08:00:00 +0000</pubDate>
      <category>Databases</category>
      <description>A practical guide to column types in PostgreSQL, MySQL, SQL Server, Oracle and SQLite: strings, timestamps, money, booleans, JSON, enums and what diagrams report.</description>
    </item>
    <item>
      <title>Transactional DDL: Why PostgreSQL Rolls Back Failed Migrations</title>
      <link>https://schemadrawer.com/blog/transactional-ddl-explained/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/transactional-ddl-explained/</guid>
      <pubDate>Fri, 28 Aug 2026 08:00:00 +0000</pubDate>
      <category>Databases</category>
      <description>Which engines run DDL in transactions (PostgreSQL, SQL Server, SQLite), which commit implicitly (MySQL, MariaDB, Oracle), and how to write migrations for both.</description>
    </item>
    <item>
      <title>PostgreSQL vs MySQL vs MariaDB: How to Choose a Database</title>
      <link>https://schemadrawer.com/blog/postgresql-vs-mysql-vs-mariadb/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/postgresql-vs-mysql-vs-mariadb/</guid>
      <pubDate>Tue, 25 Aug 2026 08:00:00 +0000</pubDate>
      <category>Databases</category>
      <description>A practical comparison of PostgreSQL, MySQL and MariaDB: data types, SQL conformance, transactional DDL, replication, hosting and what each means for migrations.</description>
    </item>
    <item>
      <title>Diesel Migrations for Rust: up.sql, down.sql and schema.rs</title>
      <link>https://schemadrawer.com/blog/diesel-migrations-rust-guide/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/diesel-migrations-rust-guide/</guid>
      <pubDate>Fri, 21 Aug 2026 08:00:00 +0000</pubDate>
      <category>Migration tools</category>
      <description>How Diesel manages a schema in Rust: the CLI, timestamped folders with up.sql and down.sql, the versions table, the generated schema.rs and embedded migrations.</description>
    </item>
    <item>
      <title>Doctrine Migrations in Symfony: Generate, Review and Deploy</title>
      <link>https://schemadrawer.com/blog/doctrine-migrations-symfony-guide/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/doctrine-migrations-symfony-guide/</guid>
      <pubDate>Tue, 18 Aug 2026 08:00:00 +0000</pubDate>
      <category>Migration tools</category>
      <description>Doctrine Migrations in Symfony from setup to deploy: diff versus generate, the Version class, the versions table, reviewing generated SQL and running safely.</description>
    </item>
    <item>
      <title>Rails Migrations: schema.rb vs structure.sql and When Each Wins</title>
      <link>https://schemadrawer.com/blog/rails-migrations-schema-rb-vs-structure-sql/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/rails-migrations-schema-rb-vs-structure-sql/</guid>
      <pubDate>Fri, 14 Aug 2026 08:00:00 +0000</pubDate>
      <category>Migration tools</category>
      <description>How Active Record migrations work, what schema.rb cannot express, when to switch to structure.sql, and how db:prepare and strong_migrations keep a team safe.</description>
    </item>
    <item>
      <title>Laravel Migrations: Best Practices for Teams</title>
      <link>https://schemadrawer.com/blog/laravel-migrations-best-practices/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/laravel-migrations-best-practices/</guid>
      <pubDate>Tue, 11 Aug 2026 08:00:00 +0000</pubDate>
      <category>Migration tools</category>
      <description>Practical rules for Laravel migrations in a team: one change per file, constrained foreign keys, frozen history, schema dumps, safe production runs and tests.</description>
    </item>
    <item>
      <title>DbUp vs FluentMigrator: Two Ways to Migrate .NET Databases</title>
      <link>https://schemadrawer.com/blog/dbup-vs-fluentmigrator/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/dbup-vs-fluentmigrator/</guid>
      <pubDate>Fri, 07 Aug 2026 08:00:00 +0000</pubDate>
      <category>Migration tools</category>
      <description>DbUp runs plain SQL scripts once and journals them; FluentMigrator describes changes in C#. How each works, where each wins, and how both sit next to EF Core.</description>
    </item>
    <item>
      <title>Sqitch: Database Change Management Without Version Numbers</title>
      <link>https://schemadrawer.com/blog/sqitch-dependency-based-migrations/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/sqitch-dependency-based-migrations/</guid>
      <pubDate>Tue, 04 Aug 2026 08:00:00 +0000</pubDate>
      <category>Migration tools</category>
      <description>How Sqitch plans, deploys, reverts and verifies database changes with named dependencies instead of version numbers, and when it is worth the learning curve.</description>
    </item>
    <item>
      <title>Schema Drift: How to Detect It and How to Prevent It</title>
      <link>https://schemadrawer.com/blog/schema-drift-detection-and-prevention/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/schema-drift-detection-and-prevention/</guid>
      <pubDate>Fri, 31 Jul 2026 08:00:00 +0000</pubDate>
      <category>CI/CD and workflow</category>
      <description>What schema drift is, how it creeps in through hotfixes and unsynced environments, the tools that detect it and the workflow that stops it coming back.</description>
    </item>
    <item>
      <title>Database Documentation Best Practices for Engineering Teams</title>
      <link>https://schemadrawer.com/blog/database-documentation-best-practices/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/database-documentation-best-practices/</guid>
      <pubDate>Tue, 28 Jul 2026 08:00:00 +0000</pubDate>
      <category>CI/CD and workflow</category>
      <description>What to document about a database, where it should live, how to generate the parts that rot, and how to keep schema docs honest through code review and CI.</description>
    </item>
    <item>
      <title>Go Migration Tools Compared: golang-migrate, goose, dbmate, Atlas</title>
      <link>https://schemadrawer.com/blog/go-migration-tools-compared/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/go-migration-tools-compared/</guid>
      <pubDate>Tue, 21 Jul 2026 08:00:00 +0000</pubDate>
      <category>Migration tools</category>
      <description>Four Go migration tools compared: file layouts, how each records applied versions, checksums, embedding in Go binaries, database support and where each fits.</description>
    </item>
    <item>
      <title>Foreign Keys Done Right: ON DELETE Rules, Indexing and Pitfalls</title>
      <link>https://schemadrawer.com/blog/foreign-keys-on-delete-and-indexing/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/foreign-keys-on-delete-and-indexing/</guid>
      <pubDate>Fri, 17 Jul 2026 08:00:00 +0000</pubDate>
      <category>Databases</category>
      <description>ON DELETE actions explained, why PostgreSQL leaves FK columns unindexed while InnoDB indexes them, deferrable constraints and NOT VALID on big tables.</description>
    </item>
    <item>
      <title>Mermaid ER Diagrams: Syntax, Examples and Limitations</title>
      <link>https://schemadrawer.com/blog/mermaid-er-diagrams-guide/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/mermaid-er-diagrams-guide/</guid>
      <pubDate>Tue, 14 Jul 2026 08:00:00 +0000</pubDate>
      <category>Diagrams and documentation</category>
      <description>How to write Mermaid erDiagram blocks: entities, attributes with PK and FK markers, cardinality symbols, where they render, and what Mermaid cannot do.</description>
    </item>
    <item>
      <title>EF Core Migrations: Add-Migration, Bundles, Idempotent Scripts and CI</title>
      <link>https://schemadrawer.com/blog/ef-core-migrations-guide/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/ef-core-migrations-guide/</guid>
      <pubDate>Fri, 10 Jul 2026 08:00:00 +0000</pubDate>
      <category>Migration tools</category>
      <description>What dotnet ef migrations add generates, how to apply migrations with database update, idempotent scripts and bundles, and surviving model snapshot conflicts.</description>
    </item>
    <item>
      <title>Alembic Autogenerate: What It Detects, What It Misses, How to Fix It</title>
      <link>https://schemadrawer.com/blog/alembic-autogenerate-pitfalls/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/alembic-autogenerate-pitfalls/</guid>
      <pubDate>Tue, 07 Jul 2026 08:00:00 +0000</pubDate>
      <category>Migration tools</category>
      <description>How Alembic autogenerate compares SQLAlchemy metadata with the live database, the changes it cannot see, constraint naming conventions and SQLite batch mode.</description>
    </item>
    <item>
      <title>Primary Keys: Serial, Identity, UUID or ULID?</title>
      <link>https://schemadrawer.com/blog/primary-keys-serial-vs-uuid-vs-ulid/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/primary-keys-serial-vs-uuid-vs-ulid/</guid>
      <pubDate>Fri, 03 Jul 2026 08:00:00 +0000</pubDate>
      <category>Databases</category>
      <description>Integer, UUID or ULID primary keys compared on size, index locality, guessability and generation, with engine specifics and a recommendation per situation.</description>
    </item>
    <item>
      <title>12 Tools to Visualize a Database Schema, Compared</title>
      <link>https://schemadrawer.com/blog/best-database-schema-visualization-tools/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/best-database-schema-visualization-tools/</guid>
      <pubDate>Tue, 30 Jun 2026 08:00:00 +0000</pubDate>
      <category>Diagrams and documentation</category>
      <description>From dbdiagram.io and DBeaver to SchemaSpy, tbls and Mermaid: what each schema visualization tool takes as input, what it produces and when to use it.</description>
    </item>
    <item>
      <title>TypeORM Migrations Guide: Generate, Run and Avoid synchronize</title>
      <link>https://schemadrawer.com/blog/typeorm-migrations-guide/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/typeorm-migrations-guide/</guid>
      <pubDate>Fri, 26 Jun 2026 08:00:00 +0000</pubDate>
      <category>Migration tools</category>
      <description>TypeORM migrations in practice: DataSource setup, generate versus create, running TypeScript migrations, migrationsRun, and why synchronize is unsafe in production.</description>
    </item>
    <item>
      <title>Django Migrations Explained: From makemigrations to Production</title>
      <link>https://schemadrawer.com/blog/django-migrations-explained/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/django-migrations-explained/</guid>
      <pubDate>Tue, 23 Jun 2026 08:00:00 +0000</pubDate>
      <category>Migration tools</category>
      <description>What Django migration files contain, how dependencies and RunPython work, when to squash, how to check migrations in CI, and the traps that catch teams.</description>
    </item>
    <item>
      <title>Many-to-Many Relationships: Designing Join Tables the Right Way</title>
      <link>https://schemadrawer.com/blog/many-to-many-relationships-join-tables/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/many-to-many-relationships-join-tables/</guid>
      <pubDate>Fri, 19 Jun 2026 08:00:00 +0000</pubDate>
      <category>Databases</category>
      <description>Join table design: naming, composite key or surrogate id, extra columns, indexes both ways and ON DELETE rules, with SQL, Django, Prisma and Rails examples.</description>
    </item>
    <item>
      <title>How to Keep Your Database Diagram Up to Date with CI</title>
      <link>https://schemadrawer.com/blog/keep-database-diagram-up-to-date-in-ci/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/keep-database-diagram-up-to-date-in-ci/</guid>
      <pubDate>Tue, 16 Jun 2026 08:00:00 +0000</pubDate>
      <category>CI/CD and workflow</category>
      <description>Turn the schema diagram into a build artifact: regenerate it from the migrations on every change, commit it through a pull request and review the diff.</description>
    </item>
    <item>
      <title>Drizzle ORM Migrations: drizzle-kit generate, the Journal and migrate</title>
      <link>https://schemadrawer.com/blog/drizzle-migrations-guide/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/drizzle-migrations-guide/</guid>
      <pubDate>Fri, 12 Jun 2026 08:00:00 +0000</pubDate>
      <category>Migration tools</category>
      <description>How Drizzle migrations work: drizzle-kit generate, the SQL files, snapshots and meta/_journal.json, applying them with migrate, and when to use push instead.</description>
    </item>
    <item>
      <title>Liquibase Changelog Formats: XML, YAML, JSON or Formatted SQL?</title>
      <link>https://schemadrawer.com/blog/liquibase-changelog-formats-xml-yaml-sql/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/liquibase-changelog-formats-xml-yaml-sql/</guid>
      <pubDate>Tue, 09 Jun 2026 08:00:00 +0000</pubDate>
      <category>Migration tools</category>
      <description>Liquibase accepts XML, YAML, JSON and formatted SQL changelogs. The same table in each format, how include and includeAll work, and which format fits which team.</description>
    </item>
    <item>
      <title>Database Normalization Explained with a Real Schema (1NF to BCNF)</title>
      <link>https://schemadrawer.com/blog/database-normalization-explained/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/database-normalization-explained/</guid>
      <pubDate>Fri, 05 Jun 2026 08:00:00 +0000</pubDate>
      <category>Databases</category>
      <description>Normalization walked through on a vet clinic spreadsheet: 1NF, 2NF, 3NF and BCNF explained in plain words, ending in the PetClinic tables, plus when to denormalize.</description>
    </item>
    <item>
      <title>How to Generate an ER Diagram from Migration Files</title>
      <link>https://schemadrawer.com/blog/generate-er-diagram-from-migration-files/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/generate-er-diagram-from-migration-files/</guid>
      <pubDate>Tue, 02 Jun 2026 08:00:00 +0000</pubDate>
      <category>Diagrams and documentation</category>
      <description>Three ways to turn Flyway, Liquibase, Prisma or Django migrations into an ER diagram, and a step-by-step guide to the one that always matches reality.</description>
    </item>
    <item>
      <title>Knex vs Sequelize vs TypeORM vs MikroORM vs Drizzle Migrations</title>
      <link>https://schemadrawer.com/blog/nodejs-migration-tools-compared/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/nodejs-migration-tools-compared/</guid>
      <pubDate>Fri, 29 May 2026 08:00:00 +0000</pubDate>
      <category>Migration tools</category>
      <description>How five Node.js tools write, track and run database migrations, with a real migration file for each, a comparison table and advice on which one fits your project.</description>
    </item>
    <item>
      <title>Flyway Migration Naming: Versioned, Repeatable and Undo Scripts</title>
      <link>https://schemadrawer.com/blog/flyway-naming-conventions-and-versioning/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/flyway-naming-conventions-and-versioning/</guid>
      <pubDate>Tue, 26 May 2026 08:00:00 +0000</pubDate>
      <category>Migration tools</category>
      <description>How Flyway names and orders migrations: the V, R and U prefixes, version separators, checksums, repair, outOfOrder and baseline, plus the mistakes that bite.</description>
    </item>
    <item>
      <title>Database Naming Conventions: Tables, Columns, Keys and Indexes</title>
      <link>https://schemadrawer.com/blog/database-naming-conventions/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/database-naming-conventions/</guid>
      <pubDate>Fri, 22 May 2026 08:00:00 +0000</pubDate>
      <category>Databases</category>
      <description>A practical naming convention for tables, columns, keys, constraints and indexes, plus the case-folding rules of PostgreSQL, Oracle, MySQL and SQL Server.</description>
    </item>
    <item>
      <title>How to Read a Database Schema Diagram: Keys and Relationships</title>
      <link>https://schemadrawer.com/blog/how-to-read-a-database-schema-diagram/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/how-to-read-a-database-schema-diagram/</guid>
      <pubDate>Tue, 19 May 2026 08:00:00 +0000</pubDate>
      <category>Diagrams and documentation</category>
      <description>Learn to read any schema diagram: primary and composite keys, foreign keys and arrow direction, one-to-many, join tables, one-to-one and self-references.</description>
    </item>
    <item>
      <title>Prisma Migrate Explained: migration.sql, Shadow Database and Drift</title>
      <link>https://schemadrawer.com/blog/prisma-migrate-explained/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/prisma-migrate-explained/</guid>
      <pubDate>Fri, 15 May 2026 08:00:00 +0000</pubDate>
      <category>Migration tools</category>
      <description>How Prisma Migrate works: the migrations folder layout, migrate dev versus migrate deploy, the shadow database, drift detection and baselining an existing database.</description>
    </item>
    <item>
      <title>Flyway vs Liquibase: Which Database Migration Tool Should You Use?</title>
      <link>https://schemadrawer.com/blog/flyway-vs-liquibase/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/flyway-vs-liquibase/</guid>
      <pubDate>Tue, 12 May 2026 08:00:00 +0000</pubDate>
      <category>Migration tools</category>
      <description>A practical comparison of Flyway and Liquibase: migration model, file formats, rollback, checksums and validation, integrations, and a decision guide for teams.</description>
    </item>
    <item>
      <title>Why Parsing SQL Is Not Enough to Draw Your Database Schema</title>
      <link>https://schemadrawer.com/blog/why-parsing-sql-is-not-enough-to-draw-a-schema/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/why-parsing-sql-is-not-enough-to-draw-a-schema/</guid>
      <pubDate>Fri, 08 May 2026 08:00:00 +0000</pubDate>
      <category>Diagrams and documentation</category>
      <description>SQL parsers stumble on dialects, procedural blocks, generated DDL and renames across files. Running migrations on a real engine and reading the catalog is reliable.</description>
    </item>
    <item>
      <title>What Is an ER Diagram? Entities, Relationships, Cardinality</title>
      <link>https://schemadrawer.com/blog/what-is-an-er-diagram/</link>
      <guid isPermaLink="true">https://schemadrawer.com/blog/what-is-an-er-diagram/</guid>
      <pubDate>Tue, 05 May 2026 08:00:00 +0000</pubDate>
      <category>Diagrams and documentation</category>
      <description>A plain explanation of entity-relationship diagrams: entities, attributes, relationships, cardinality, the common notations, and what belongs in one.</description>
    </item>
  </channel>
</rss>
