🗨️

【ChatGPT】【活用方法】DDL(SQL) から ER図を作成する

2023/03/19に公開

試したこと

  • データベースのSQL(DDL)をMermaid形式ER図に変換する
  • Mermaid形式ER図をデータベースのSQL(DDL)をに変換する

モチベーション

実際のエンジニアリング作業でよくある問題として、肥大したデータベースをER図に起こして整理したいというニーズはあるかなと思います。
このような問題を解決するツールは世の中にあるりますが、インストールが必要であったり手間がかかることも少なくないと感じます。

早速やってみましょう。
例としてブログアプリケーションのデータベースのDDLを使って変換作業をしてみます。

このDDLは、ユーザー、投稿、コメント、カテゴリを管理するためのテーブルを定義しています。ユーザーは複数の投稿を持ち、投稿は複数のコメントを持つことができます。また、投稿は複数のカテゴリに属することができます。

CREATE TABLE `users` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(255) NOT NULL,
  `email` VARCHAR(255) NOT NULL,
  `password` VARCHAR(255) NOT NULL,
  `created_at` DATETIME NOT NULL,
  `updated_at` DATETIME NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `posts` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` INT UNSIGNED NOT NULL,
  `title` VARCHAR(255) NOT NULL,
  `content` TEXT NOT NULL,
  `created_at` DATETIME NOT NULL,
  `updated_at` DATETIME NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `comments` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` INT UNSIGNED NOT NULL,
  `post_id` INT UNSIGNED NOT NULL,
  `content` TEXT NOT NULL,
  `created_at` DATETIME NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (`user_id`) REFERENCES `users` (`id`),
  FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `categories` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `post_categories` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `post_id` INT UNSIGNED NOT NULL,
  `category_id` INT UNSIGNED NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`),
  FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

これをChatGPTに以下のプロンプトで変換をお願いしてみます。

以下のMySQLのDDLから Mermaid記法でER図を作成してください。
ただし、作成にあたって以下の条件に合わせてください。

- mermaid version: 9.1.7
- Zennで表示する

===========================
<DDLをここにコピーする>

※ 「Zennで表示する」 初めこれをつけないで作成したらzennで使えないシンタックスになっていたので追加しました。

こちらが出力されたER図です。

```mermaid
erDiagram
  users ||..|| posts : has
  users ||..|| comments : writes
  posts ||..|| comments : has
  categories ||..|| post_categories : has
  posts ||..|| post_categories : belongs_to

  users {
    int id
    varchar username
    varchar email
    varchar password
    datetime created_at
    datetime updated_at
  }

  posts {
    int id
    int user_id
    varchar title
    text content
    datetime created_at
    datetime updated_at
  }

  comments {
    int id
    int user_id
    int post_id
    text content
    datetime created_at
  }

  categories {
    int id
    varchar name
  }

  post_categories {
    int id
    int post_id
    int category_id
  }

表示されていますね。

ER図からDDLを出力する

  • DDL -> ER図

ができるということは逆もできそうですよね。ということでやってみました。

以下のMermaidのER図からMySQLのDDLを出力してください。
ただし、作成にあたって以下の条件に合わせてください。


- MySQL version: 8.0.31

==========================
<上のER図を貼る>

出力は以下のようになりました。

CREATE TABLE `users` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `username` VARCHAR(255) NOT NULL,
  `email` VARCHAR(255) NOT NULL,
  `password` VARCHAR(255) NOT NULL,
  `created_at` DATETIME NOT NULL,
  `updated_at` DATETIME NOT NULL
);

CREATE TABLE `posts` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `user_id` INT NOT NULL,
  `title` VARCHAR(255) NOT NULL,
  `content` TEXT NOT NULL,
  `created_at` DATETIME NOT NULL,
  `updated_at` DATETIME NOT NULL,
  FOREIGN KEY (user_id) REFERENCES users(id)
);

CREATE TABLE `comments` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `user_id` INT NOT NULL,
  `post_id` INT NOT NULL,
  `content` TEXT NOT NULL,
  `created_at` DATETIME NOT NULL,
  FOREIGN KEY (user_id) REFERENCES users(id),
  FOREIGN KEY (post_id) REFERENCES posts(id)
);

CREATE TABLE `categories` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `name` VARCHAR(255) NOT NULL
);

CREATE TABLE `post_categories` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `post_id` INT NOT NULL,
  `category_id` INT NOT NULL,
  FOREIGN KEY (post_id) REFERENCES posts(id),
  FOREIGN KEY (category_id) REFERENCES categories(id)
);

Mermaidに情報が足りないので修正は必要そうですが、構文的には合っていそうですね。
条件に色々と付与すれば、作業時間は短縮できそうです。

まとめ

本記事では、ChatGPTを活用して、エンジニアリング作業における生産性向上の方法を紹介しました。ChatGPTを利用することで、既知のものから既知の別のものへの変換作業が大幅に簡素化され、エンジニアリング作業の効率化につながります。

例として、DDLからER図への変換と、ER図からDDLへの変換を行いました。これらの作業は、手動で行うと手間がかかるものです。ChatGPTを利用することで、これらの作業を自動化することができ、時間を節約することができます。

今後も、ChatGPTの活用方法について、実践的な内容を紹介していきます。

Discussion