完全無料ログイン不要でER図が作成できるツールがチート級すぎて覇権を握るかもしれない【ChartDB】MySQL/PostgreSQL/MariaDB/SQLServer対応

SQL

スポンサーリンク

データベースを扱う方なら一度は通るER図。

作ろうと思ってもExcelで作図はイマイチだし、専用ソフトは高いし、会社で支給されていない限りは悩まれる方が多いかと思います。

今回は、そんな悩みを解決してくれる存在を紹介します。

概要

今回取り上げるのは、ChartDBというオープンソースのER図エディター。

Web上で動作し、アクセスしたらすぐに使うことができる上に、「データ漏洩が心配」という方向けに、なんと自前で環境を構築することも可能です。

以下、公式によるChartDBの説明(Google翻訳を少し訂正)。

ChartDBは強力なWebベースのデータベース図作成エディターです。 データベーススキーマを1つで即座に視覚化する「スマートクエリ」図をカスタマイズし、SQLスクリプトをエクスポートし、すべての機能にアクセスします—アカウントは必要ありません。ここでシームレスなデータベース設計を体験してください。

特徴:

  • インスタントスキーマインポート 単一のクエリを実行して、データベーススキーマをJSONとして即座に取得します。これにより、ドキュメント、チームディスカッション、または単にデータの理解を深めるなど、データベーススキーマの視覚化が非常に速くなります。
  • 移行が簡単なAI搭載エクスポート 当社のAI駆動エクスポート機能を使用すると、選択した方言でDDLスクリプトを生成できます。MySQLからPostgreSQLに移行する場合でも、SQLiteからMariaDBに移行する場合でも、ChartDBはターゲットデータベースに合わせた必要なスクリプトを提供することにより、プロセスを簡素化します。
  • インタラクティブ編集 直感的なエディターを使用してデータベーススキーマを微調整します。複雑な構造をよりよく視覚化するために、調整や注釈を簡単に作成できます。

特徴

ChartDBは現在パブリックベータ版で、正式版は未公開です。
正式版公開時はとんでもない反響を呼びそうです。

サポートされているデータベースは以下の通り。

  • PostgreSQL
  • MySQL
  • SQL Server
  • MariaDB
  • SQLite
  • ClickHouse

主要どころは勢揃いですね。
SQLiteが入っているところも、愛用者の私にとってはポイントが高いです。

使用方法

使い方は簡単で、以下のWebサイトにアクセスするだけです。

https://app.chartdb.io

流れはこんな感じです。
マジッククエリの部分は、一応バックアップを取るか、壊れても良いデータベースで試してからが良いと思います。

  1. 先ほどのリンクにアクセスする。
  2. “Go to app"をクリックする。
  3. 使用しているデータベースを選択する。
  4. 表示のマジッククエリをデータベースで実行する。
  5. 出力結果のJSONをChartDBにコピー&ペーストする。
  6. 編集を楽しむ。

英語なので苦戦する方もいるかもしれませんが、直感的に操作できます。

左上の「File」→「New」から新しい図を作成でき、図の保存や画像出力もできます。

インポートする場合は「Import Database」から取り込み可能。

また、AIによる自動エクスポート生成機能もあり、「Export SQL」からCREATE文の生成までしてくれます。ありがたや。

ちなみに、以下は公式からサンプルで用意されている"employees-db"(従業員DB)をSQLiteで出力した内容です。

CREATE TABLE IF NOT EXISTS departments (
  dept_no TEXT(4) NOT NULL PRIMARY KEY,
  dept_name TEXT(40) NOT NULL
);

CREATE UNIQUE INDEX dept_no_index ON departments (dept_no);
CREATE UNIQUE INDEX dept_name_index ON departments (dept_name);

CREATE TABLE IF NOT EXISTS dept_emp (
  emp_no INTEGER NOT NULL,
  dept_no TEXT(4) NOT NULL,
  from_date DATE NOT NULL,
  to_date DATE NOT NULL,
  PRIMARY KEY (emp_no, dept_no)
);

CREATE INDEX dept_emp_dept_no_index ON dept_emp (dept_no);

CREATE TABLE IF NOT EXISTS dept_manager (
  emp_no INTEGER NOT NULL,
  dept_no TEXT(4) NOT NULL,
  from_date DATE NOT NULL,
  to_date DATE NOT NULL,
  PRIMARY KEY (emp_no, dept_no)
);

CREATE INDEX dept_manager_dept_no_index ON dept_manager (dept_no);

CREATE TABLE IF NOT EXISTS employees (
  emp_no INTEGER NOT NULL PRIMARY KEY,
  birth_date DATE NOT NULL,
  first_name TEXT(14) NOT NULL,
  last_name TEXT(16) NOT NULL,
  gender TEXT(1) NOT NULL,
  hire_date DATE NOT NULL
);

CREATE UNIQUE INDEX employees_emp_no_index ON employees (emp_no);

CREATE TABLE IF NOT EXISTS salaries (
  emp_no INTEGER NOT NULL,
  salary INTEGER NOT NULL,
  from_date DATE NOT NULL,
  to_date DATE NOT NULL,
  price REAL DEFAULT 13.21,
  PRIMARY KEY (emp_no, from_date)
);

CREATE UNIQUE INDEX salaries_emp_no_index ON salaries (emp_no);
CREATE UNIQUE INDEX salaries_from_date_index ON salaries (from_date);

CREATE TABLE IF NOT EXISTS titles (
  emp_no INTEGER NOT NULL,
  title TEXT(50) NOT NULL,
  from_date DATE NOT NULL,
  to_date DATE DEFAULT NULL,
  PRIMARY KEY (emp_no, title, from_date)
);

CREATE UNIQUE INDEX titles_emp_no_index ON titles (emp_no);
CREATE UNIQUE INDEX titles_title_index ON titles (title);
CREATE UNIQUE INDEX titles_from_date_index ON titles (from_date);

CREATE TABLE IF NOT EXISTS dept_emp_new (
  emp_no INTEGER NOT NULL,
  dept_no TEXT(4) NOT NULL,
  from_date DATE NOT NULL,
  to_date DATE NOT NULL,
  PRIMARY KEY (emp_no, dept_no),
  FOREIGN KEY (emp_no) REFERENCES employees (emp_no),
  FOREIGN KEY (dept_no) REFERENCES departments (dept_no)
);

INSERT INTO dept_emp_new (emp_no, dept_no, from_date, to_date)
SELECT emp_no, dept_no, from_date, to_date FROM dept_emp;

DROP TABLE dept_emp;

ALTER TABLE dept_emp_new RENAME TO dept_emp;

CREATE TABLE IF NOT EXISTS dept_manager_new (
  emp_no INTEGER NOT NULL,
  dept_no TEXT(4) NOT NULL,
  from_date DATE NOT NULL,
  to_date DATE NOT NULL,
  PRIMARY KEY (emp_no, dept_no),
  FOREIGN KEY (emp_no) REFERENCES employees (emp_no),
  FOREIGN KEY (dept_no) REFERENCES departments (dept_no)
);

INSERT INTO dept_manager_new (emp_no, dept_no, from_date, to_date)
SELECT emp_no, dept_no, from_date, to_date FROM dept_manager;

DROP TABLE dept_manager;

ALTER TABLE dept_manager_new RENAME TO dept_manager;

CREATE TABLE IF NOT EXISTS salaries_new (
  emp_no INTEGER NOT NULL,
  salary INTEGER NOT NULL,
  from_date DATE NOT NULL,
  to_date DATE NOT NULL,
  price REAL DEFAULT 13.21,
  PRIMARY KEY (emp_no, from_date),
  FOREIGN KEY (emp_no) REFERENCES employees (emp_no)
);

INSERT INTO salaries_new (emp_no, salary, from_date, to_date, price)
SELECT emp_no, salary, from_date, to_date, price FROM salaries;

DROP TABLE salaries;

ALTER TABLE salaries_new RENAME TO salaries;

CREATE TABLE IF NOT EXISTS titles_new (
  emp_no INTEGER NOT NULL,
  title TEXT(50) NOT NULL,
  from_date DATE NOT NULL,
  to_date DATE DEFAULT NULL,
  PRIMARY KEY (emp_no, title, from_date),
  FOREIGN KEY (emp_no) REFERENCES employees (emp_no)
);

INSERT INTO titles_new (emp_no, title, from_date, to_date)
SELECT emp_no, title, from_date, to_date FROM titles;

DROP TABLE titles;

ALTER TABLE titles_new RENAME TO titles;

すごすぎます。

ローカル環境で使う方法

オンラインだとデータ漏洩が心配、という方向けにローカル環境でのデプロイも用意されています。

リポジトリをクローン

GitHubからリポジトリをクローンします。

git clone https://github.com/chartdb/chartdb.git

次にプロジェクトフォルダに移動。

cd chartdb

Node.jsでサーバーを起動します。

使用方法

npm install
npm run dev

ビルド方法

npm install
npm run build

Dockerコンテナの実行

個人的にはこちらの方がオススメです。

Dockerで以下を実行し、http://localhost:8080 にアクセスするだけ。

docker build -t chartdb .
docker run -p 8080:80 chartdb

あとがき

なんというか、とんでもないものが出てきたなという印象を受けました。

今までありそうでなかった、少なそうで多かった需要を丸ごと取り込んでいく、非常に有益かつ有用なツールが産声を上げたような感覚です。

データベース界隈で今後流行すると思いますので、ぜひ使ってみてください。

SQL

Posted by このめ