11
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AIと行うDB設計:箇条書きからリレーション・制約まで自動生成

Posted at

はじめに

社内システムを構築するにあたりDB設計担当となりました。

データベース設計は、システムの根幹をなす重要な工程なので、DB設計初心者にとっては非常にハードルの高い作業となりがちです。

私も5年前に少し触ったことがあるだけであまり自信がなかったですが、生成AIを活用することで箇条書きで記述したテーブルとカラムの情報から、データベース設計の初期フェーズを高速化できました。

この記事では私がやったステップを紹介したいと思います。

本記事で得られること

  • AIを活用したDB設計ワークフロー
  • 箇条書きからのAIによるリレーション・制約推論の具体的な方法
  • DB設計初心者でも高速に初期設計を進めるためのヒント

ステップ1. DBのテーブルとカラムの洗い出しを行う(人間)

まずは要件定義をもとに必要なデータの洗い出しを行いました。この段階ではDBテーブルの大枠をつかむために、詳細なデータ型やリレーションシップ、制約などは記載せず、「どのようなテーブルが必要か」「それぞれのテーブルにはどのようなカラムが必要か」という点に絞って項目の洗い出しだけ行いました。

例えば、簡単なECサイトを想定した場合、以下のような形でテーブル名とカラムを箇条書きで整理します。

【人間が用意する情報例】

## ECサイトのデータベース設計(初期案)

以下のテーブルとカラムを洗い出しました。

*   ユーザー (users)
    *   id
    *   name
    *   email
    *   password_hash
    *   address
    *   created_at
    *   updated_at

*   商品 (products)
    *   id
    *   name
    *   description
    *   price
    *   stock
    *   category_id
    *   created_at
    *   updated_at

*   カテゴリ (categories)
    *   id
    *   name

*   注文 (orders)
    *   id
    *   user_id
    *   order_date
    *   total_amount
    *   status

*   注文詳細 (order_items)
    *   id
    *   order_id
    *   product_id
    *   quantity
    *   price_at_order

ステップ2. 型定義、リレーション、制約はあとで追記する予定でDB定義書を作成(AI)

洗い出したテーブルとカラムの情報をAIに渡します。AIに投げるプロンプトは以下のようになります。

【AIへのプロンプト例】

以下のECサイトのテーブルとカラムのリストを基に、Mysql用のCREATE TABLE文を作成してください。
データ型やリレーション、制約などは、あなたが適切と判断するものを仮で設定してください。

[ここに、ステップ1で人間が用意した箇条書きの情報をペースト]

このプロンプトには、「データ型やリレーション、制約などは、あなたが適切と判断するものを仮で設定してください」と、AIに推論の余地を与える一文を含んでいます。これにより、AIが単に文字起こしするだけでなく、積極的に推論を行うことを促します。

ステップ3. AIが作成したDB定義書のレビューを行う(人間)

私は型などは全てVARCHARで仮置きされたCREATE TABLEの骨格だけ作成されることを想定していました。
しかし、AIが作成したCREATE TABLE文は単なるCREATE TABLE文の骨格だけでなく、適切なデータ型、PRIMARY KEYやFOREIGN KEYによるリレーションシップ、NOT NULLやUNIQUEなどの制約、さらにはDEFAULT値やON UPDATE CURRENT_TIMESTAMPなどの詳細な設定まで自動で付与されたSQLが生成されました。

【AIが生成したCREATE TABLE文の例(一部抜粋)】

-- users テーブル
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    password_hash VARCHAR(255) NOT NULL,
    address TEXT,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- products テーブル
CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    description TEXT,
    price DECIMAL(10, 2) NOT NULL,
    stock INT NOT NULL DEFAULT 0,
    category_id INT,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (category_id) REFERENCES categories(id)
);

-- orders テーブル
CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
    total_amount DECIMAL(10, 2) NOT NULL,
    status VARCHAR(50) NOT NULL DEFAULT 'pending',
    FOREIGN KEY (user_id) REFERENCES users(id)
);

-- order_items テーブル (省略)

この生成されたSQLを見てみると、AIが以下の点を推論していることが分かります。

  • リレーションシップ: orders.user_idusers.idproducts.category_idcategories.idなどの関連を自動で検出し、FOREIGN KEY制約として定義しています。これは、カラム名に_idというサフィックスが付いていることや、一般的なシステムの構造パターンをAIが学習しているためと考えられます。
  • プライマリキーと自動増分: idカラムをPRIMARY KEYおよびAUTO_INCREMENTとして適切に設定しています。
  • データ型: emailVARCHAR(255)priceDECIMALcreated_atDATETIMEなど、カラム名から適切なデータ型を推論しています。
  • 制約: nameemailなど、ビジネス上必須となるカラムにはNOT NULLを付与。また、emailにはUNIQUE制約を付与し、一意性を保証しています。
  • デフォルト値と更新日時: created_atDEFAULT CURRENT_TIMESTAMPupdated_atDEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPを付与し、自動で日時が記録・更新されるように配慮されています。

この段階で、人間は生成されたSQLをレビューし、ビジネス要件やパフォーマンス要件に合致しているかを確認します。AIが提案した内容はあくまで叩き台でしたが、ゼロから考えるよりもはるかに効率よく作業を進めることができました。

シナリオ4. 細かい仕様の調整(AI & 人間)

AIが生成した設計案を基に、さらに詳細な調整を行います。

例えば、レビューの結果、以下のような調整が必要となりました。

  • usersテーブルのaddressは、将来的に住所情報を細分化する可能性があるため、いったんTEXT型ではなくJSON型に変更したい。
  • ordersテーブルのstatusカラムは、特定の文字列しか受け付けないようにENUM型にしたい。
  • 特定のカラムには検索性能向上のため、インデックスを追加したい。

これらの要望は、再度AIにプロンプトとして投げかけ、AIに修正案を生成させることができます。

【AIへの追加プロンプト例】

先ほど生成してもらったECサイトのCREATE TABLE文について、以下の修正をお願いします。

*   usersテーブルのaddressカラムをTEXT型からJSON型に変更してください。
*   ordersテーブルのstatusカラムをVARCHARからENUM('pending', 'processing', 'shipped', 'completed', 'cancelled')型に変更し、デフォルト値を'pending'に設定してください。
*   productsテーブルのnameカラムにインデックスを追加してください。

AIはこれらの指示に従い、速やかに修正されたCREATE TABLE文を生成します。人間はその結果を再度レビューし、必要に応じてさらなる調整を指示します。この繰り返しによりDB設計を完成させることができます。

結論:DB設計初心者でも高速に設計を行うことができた!

AIの推論能力を活用することで、DB設計初心者でも初期のテーブルとカラムの洗い出しさえ行えれば、データ型、リレーションシップ、各種制約といった専門知識が必要な部分の設計を高速かつ高い精度で自動生成できることが分かりました。

このアプローチにより、DB設計の初期段階で陥りがちな「何から手をつけて良いか分からない」「適切な型や制約が分からない」といった障壁を大幅に低減できます。AIが生成した設計案を叩き台として人間がレビュー・調整を行うことで、経験の浅いエンジニアでも短時間で質の高いDB設計を行うことが可能になります。

AIは万能ではありませんが、適切な指示と人間のレビュー・調整を組み合わせることで、DB設計を効率よく進められることを学びました。

11
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?