本記事は 2026/02/01 ~ 2026/03/02 の間毎日 AI アプリケーション開発(AI を搭載したアプリ開発 or AI を使用した開発)をテーマに 30 days AI challenge を行う 28 日目のブログポストです。
日ごろデータベースの運用には携わっていますが、データベース設計をする機会が無いので、データベース設計を体系的に学べる AI アプリを作りました。
アプリ概要
AI がシナリオを作り、そのシナリオ通りにデータベース設計を行います。
様々なビジネス/アプリケーション要件を AI が提案し、その中から難易度に合わせてテーマを選択することができます。

データベース側の仕様や設計はユーザーが学びながら行いますが、それ以外の要件は AI が提案してくれます。
その仕様をもとに、あなたはデータベース設計担当者として、データベースの設計やテーブル定義、クエリなどを設定していきます。
設計の上で AI がヒントを出してくれたりテンプレートを表示してくれます。また、AI レビューの実装もあるため、ユーザーが設計した内容を AI に点数付け、フィードバックをもらうことができます。

データベース設計の各フェーズを個別に学習する機能もあります。
まずはこちらで学んでから実際のワークスペースでの学習に移るのもよいです。

SQL クエリの実装も学習に含まれるため、実際に SQL Server に接続してクエリを実行できる機能も実装しています。
SSMS のようにデータベースに接続したらテーブル一覧やクエリエディタが表示され、SQL を実行できます。もちろん実行プランを表示する機能も搭載しています(SSMS のように SQL をハイライトしたらハイライトした箇所だけ実行する動きにしました)。

※テーブル名や接続情報はマスク済み
技術要素
今回も Microsoft.Data.SqlClient 名前空間(データライブラリ)を使用しています。データベース接続時の接続文字列の生成は SqlConnectionStringBuilder を使用しています(windows auth はいらないかも)。
// Models/DBMasterModels.cs (L155-170)
public string BuildConnectionString()
{
var sb = new SqlConnectionStringBuilder
{
DataSource = Server,
InitialCatalog = DatabaseName,
TrustServerCertificate = TrustServerCertificate,
ConnectTimeout = ConnectTimeout
};
if (AuthType == "WindowsAuth")
sb.IntegratedSecurity = true;
else
{
sb.UserID = UserId ?? "";
sb.Password = Password ?? "";
}
return sb.ConnectionString;
}
実行プラン XML をそのまま取得/表示する機能もありますが、Showplan XML から StmtSimple / RelOp を抽出し、推定行数・IOコスト・CPUコストといった一部要素を抜き出して簡易表示させています。
private static string FormatExecutionPlan(string xml)
{
var doc = XDocument.Parse(xml);
var ns = doc.Root?.GetDefaultNamespace() ?? XNamespace.None;
var stmts = doc.Descendants(ns + "StmtSimple").ToList();
foreach (var stmt in stmts)
{
var subtreeCost = stmt.Attribute("StatementSubTreeCost")?.Value;
var relOps = stmt.Descendants(ns + "RelOp").ToList();
foreach (var op in relOps)
{
var physOp = op.Attribute("PhysicalOp")?.Value; // "Clustered Index Scan" etc.
var logOp = op.Attribute("LogicalOp")?.Value; // "Table Scan" etc.
var estIO = op.Attribute("EstimateIO")?.Value;
var estCPU = op.Attribute("EstimateCPU")?.Value;
}
}
}
各ページで AI を呼び出す箇所では、過去に AI 生成をした箇所にて再度 AI 生成を行わせないようにキャッシュを活用しています。
毎回 AI 生呼び出しをすると token の消費が大変ですからね。
private readonly Dictionary<string, string> learningContentCache = new();
private async Task LearnTopicAsync()
{
var cacheKey = GetCacheKey(selectedLearningCategory, topic);
// キャッシュヒット → AI呼出不要
if (learningContentCache.TryGetValue(cacheKey, out var cached))
{
learningContent = cached;
return;
}
// キャッシュミス → AI生成 → キャッシュ保存
learningContent = await Service.GetIndividualLessonAsync(topic);
learningContentCache[cacheKey] = learningContent;
}
AI 呼び出し箇所は以下の通りです(Claude に抜き出してもらいました)。
| # | 機能名 | 呼出元 | 入力 | AI への指示概要 | 出力形式 | 後処理 |
|---|---|---|---|---|---|---|
| 1 | シナリオ自動生成 | ホームタブ「シナリオ生成」ボタン | 既存シナリオのタイトル一覧(重複排除用) | 初級・中級・上級の3シナリオを業種・システム種別・要件付きで生成 | JSON | ExtractJson → JsonSerializer.Deserialize でパースし DB に保存 |
| 2 | フェーズレビュー(AI採点) | ワークスペースタブ「AIレビュー」ボタン | ユーザーが記述した設計成果物 + シナリオ要件 + フェーズ情報 | 良い点・改善点・不足要素・SQL Server固有の注意点を列挙し、100点満点で採点 | Markdown + 末尾に SCORE:XX | レスポンスを行分割し SCORE: 行を検出して int に変換、フィードバック本文と分離して DB に保存 |
| 3 | Q&A(質問応答) | フローティングQ&Aパネルの送信 | ユーザーの質問 + 現在のフェーズ情報 + シナリオ要件 | SQL Server DB設計の専門家として、T-SQL例やベストプラクティスを含めて回答 | Markdown | そのまま表示し、質問・回答のペアを DB の テーブルに保存 |
| 4 | AIクエリ生成 | DB Labタブ「AI生成」ポップアップ | ユーザーの自然言語リクエスト + 接続先DBの実テーブル一覧 + シナリオコンテキスト(任意) | リクエストに合ったT-SQLクエリを生成 | Markdown(SQLコードブロック付き) | 正規表現 ```sql ... ``` でSQLブロックを抽出し、クエリエディタに反映 |
| 5 | デモデータ生成 | DB Labタブ「デモデータ生成」 | 対象テーブルのDDL + 生成件数 | 参照整合性を満たす日本語の現実的なINSERT文を生成 | SQL(INSERT文のみ) | そのままクエリエディタに反映して実行可能 |
| 6 | 個別学習コンテンツ生成 | 個別学習タブ「学習開始」ボタン | 選択されたカテゴリ・トピック名(44トピックから選択 or 自由入力) | SQL Server に特化した学習コンテンツを体系的に生成 | Markdown | 表示後 Dictionary<string,string> にキャッシュし、同一トピック再訪問時はAI呼出をスキップ |
| 7 | ヒント生成 | ワークスペースタブ「ヒント」ボタン | 現在のフェーズ情報 + シナリオ要件 + ユーザーの作業途中の内容 | 答えを直接教えず、考え方のガイド・よくある間違い・次のステップを提示 | Markdown | そのまま表示(DB保存なし) |
終わりに
今日のアプリは割と自分にとっては実用性のあるアプリができました。
生成 AI を呼び出す際は、できる限り不要な呼び出しを行わないようにデータベースでの管理やキャッシュ管理を適宜行うのがよさそうです。
今回 AI でコード生成をさせる際に、できるだけ細かく “こういう仕様にして、このページにはこういう機能で、データベース設計とは。。。” と非常に細かい指示を出してベースを作ってもらいました。xxx を作成して、のような簡単なプロンプトだとかなりぶれのある(AI 任せな)アプリができますが、できる限り細かい仕様や要件を記載することで自分の想定したアプリに近いもの、また不具合の少ないアプリを作れます。
こういうところでは、やはりその分野の専門知識が必要になってきますね。
ただし、専門性が無くても、その分野の詳細や、事前にどういう機能が必要なのか、どういう点を気を付けるべきかなど専門的なことを生成 AI に洗い出してもらい、その内容をコード生成 AI に再度読み込ませる、という二段階を踏めばよさそうです。
今日も最後までご覧いただきありがとうございました。30 days AI challenge も残すところ後 2 日!!

コメント