コンテンツにスキップ

検索はプロダクションビルドでのみ利用可能です。 ローカルでテストするには、サイトをビルドしてプレビューしてください。

データベース運用

Speakeasy は 2 つの PostgreSQL データベース(Cellar, Vault)を Cloudflare Hyperdrive 経由で利用しています。



項目内容
バージョンv1.0 beta
パッケージ@speakeasy/cellar, @speakeasy/vault
RelationsRelations V2 (defineRelations)
クエリRQBv2(Relational Query Builder v2)

マイグレーションワークフロー

Section titled “マイグレーションワークフロー”
Terminal window
cd packages/cellar
# 1. スキーマファイルを編集後、マイグレーションを生成
bun run generate
# 2. dev 環境に適用
bun run migrate:dev
# 3. 本番環境に適用
bun run migrate:deploy

マイグレーションファイルは packages/cellar/drizzle/ に生成されます。Drizzle Kit が差分を検出し、SQL ファイルを自動生成します。


ブラウザベースの DB 管理ツールで、データの閲覧・編集が可能です。

Terminal window
cd packages/cellar
# dev 環境に接続
bun run studio:dev
# 本番環境に接続(注意して操作)
bun run studio

Hyperdrive によるコネクション管理

Section titled “Hyperdrive によるコネクション管理”

Hyperdrive が自動的にコネクションプーリングとクエリキャッシュを行います:

機能説明
コネクションプーリングWorkers ↔ DB 間の接続を再利用
クエリキャッシュ同一クエリの結果をキャッシュ(有効時)
Smart PlacementDB に近いリージョンで Worker を実行

Penthouse の SQL Explorer(/admin/sql)で:

  1. 「スロークエリ」タブを確認
  2. 「時間帯別統計」で負荷の集中を特定
  3. 「エンドポイント別」で問題のある API を特定

Drizzle スキーマでインデックスが定義されています。新しいクエリパターンを追加する場合は、対応するインデックスの追加を検討してください。

// スキーマ定義でのインデックス例
export const chatMessage = pgTable(
'chat_message',
{
// ...
},
(table) => [
index('idx_chat_message_room_id').on(table.roomId),
index('idx_chat_message_sent_at').on(table.sentAt)
]
);

RQBv2 の with 句を活用して関連データを一括取得:

// OK — JOIN で一括取得
const rooms = await db.query.chatRoom.findMany({
with: {
messages: { limit: 1, orderBy: desc(chatMessage.sentAt) },
contact: true
}
});
// NG — ループ内で個別クエリ(N+1)
for (const room of rooms) {
const messages = await db.query.chatMessage.findMany({
where: eq(chatMessage.roomId, room.id)
});
}

DB オペレーションの計測に Analytics Engine を使用:

// クエリ実行時に自動計測
env.ANALYTICS.writeDataPoint({
blobs: [serviceName, operationType, modelName],
doubles: [durationMs]
});

データは Penthouse の管理ダッシュボード(/admin/database)で可視化されます。


Prisma Postgres を使用している場合、自動バックアップが提供されます。復元が必要な場合は Prisma Console から操作します。

緊急時のデータエクスポート:

Terminal window
# Drizzle Studio 経由でデータを CSV エクスポート
bun run studio:dev
# ブラウザから対象テーブルのデータをエクスポート

  • Cloudflare Dashboard でエラー率を確認
  • DLQ(Dead Letter Queue)にメッセージがないか確認
  • Penthouse の管理ダッシュボードでコスト推移を確認
  • スロークエリの有無を確認
  • Workers の CPU 使用量推移を確認
  • Cloudflare の利用量がプラン制限に近づいていないか確認
  • DB のストレージ使用量を確認
  • R2 バケットのストレージ使用量を確認