PostgreSQL
UZU プロジェクトにおける PostgreSQL データベースの設計と管理。
概要
PostgreSQL は、UZU プロジェクトのメインデータベースとして使用される、高機能なオープンソースリレーショナルデータベースです。複数のサービスで独立したデータベースを管理しています。
データベース構成
サービス別データベース
- uzu_development: メインアプリケーション用
- account_service: アカウント管理サービス用
- mdms_jp: マダミス.jp 用(独立 DB)
ポート割り当て
.ports ファイルで各サービスのポートを管理:
bash
BACKEND_DB_PORT=6001 # メインDB
ACCOUNT_DB_PORT=6002 # アカウントサービス
MDMS_JP_DB_PORT=6004 # マダミス.jp接続方法
Docker 環境での接続
bash
# psqlコマンドでの接続
PGPASSWORD=password psql -h localhost -p 6001 -U postgres -d uzu_development
# 環境変数設定
export DATABASE_URL="postgresql://postgres:password@localhost:6001/uzu_development"TablePlus での接続
- 新規接続作成
- 以下の情報を入力:
- Host: localhost
- Port:
.portsファイル参照 - User: postgres
- Password: password
- Database: 対象の DB 名
スキーマ管理
Ent ORM (Go)
バックエンドでは Ent ORM を使用:
bash
# スキーマ生成
go generate ./ent
# マイグレーション実行
go run ./cmd/migratePrisma (JavaScript)
フロントエンド・Node.js アプリでは Prisma を使用:
bash
# スキーマ同期
npx prisma generate
# マイグレーション作成
npx prisma migrate dev --name migration_name
# マイグレーション適用
npx prisma migrate deployデータベース操作
よく使うクエリ
sql
-- テーブル一覧
\dt
-- テーブル構造確認
\d table_name
-- データ件数確認
SELECT COUNT(*) FROM table_name;
-- 最新データ確認
SELECT * FROM table_name ORDER BY created_at DESC LIMIT 10;バックアップとリストア
bash
# バックアップ
pg_dump -h localhost -p 6001 -U postgres uzu_development > backup.sql
# リストア
psql -h localhost -p 6001 -U postgres uzu_development < backup.sqlパフォーマンス最適化
インデックス設計
sql
-- 頻繁に検索される列にインデックス作成
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_scenarios_status ON scenarios(status);
-- 複合インデックス
CREATE INDEX idx_plays_user_scenario ON plays(user_id, scenario_id);クエリ最適化
sql
-- 実行計画の確認
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com';
-- スロークエリの特定
SELECT query, calls, mean_exec_time
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 10;トラブルシューティング
接続エラー
bash
# Dockerコンテナ確認
docker ps | grep postgres
# ログ確認
docker logs app_db_1
# ポート確認
lsof -i :6001データベースリセット
bash
# 開発環境でのリセット
task backend:seed
# Dockerボリューム削除(完全リセット)
docker volume rm app_db_volumeロック解除
sql
-- アクティブなロックを確認
SELECT * FROM pg_locks WHERE granted = false;
-- 長時間実行中のクエリを確認
SELECT pid, now() - query_start AS duration, query
FROM pg_stat_activity
WHERE state != 'idle'
ORDER BY duration DESC;
-- プロセスを強制終了
SELECT pg_terminate_backend(pid);セキュリティ
アクセス制御
- 本番環境では強力なパスワードを使用
- ロール別のアクセス権限設定
- SSL/TLS 接続の強制
監査ログ
sql
-- 監査ログ有効化
ALTER SYSTEM SET log_statement = 'all';
ALTER SYSTEM SET log_connections = on;
ALTER SYSTEM SET log_disconnections = on;