ChatGPT(GPT-4)にDB設計をさせてみた
はじめに
この記事はChatGPTのDB設計能力を試してみたといったものです。私自身、そこまでプロンプト能力が高いわけでもないので、与えるプロンプトの問題でChatGPTの本来の能力を出し切れていない可能性もあるという点を御了承ください。
私はバックエンドエンジニア新卒3年目で、たまに業務でデータベース設計を行っていて、データベーススペシャリストに合格しています。なので、ある程度のDBの基礎知識はある状態で指示をしていきます。
問題を作成させる
以下のプロンプトを用いて、ER図を描かせるような問題を作ってもらいます。
Webエンジニアにとって馴染みのある題材だが、少し複雑でテンプレで解けないようなDB設計の問題を考えてください。
下記の制約を設けます。
- 問題の内容としては仕様を読んでER図を書くような問題にしてください。
- ER図を作図させる上で、リレーションに0を含むのかどうかを意識させる仕様の書き方をしてください。
- 「概要」・「制約」・「問題」の構成にしてください。
作成された問題
一部Markdownなど整形していますが、文章は原文のままです。
概要
あなたは、大規模な書店のシステムのDB設計を担当しています。このシステムでは、以下のようなデータを扱う必要があります。
- 本: 各本にはタイトル、著者、ジャンル、価格、在庫数などの情報があります。
- 著者: 各著者には名前、国籍、生年月日などの情報があります。
- 書店支店: 各支店には支店名、場所、在庫する本の数などの情報があります。
- 販売履歴: 各販売には購買者、購買した本、支店、販売日、数量などの情報があります。
- 購買者: 各購買者には名前、住所、メールアドレスなどの情報があります。
- キャンペーン: セールや特別価格のキャンペーン情報。特定の本やジャンルに対して、期間限定で割引を適用します。
制約
著者は1人以上の本を書いている場合があるが、本には著者がいない場合もある(例:匿名の著者)。
支店ごとに在庫する本の数や種類が異なります。一部の支店では特定の本を取り扱っていない場合もある。
購買者は購入履歴を持たない場合もある(例:会員登録はしているが、まだ購入していない)。
キャンペーンは特定のジャンルや本に対してのみ適用される場合がある。また、キャンペーンは存在しない期間もある。
問題
これらのデータからER図を描いてください。リレーションに0を含むかどうかを意識しながら、必要なエンティティ、属性、リレーションを正しく配置してください。
模範回答を作成させる
以下のプロンプトを用いて、模範回答を作ってもらいます。
模範回答を作成してください。
下記の制約を設けます。
- ER図はMermaid形式で記述してください。
- 各エンティティ間のリレーションを漏れなく記述してください。
- 各エンティティにはIDを付与してください。
作成された模範回答
Mermaid形式を指定しておけば、何かと便利です。それっぽいER図を描いてくれました。
気になったところを指摘していく
ただ模範回答を作らせるだけだと仕様を満たしていなかったり、細かいけど気になるポイントなどもあります。それを具体的に指摘してみて、どうER図が変化するかを観察してみます。
下記のプロンプトで問題を指摘します。
問題を指摘させてください。必要に応じて指摘を踏まえてER図を修正してください。
- 外部キーの記述が不十分です。リレーションを張る際には適切なエンティティに外部キーを追加してください。
- GENREとBOOKの間の関連が漏れています。BOOKのgenreはgenre_idで表現する必要があります。
- SALEは販売履歴として名前が分かりにくいです。historyなどをつけて履歴であることをわかりやすくしてください。
- 制約に述べられた「匿名の著者」が考慮されていません。BOOKから見たAUTHORは0 or 1の関連を持つはずです。0 or 1はmermaidでは"|o"か"o|"で表現します。例えば、0...1:0...nは"|o--o{"になります。
- キャンペーンの割引を表現するためのデータがありません。
- STOREは複数存在するはずです。BOOKでstock_quantity(在庫数)を持ってしまうと、どのSTOREの在庫なのかがわかりません。STOREとBOOKの連関エンティティを追加すべきです。それに伴って、販売履歴とBOOKの関連は販売管理とその連関エンティティの関連で置き換える必要があるでしょう。
- CAMPAIGNとBOOKは多:多になるはずです。連関エンティティで表現する必要があります。
修正されたER図がこちらです。
具体的に指摘したため、問題を解消してくれました。欲を言えば、自分で設定した要求くらいは満たして欲しかったですね。DB設計に絶対的正解はないので私の好みで修正してもらってる部分はありますが、仕様が実現できていないのは気になります。もしかしたら、mermaid上でのChatGPTの表現力の問題もあるのかもしれません。
仕様変更・追加を要求してみる
下記のプロンプトで仕様追加を要求してみます。スーパタイプとサブタイプのような概念をスキーマに落とし込めるのか、試してみたくなったのでかなりわかりやすく誘導をしています。
下記のように仕様変更してみるとER図はどうなるでしょうか?
- 本は中古と新品の区分が追加される。
- 中古品は会員登録済みの購買者がお店に売ったもので、今回は簡単のために買い取った値段でそのまま販売するとする。
- 購買者からの中古買取も履歴を管理してください。
- 中古品はどの会員から買い取ったものかわかるようにしてください。
- 必要に応じて、スーパータイプとサブタイプを別のテーブルに切り分けてください。
修正されたER図はこちら。
なんと、しっかり指示の意図を汲んで本を新品と中古のサブタイプに分割してくれました。しかも、ちゃんと共通の属性をスーパタイプにまとめています。 これは流石に驚きました。
一方で、新品と中古の概念が導入されたことで 「同じ本であれば同じ値段である」という前提が暗黙的に崩れていることは考慮できていません。書籍情報と本の実体をエンティティとして分離して、BOOK_COMMONとBOOK_INVENTORYの関係を1:0...1になることを考慮してBOOK_COMMONにstore_idを持つようなER図にする必要があるのですが、そこまでは先読みしてくれませんでした。
まとめ
今回はChatGPTにDBのER図の設計をやらせてみました。
結果としては、しっかり制約や条件、設計方針を伝えないと正確なスキーマが得られないので、DBの素人がすぐに納得のいくものを出せるかというとNOかなという感じです。結局はアウトプットされたものの評価を人間がやる必要があるので、AIで全部作れる時代はまだ来なそう。仕様追加も表面的な対応はできますが、注意点や設計方針を与えないと本質的な対応は出来なかったり、自主的に設計の懸念点を提示してくれもしないので、保守運用もAIだけというわけにはいかなそうです。
一方で、自分の設計思想を言語化できてChatGPTの出力に適切に突っ込みが入れられる場合には、忠実に指示に従ってスキーマを変更できるのでDB設計の作業効率化のポテンシャルも感じました。
特に、スーパタイプ・サブタイプを用いた設計は人間でも苦手な人が多いと思うので、そこの部分だけ相談するといった使い方も全然ありっぽいな〜と思いました。
あと、やっててめっちゃ楽しい検証でもあったし、ChatGPTの設計に対してケチをつけ続けるということ自体は勉強になるので、DB初学者はChatGPTと壁打ちやバトルをたくさんやったらいいんじゃないかなと。
Discussion