Skip to content

データモデル

D1 (SQLite互換) を前提とする。Drizzle ORM でスキーマ管理する想定。

ERD(骨格)

設計指針

テナント分離

  • 全業務テーブルに tenant_id を必ず持たせる。
  • アプリケーション層でテナントスコープ強制(middleware)+ DBクエリ側でも WHERE tenant_id = :tid を必須化。
  • ADMIN は middleware を例外的にバイパス可能(明示フラグでログを残す)。

主キー

  • すべて文字列ID(ULID または nanoid)を採用。
  • D1の自動採番(integer)は使わない。
    • Why: 分散デプロイ・同期しやすさ・URL露出時の予測困難性。

ソフトデリート

  • tenants / customers / contractsdeleted_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_enc
    • external_calendar_links.refresh_token_enc
    • customers.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