【DB設計】テーブル定義(クエリ)からER図の自動生成

【DB設計】テーブル定義(クエリ)からER図の自動生成 AI

ER図は、エンティティ(実体)間の関連性を示すことができます。
ER図を利用することにより、データベースの構造を直感的に理解することが可能になります。

そのためのツールがいろいろと公開されています。
データベースからER図をリバース生成できるツールも公開されています。

ただ、このようなツールはデータベース設計の最中には利用できません。
通常、設計中はテーブル定義書があるだけです。

そのテーブル定義書からER図を作成できたら便利だと思いませんか?
設計中のため試行錯誤でテーブル定義はコロコロと変わるでしょう。

でも、その段階からER図があればデータベース設計が効率良く進むはずです。
設計の可視化によって、理解が促進されます。

実際、すでにChatGPTでそのことを試している人もいます。
今回は、Claude 3でそのことを試そうということです。

ChatGPT 4よりClaude 3の方が優秀という結果が出ています。
ベンチマーク結果は、次の記事内で説明しています。

【Claude 3】テーブル定義書からER図の自動生成

利用するのは、最も賢いClaude 3 Opusです。
課金が必要となります。

検証のためには、まずテーブル定義書を用意する必要があります。
次の記事内で用いているサンプルデータベースを利用します。

テーブル定義書の該当する部分のみを取得します。
その実体は、DDLファイル(クエリ)になります。

下記でダウンロードできるようにしています。

テーブル定義書とER図|ジコログ
restore.sql 44.8 KB ファイルダウンロードについて ダウンロード

これをClaude 3にアップロードして、プロンプトを加えます。

これだけでER図が作成されるのです。
Mermaid記述ですけどね。

結果的に言うと、次のような出力が出来上がりました。

erDiagram
    Actor {
        int actor_id PK
        varchar first_name
        varchar last_name
        timestamp last_update
    }

    Category {
        int category_id PK
        varchar name
        timestamp last_update
    }

    Film {
        int film_id PK
        varchar title
        text description
        year release_year
        int language_id FK
        int rental_duration
        decimal rental_rate
        int length
        decimal replacement_cost
        enum rating
        timestamp last_update
        text[] special_features
        tsvector fulltext
    }

    Film_Actor {
        int actor_id PK, FK
        int film_id PK, FK
        timestamp last_update
    }

    Film_Category {
        int film_id PK, FK
        int category_id PK, FK
        timestamp last_update
    }

    Language {
        int language_id PK
        char name
        timestamp last_update
    }

    Inventory {
        int inventory_id PK
        int film_id FK
        int store_id FK
        timestamp last_update
    }

    Rental {
        int rental_id PK
        timestamp rental_date
        int inventory_id FK
        int customer_id FK
        timestamp return_date
        int staff_id FK
        timestamp last_update
    }

    Payment {
        int payment_id PK
        int customer_id FK
        int staff_id FK
        int rental_id FK
        decimal amount
        timestamp payment_date
    }

    Staff {
        int staff_id PK
        varchar first_name
        varchar last_name
        int address_id FK
        varchar email
        int store_id FK
        boolean active
        varchar username
        varchar password
        timestamp last_update
        bytea picture
    }

    Customer {
        int customer_id PK
        int store_id FK
        varchar first_name
        varchar last_name
        varchar email
        int address_id FK
        boolean activebool
        date create_date
        timestamp last_update
        int active
    }

    Address {
        int address_id PK
        varchar address
        varchar address2
        varchar district
        int city_id FK
        varchar postal_code  
        varchar phone
        timestamp last_update
    }

    City {
        int city_id PK
        varchar city
        int country_id FK
        timestamp last_update
    }

    Country {
        int country_id PK
        varchar country
        timestamp last_update
    }

    Store {
        int store_id PK
        int manager_staff_id FK
        int address_id FK
        timestamp last_update
    }

    Film }o--|| Language : language_id
    Film ||--o{ Film_Actor : film_id
    Film ||--o{ Film_Category : film_id
    Film ||--o{ Inventory : film_id

    Actor ||--o{ Film_Actor : actor_id
    
    Category ||--o{ Film_Category : category_id
    
    Inventory ||--o{ Rental : inventory_id
    Inventory }o--|| Store : store_id
    
    Rental ||--o{ Payment : rental_id
    Rental }o--|| Customer : customer_id
    Rental }o--|| Staff : staff_id
    
    Staff ||--o{ Payment : staff_id
    Staff |o--|| Store : manager_staff_id
    Staff }o--|| Address : address_id
    
    Customer ||--o{ Payment : customer_id
    Customer }o--|| Address : address_id
    Customer }o--|| Store : store_id
    
    Address }o--|| City : city_id
    
    City }o--|| Country : country_id

    Store }o--|| Address : address_id

ただ、Claude 3と複数回のやり取りを行っています。
関連テーブルのリレーションを表現する際、変なところがありました。

それをClaude 3に指摘して、最終的に上記の出力となっています。
関連テーブル以外は、一発目で問題なしという結果でした。

まあ、とにかくスゴイの一言です。
ER図としての確認は、上記で載せたnoteのページで確認できます。

もちろん、完璧ではないところもあるでしょう。
参考資料として見ると、十分だとは思います。

【ChatGPT 4】テーブル定義書からER図の自動生成

同じDDLファイルを用いて、ChatGPTでも試してみました。
その結果が、以下。

合計3回、DDLを分析しようと試みました。
最終的には、DDLファイルの分析自体は諦めたようです。

ちなみにファイルサイズは、50kb程度に過ぎません。

タイトルとURLをコピーしました