テーマ
データモデル
D1 (SQLite互換) を前提とする。Drizzle ORM でスキーマ管理する想定。
ERD(骨格)
設計指針
テナント分離
- 全業務テーブルに
tenant_idを必ず持たせる。 - アプリケーション層でテナントスコープ強制(middleware)+ DBクエリ側でも
WHERE tenant_id = :tidを必須化。 - ADMIN は middleware を例外的にバイパス可能(明示フラグでログを残す)。
主キー
- すべて文字列ID(
ULIDまたはnanoid)を採用。 - D1の自動採番(integer)は使わない。
- Why: 分散デプロイ・同期しやすさ・URL露出時の予測困難性。
ソフトデリート
tenants/customers/contractsはdeleted_atを持たせる。- 物理削除は遅延ジョブ + 法令上の保管期間考慮。
暗号化(エンベロープ方式)
- マスタ KEK を Workers Secrets で保管。
- テナント単位の DEK を
tenants.dek_encに KEK で暗号化して保存。 - 業務テーブルの暗号化カラム(
*_encサフィックス)は テナント DEK で AES-256-GCM 暗号化。 - 暗号化対象例:
tenants.dek_enc(KEK で暗号化)line_channels.channel_secret_enc/access_token_encexternal_calendar_links.refresh_token_enccustomers.sensitive_data_enc(要配慮個人情報の JSON)customer_identifiers.value_enc(身分証番号等)payment_provider_settings.api_key_enc/webhook_secret_enc(KEK 直下、システム層)
- 暗号化カラムの単純な等価検索は不可。必要なら blind index を別途検討。
- 詳細はセキュリティ参照。
Better Auth テーブル
- Better Auth が要求するテーブル(
user,session,account,verification等)は別途生成。本ERD のUSERS/SESSIONSはその上のドメイン拡張として組み合わせる方針。
監査ログ
- 後付けで
audit_logsテーブルを追加予定(アクター / 操作 / 対象 / 差分 / IP)。
マイグレーション運用
- Drizzle Kit でスキーマ → SQL を生成
wrangler d1 migrations applyで D1 へ適用- 環境ごと(
dev/staging/production)に独立した D1 データベースを持つ
未確定
- 法人顧客(契約者が法人)モデルの追加(
customers.kind拡張、またはcorporate_customers