第 9 章

データ永続化

AI を活用してデータベースの開発と管理効率を高める方法を学び、AI 支援によるデータベース設計、クエリ最適化、データ移行などのベストプラクティスを習得します。

Sequential Thinking を使用して AI 駆動のデータ永続化を学ぶ

データベースにおけるAIの応用は複数の側面に関わり、使用構造化思考の方法次の内容を体系的に習得するのに役立ちます:

1
データベース種類の概要
リレーショナル、非リレーショナル、分散データベースを素早く理解
2
AI 支援データベース設計
データモデル生成、Schema 設計、命名規則
3
AI 支援クエリ最適化
スロークエリ分析、SQL 最適化、インデックス推奨
4
AI 支援データ管理
移行スクリプトの生成、データ検証、パフォーマンス調整
5
AI駆動のデータベース運用
監視アラート、自動チューニング、障害診断

データベース種類の概要

3種類のデータベースについて素早く理解し、AI実践のための背景知識を身につける。

リレーショナルデータベース(SQL)

代表:PostgreSQL、MySQL、SQLite

特徴:ACIDトランザクション、構造化データ、複雑なクエリ

適用:トランザクションが必要、データ構造が固定、複雑なクエリ

リレーショナルではないデータベース(NoSQL)

代表:MongoDB(ドキュメント)、Redis(キー・バリュー)、Cassandra(カラム指向)、Neo4j(グラフ)

特徴:柔軟なモード、水平スケーリング、高性能な読み書き

適用:半構造化データ、高並行読み書き、柔軟なスキーマ

分散データベース

代表:SelectDB(Apache Doris)、SAP HANA、ClickHouse、TiDB、Snowflake

特徴:分散アーキテクチャ、大規模データ分析、ベクトル検索をサポート

適用:ビッグデータ分析、リアルタイム OLAP、AI/ML シナリオ、ベクトル検索

AI におけるデータベースのベストプラクティス

AI を活用してデータベース開発と管理の効率を高め、設計から運用までの全工程にわたる AI 支援実践を行う。

AI 支援データベース設計

AI を使ってデータモデルを生成する

AI に業務要件を説明すると、Prisma Schema または TypeORM Entity を生成します:

Prompt テンプレート:

ブログシステムのデータベースモデルを設計する必要があります。以下の要件を含めてください:
1. ユーザーテーブル:id、ユーザー名、メール、パスワードハッシュ、作成時間
2. 記事テーブル:id、タイトル、内容、著者ID(外部キー)、カテゴリID(外部キー)、作成時間、更新時間
3. カテゴリテーブル:id、名前、説明
4. タグテーブル:id、名前
5. 記事とタグは多対多の関係

Prisma Schema を生成してください。以下を含めてください:
- すべてのフィールドの型と制約
- テーブル間の関係
- 必要なインデックス
- Prisma のベストプラクティスに従う

AI 生成の Prisma Schema の例

// prisma/schema.prisma
model User {
  id        String   @id @default(cuid())
  username  String   @unique
  email     String   @unique
  passwordHash String @map("password_hash")
  createdAt DateTime @default(now()) @map("created_at")
  updatedAt DateTime @updatedAt @map("updated_at")
  
  posts     Post[]
  
  @@map("users")
}

model Post {
  id          String   @id @default(cuid())
  title       String
  content     String   @db.Text
  authorId    String   @map("author_id")
  categoryId  String   @map("category_id")
  createdAt   DateTime @default(now()) @map("created_at")
  updatedAt   DateTime @updatedAt @map("updated_at")
  
  author      User     @relation(fields: [authorId], references: [id])
  category    Category @relation(fields: [categoryId], references: [id])
  tags        PostTag[]
  
  @@index([authorId])
  @@index([categoryId])
  @@map("posts")
}

model Category {
  id          String   @id @default(cuid())
  name        String   @unique
  description String?
  posts       Post[]
  
  @@map("categories")
}

model Tag {
  id    String    @id @default(cuid())
  name  String    @unique
  posts PostTag[]
  
  @@map("tags")
}

model PostTag {
  postId String @map("post_id")
  tagId  String @map("tag_id")
  
  post   Post   @relation(fields: [postId], references: [id])
  tag    Tag    @relation(fields: [tagId], references: [id])
  
  @@id([postId, tagId])
  @@map("post_tags")
}

AI 支援の命名規則

AI を使って命名の一貫性を確保する:

Prompt:

以下の Prisma Schema の命名がベストプラクティスに従っているか確認してください:
- テーブル名は複数形を使用する
- フィールド名は camelCase を使用する
- 外部キー フィールドはテーブル名 + Id 形式を使用する
- 時間フィールドは createdAt/updatedAt を使用する

[Schema コードを貼り付け]

規約に合わない箇所を指摘し、修正案を示してください。

データモデル設計の基礎

中核概念を保持し、AI 実践の基礎を提供する。AI を使用すると、ベストプラクティスに沿ったデータモデルをすばやく生成できます。

表構造設計

  • 標準化:データの冗長性を減らし、一貫性を保つ
  • フィールドタイプ:適切なデータ型を選択する
  • 命名規則:テーブル名、フィールド名は規約に従う

関係設計

  • 1対1:ユーザーとユーザープロフィール
  • 1対多:ユーザーと注文
  • 多対多:ユーザーとロール(中間テーブル経由)

インデックス基礎

  • 主キーインデックス:自動作成、一意かつ空でない
  • 通常インデックス:クエリを高速化
  • 複合インデックス:複数フィールドの組み合わせインデックス

AI 支援設計の例

AI に業務要件を説明すると、テーブル構造、関係、インデックス、制約を含む完全なデータモデルを生成できます。詳しい例は上記の「AI 支援データベース設計」章を参照してください。

データ移行の基礎

コアの移行フローは維持し、AI が移行をどのように支援するかに重点を置いて示す。AI を使うことで、移行スクリプトを素早く生成し、結果を検証できる。

移行ツール

  • Prisma Migrate:移行スクリプトを自動生成する
  • TypeORM Migrations:Migration クラスを手動で作成する
  • Flyway/Liquibase:Java エコシステム移行ツール

移行戦略

  • フィールドを追加:デフォルト値を使用するか、NULLを許可する
  • フィールドを削除する:まず廃止としてマークし、その後削除
  • フィールドの型を変更する:データ変換が必要な場合がある
  • テーブル/フィールドの名前変更:2段階法を使用する

AI による移行支援

AI は移行スクリプトの生成、移行結果の検証、移行パフォーマンスの最適化ができます。詳細な例と Prompt テンプレートについては、上記の「AI 支援データ移行」セクションを参照してください。

実践例

実際のコード例を通じて、AI を使ってデータベース開発の効率を高める方法を学びます。

AI生成データモデル

Prisma Schema の完全な生成例(Prompt + 結果):

// 1. AI に要件を伝える
Prompt: "ユーザー、商品、注文、注文明細テーブルを含む、EC システムのデータベースを設計してください..."

// 2. AI が生成した Prisma Schema
model User {
  id        String   @id @default(cuid())
  email     String   @unique
  name      String?
  orders    Order[]
  createdAt DateTime @default(now())
}

model Product {
  id          String      @id @default(cuid())
  name        String
  price       Decimal     @db.Decimal(10, 2)
  description String?
  orderItems  OrderItem[]
  createdAt   DateTime    @default(now())
}

model Order {
  id         String     @id @default(cuid())
  userId     String
  user       User       @relation(fields: [userId], references: [id])
  items      OrderItem[]
  total      Decimal    @db.Decimal(10, 2)
  status     String     @default("pending")
  createdAt  DateTime   @default(now())
  
  @@index([userId])
}

model OrderItem {
  id        String   @id @default(cuid())
  orderId   String
  productId String
  order     Order    @relation(fields: [orderId], references: [id])
  product   Product  @relation(fields: [productId], references: [id])
  quantity  Int
  price     Decimal  @db.Decimal(10, 2)
  
  @@index([orderId])
  @@index([productId])
}

AI によるクエリ最適化

遅いクエリの分析と最適化の例(Prompt + 最適化前後の比較):

最適化前(2.3 秒)
SELECT u.*, p.*, c.name
FROM users u
LEFT JOIN posts p ON u.id = p.author_id
LEFT JOIN categories c ON p.category_id = c.id
WHERE u.created_at > '2024-01-01'
ORDER BY u.created_at DESC
LIMIT 20;
AI 最適化後(0.15 秒)
-- AI の提案:インデックスを追加し、JOIN を最適化する
CREATE INDEX idx_users_created_at ON users(created_at DESC);

SELECT u.*, 
       (SELECT json_agg(p) FROM posts p WHERE p.author_id = u.id) as posts,
       c.name as category_name
FROM users u
LEFT JOIN categories c ON c.id = (
  SELECT category_id FROM posts 
  WHERE author_id = u.id 
  ORDER BY created_at DESC 
  LIMIT 1
)
WHERE u.created_at > '2024-01-01'
ORDER BY u.created_at DESC
LIMIT 20;

NL2SQL 実装

自然言語から SQL への完全な例:

// NL2SQL 関数の実装
async function nl2sql(question: string, schema: DatabaseSchema): Promise<string> {
  const prompt = `データベースの Schema に基づいて、質問を SQL に変換してください:

Schema: ${JSON.stringify(schema)}
質問: ${question}

SQL のみを返し、パラメータ化クエリを使用してください。`;

  const sql = await callLLM(prompt);
  return validateAndSanitizeSQL(sql);
}

// 使用例
const sql = await nl2sql(
  "直近 1 週間に作成されたすべての記事とその著者情報を検索する",
  { tables: { users: [...], posts: [...] } }
);
// 戻り値: SELECT p.*, u.name as author_name 
//       FROM posts p 
//       JOIN users u ON p.author_id = u.id 
//       WHERE p.created_at > NOW() - INTERVAL '7 days'

ベクトルデータベース統合

RAG シナリオにおけるベクトル検索の例:

// RAG 完全なフロー
async function ragQuery(question: string) {
  // 1. 質問のベクトル化
  const questionEmbedding = await getEmbedding(question);
  
  // 2. ベクトル検索(Pinecone)
  const results = await pineconeIndex.query({
    vector: questionEmbedding,
    topK: 5,
    includeMetadata: true
  });
  
  // 3. コンテキストを構築
  const context = results.matches
    .map(m => m.metadata?.text)
    .join('\n\n');
  
  // 4. LLM が回答を生成
  const answer = await generateAnswer(question, context);
  
  return answer;
}

// 使用
const answer = await ragQuery("Prisma とは何ですか?");
// AI は検索された文書に基づいて正確な回答を生成する

学習成果

この章を終えると、あなたは:

  • 13種類のデータベース(リレーショナル、非リレーショナル、分散型)と、それぞれの適用シーンを理解する
  • 2AI を活用したデータベース設計の方法を習得する(Schema の生成、命名規則、データ型の選択)
  • 3AI を使ってスロークエリを分析・最適化し、インデックスの推奨や SQL 最適化案を生成できる
  • 4NL2SQL の実装原理を理解し、自然言語クエリシステムを構築できる
  • 5RAG シナリオにおけるベクトルデータベースの活用を理解し、ベクトル検索機能を統合できる
  • 6AI支援のデータベース運用保守(監視アラート、性能予測、障害診断)に使用できる
  • 7AIを活用したデータ移行の方法を習得する(移行スクリプトの生成、移行結果の検証)