話題の記事

ChatGPTにER図を作成してもらってみた

テキストで表現できるなら頑張ってくれます
2023.03.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

データアナリティクス事業本部 BIチームのkariyaです。
ChatGPTではテキストでのやり取りになりますが、どうにかして図を作成してもらうことはできないかと思いER図の作成を依頼してみました。
なお、ChatGPT(無料プラン)での実行結果を記載しています。

欲しいER図

  • 小売業の一般的なデータを持っている
  • 各テーブルの中に、複数のデータ項目(列)を持っている
  • データ分析がしやすい、スタースキーマの構造になっている

やってみる

まずはやりたいことをそのままお願いしてみます。

入力

下記の条件を満たすER図を作成してください。
・小売業の一般的なデータを持っている
・各テーブルの中に、複数のデータ項目(列)を持っている
・データ分析がしやすい、スタースキーマの構造になっている

出力

画像のアップロードサイトのリンクが貼られたようですが、閲覧できませんでした。
他の手段で出力できないか聞いてみます。

入力

imgur.comのリンクが閲覧できませんでした。他の手段でER図を表現できますか?

出力

申し訳ありません。imgur.comのリンクが閲覧できなかったようですね。代替手段として、以下にER図をテキストベースで表現したものを示します。

                  +-------+
                  | Sales |
                  +-------+
                       |
           +-----------+-----------+
           |                       |
      +--------+              +---------+
      | Time   |              | Product |
      +--------+              +---------+
           |                       |
      +--------+              +---------+
      | Store  |              | Customer|
      +--------+              +---------+


このER図では、中央にファクトテーブルであるSalesテーブルがあり、周囲にディメンションテーブルであるTime、Product、Store、Customerテーブルが配置されています。Salesテーブルは、ディメンションテーブルのキーを外部キーとして持っています。このER図を見ると、SalesテーブルがTime、Product、Store、Customerテーブルと関連していることが分かります。

テキストで表現できる形なら図も描いてくれるようです!
続けて、データ項目の追加をお願いしてみます。
(以降の出力は図の部分のみを抜粋して記載していきます。)

入力

ありがとうございます。各テーブルにデータ項目を追加してください。

出力

                  +-------+
                  | Sales |
                  +-------+
                  | sale_id (PK)   |
                  | time_id (FK)   |
                  | product_id (FK)|
                  | store_id (FK)  |
                  | customer_id (FK)|
                  | sale_amount   |
                  | sale_quantity |
                  +--------------+
                       |
           +-----------+-----------+
           |                       |
      +--------+              +---------+
      | Time   |              | Product |
      +--------+              +---------+
      | time_id (PK)          | product_id (PK) |
      | date                  | product_name   |
      | year                  | product_category |
      | quarter               | product_price |
      | month                 | manufacturer   |
      | day                   | brand          |
      +-----------------------+----------------+
           |                       |
      +--------+              +---------+
      | Store  |              | Customer|
      +--------+              +---------+
      | store_id (PK)         | customer_id (PK) |
      | store_name            | customer_name   |
      | region                | customer_gender |
      | address               | customer_age    |
      +-----------------------+----------------+

項目を追加してくれました。
項目が増えたことにより、テーブルの関連を見るのが少し難しいレイアウトになってきました。
そこで、PlantUML(UMLなどの様々な図をテキストで表現する形式)で出力してもらいます。

入力

ありがとうございます。上記をPlantUMLで出力してください。

出力

@startuml
!define Table(name,desc) class name as "desc" << (T,#FFAAAA) >>
!define primary_key(x) <b><u>x</u></b>
!define foreign_key(x) <u>x</u>

Table(Sales, "Sales") {
  + primary_key(sale_id)
  + foreign_key(time_id)
  + foreign_key(product_id)
  + foreign_key(store_id)
  + foreign_key(customer_id)
  --
  sale_amount
  sale_quantity
}

Table(Time, "Time") {
  + primary_key(time_id)
  --
  date
  year
  quarter
  month
  day
}

Table(Product, "Product") {
  + primary_key(product_id)
  --
  product_name
  product_category
  product_price
  manufacturer
  brand
}

Table(Store, "Store") {
  + primary_key(store_id)
  --
  store_name
  region
  address
}

Table(Customer, "Customer") {
  + primary_key(customer_id)
  --
  customer_name
  customer_gender
  customer_age
}

Sales -- Time
Sales -- Product
Sales -- Store
Sales -- Customer

@enduml

PlantUMLの実行環境を用意することで、上記のテキストから図にすることができます。

Web上でもテキストから図を作成することができますが、Web上では機密情報を入れないようにご注意下さい。
続けて、出力結果を日本語にしてみましょう。

入力

ありがとうございます。テーブル名とデータ項目名を日本語にしてもらえますか?

出力

コードでの出力(クリックすると展開します)
@startuml
!define Table(name,desc) class name as "desc" << (T,#FFAAAA) >>
!define primary_key(x) <b><u>x</u></b>
!define foreign_key(x) <u>x</u>

Table(販売, "販売") {
  + primary_key(販売ID)
  + foreign_key(日時ID)
  + foreign_key(商品ID)
  + foreign_key(店舗ID)
  + foreign_key(顧客ID)
  --
  販売金額
  販売数量
}

Table(日時, "日時") {
  + primary_key(日時ID)
  --
  日付
  年
  四半期
  月
  日
}

Table(商品, "商品") {
  + primary_key(商品ID)
  --
  商品名
  商品カテゴリ
  商品価格
  メーカー
  ブランド
}

Table(店舗, "店舗") {
  + primary_key(店舗ID)
  --
  店舗名
  地域
  住所
}

Table(顧客, "顧客") {
  + primary_key(顧客ID)
  --
  顧客名
  性別
  年齢
}

販売 -- 日時
販売 -- 商品
販売 -- 店舗
販売 -- 顧客

@enduml

日本語への変換もお手のものです。
実際のデータでは日時にIDを採番することはあまり考えられませんので、削除を依頼します。
このように、実際に使えそうなテーブル構造になっているかは人間が判断する必要がありそうです。

入力

日時テーブルを削除した図にしてください。

出力

コードでの出力(クリックすると展開します)
@startuml
!define Table(name,desc) class name as "desc" << (T,#FFAAAA) >>
!define primary_key(x) <b><u>x</u></b>
!define foreign_key(x) <u>x</u>

Table(販売, "販売") {
  + primary_key(販売ID)
  + foreign_key(商品ID)
  + foreign_key(店舗ID)
  + foreign_key(顧客ID)
  --
  日付
  年
  四半期
  月
  日
  販売金額
  販売数量
}

Table(商品, "商品") {
  + primary_key(商品ID)
  --
  商品名
  商品カテゴリ
  商品価格
  メーカー
  ブランド
}

Table(店舗, "店舗") {
  + primary_key(店舗ID)
  --
  店舗名
  地域
  住所
}

Table(顧客, "顧客") {
  + primary_key(顧客ID)
  --
  顧客名
  性別
  年齢
}

販売 -- 商品
販売 -- 店舗
販売 -- 顧客

@enduml

依頼通りに日時テーブルは削除されましたが、日時テーブルが持っていた項目がそのまま販売テーブルに移動しました。テーブルとデータ項目の要否をそれぞれ指定するなど、細かい依頼が必要そうです。

今度は新たなテーブルを作成してもらいます。

入力

商品カテゴリのテーブルを作成してください。商品テーブルとは、商品カテゴリIDで関連付けてください。

出力

コードでの出力(クリックすると展開します)
@startuml
!define Table(name,desc) class name as "desc" << (T,#FFAAAA) >>
!define primary_key(x) <b><u>x</u></b>
!define foreign_key(x) <u>x</u>

Table(販売, "販売") {
  + primary_key(販売ID)
  + foreign_key(商品ID)
  + foreign_key(店舗ID)
  + foreign_key(顧客ID)
  --
  日付
  年
  四半期
  月
  日
  販売金額
  販売数量
}

Table(商品, "商品") {
  + primary_key(商品ID)
  + foreign_key(商品カテゴリID)
  --
  商品名
  商品価格
  メーカー
  ブランド
}

Table(商品カテゴリ, "商品カテゴリ") {
  + primary_key(商品カテゴリID)
  --
  商品カテゴリ名
}

Table(店舗, "店舗") {
  + primary_key(店舗ID)
  --
  店舗名
  地域
  住所
}

Table(顧客, "顧客") {
  + primary_key(顧客ID)
  --
  顧客名
  性別
  年齢
}

販売 -- 商品
販売 -- 店舗
販売 -- 顧客
商品 -- 商品カテゴリ

@enduml

テーブルの作成もしてくれました!
商品カテゴリIDでの関連付けなど、具体的な依頼をすると意図通りに動いてくれますね。

おわりに

ChatGPTにER図の作成を依頼してみました。
直接図を出力することはできなくても、図にできるテキストを生成するのは非常に便利だと感じました。
一方、「一般的にこうするはず」といった思いは汲み取られないことも多く、依頼内容を具体的にする必要も感じました。
既にGPT4が出ていますが、新しいバージョンが出ることでこのあたりがどう改良されていくのかも楽しみです。

余談ですが、「〇〇のアスキーアートを描いて下さい」と依頼したら味わい深い絵を描いて頂けたので、クスっとしたい方はぜひ試してみてください。

最後までお読み頂きありがとうございました。