データベースのスキーマ設計を行うソフトウェアは幾つもありますが、固有のデータベースに依存していたり、専用のソフトウェアを使わないといけません。案件によってデータベースを変える際に、その知見が活かせないのは面倒です。 そこで使ってみたいのがDBMLです。データベースのスキーマ設計用言語です。

DBMLの使い方

DBMLの例です。波括弧、カギ括弧を使って構造を表現しています。Refはテーブル同士の結合を表現します。

Table users {
  id integer
  username varchar
  role varchar
  created_at timestamp
}

Table posts {
  id integer [primary key]
  title varchar
  body text [note: 'Content of the post']
  user_id integer
  status post_status
  created_at timestamp
}

Enum post_status {
  draft
  published
  private [note: 'visible via URL only']
}

Ref: posts.user_id > users.id // many-to-one

そしてdbml2sqlのようなコマンドアプリケーション(npmでインストールできます)を使ってSQLに変換できます。

$ npx dbml2sql db.dbml 
CREATE TYPE "post_status" AS ENUM (
  'draft',
  'published',
  'private'
);

CREATE TABLE "users" (
  "id" integer,
  "username" varchar,
  "role" varchar,
  "created_at" timestamp
);

CREATE TABLE "posts" (
  "id" integer PRIMARY KEY,
  "title" varchar,
  "body" text,
  "user_id" integer,
  "status" post_status,
  "created_at" timestamp
);

ALTER TABLE "posts" ADD FOREIGN KEY ("user_id") REFERENCES "users" ("id");

COMMENT ON COLUMN "posts"."body" IS 'Content of the post';

他にもdbdiagram.ioではDBMLを読み込んでビジュアル的にデータベース設計が可能です。マークアップ言語かといわれると違う気がしますが、DSLのようなものだと思うと便利そうです。

DBMLはApache License 2.0で公開されているオープンソース・プロジェクトです。

DBML - Database Markup Language | DBML holistics/dbml: Database Markup Language (DBML), designed to define and document database structures