Skip to the content.

Entities

DynamoDB シングルテーブル resource-planner には 3 種類のエンティティが格納される。 全アイテムは pk = TEAM#{teamId} で組織ごとにパーティション分割され、 sk のプレフィックスで entity 種別を表現する。

Note: 現時点で app 側の DB アクセスコード (CRUD 実装) は未着手。本ファイルは 将来 entity を実装するときの設計仕様として参照する。実装が入ったら各 entity の Source 列に Go / TypeScript の関数リンクを追記する。

マルチテナント分離

Entity 一覧

App entities (Team scope、pk = TEAM#{teamId})

Entity SK パターン 用途
Resource RES#{resource_id} リソース (人/メンバー)
Project PRJ#{project_id} 案件 (クライアント / 仕事)
Assignment ASN#{start_date}#{assignment_id} 期間内のリソース → 案件アサイン
Team meta META Team 自体のメタデータ (name, createdAt)
Team membership MEMBER#{userId} Team の所属メンバー (role)

Auth.js entities (@auth/dynamodb-adapter 管理、ADR 0008)

Entity PK SK 用途
User USER#{userId} META 認証ユーザー (email, name, emailVerified)
Account USER#{userId} ACCOUNT#{provider}#{providerAccountId} 連携プロバイダ (Magic Link は無し、Microsoft Entra ID 後付け時)
Session SESSION#{token} META DB session (TTL = expires)
VerificationToken VERIFICATION#{token} META Magic Link 一時トークン (TTL = expires)

GSI1 (3 用途を兼用、ADR 0009)

用途 GSI1PK GSI1SK
Auth.js: User by email USER#email#{email} USER#email#{email}
Auth.js: User by account ACCOUNT#{provider} ACCOUNT#{providerAccountId}
App: user → 所属 team 一覧 USER#{userId} TEAM#{teamId}

Resource

人 (メンバー) を表す。各組織内でユニーク。

Field Type 説明
id str (UUID 想定) resource の主キー (sk と内部 attribute の二重保持)
name str 表示名

サンプルアイテム:

{
  "pk": "TEAM#team_default",
  "sk": "RES#01HXYZ...",
  "id": "01HXYZ...",
  "name": "山田 太郎"
}

Project

案件 (クライアント) を表す。

Field Type 説明
id str (UUID 想定) project の主キー
name str プロジェクト名
color str (#RRGGBB) タイムラインでの表示色

サンプルアイテム:

{
  "pk": "TEAM#team_default",
  "sk": "PRJ#01HABC...",
  "id": "01HABC...",
  "name": "Acme 移行案件",
  "color": "#4D72F3"
}

Assignment

「いつ・誰を・どの案件に」割り当てたかを表す関連 entity。

Field Type 説明
id str (ULID) assignment の主キー
resourceId str 紐づく Resourceid (FK 制約は DDB に無い)
projectId str 紐づく Projectid (FK 制約は DDB に無い)
startDate str (YYYY-MM-DD) アサイン開始日 (inclusive、この日を含む)。SK にも埋め込む
endDateExclusive str (YYYY-MM-DD) アサイン終了日の翌日 (exclusive、この日は含まない)。半開区間 [startDate, endDateExclusive) (ADR 0004)

endDateExclusive の解釈: 「5/1〜5/31 のアサイン」 = startDate=2026-05-01, endDateExclusive=2026-06-01。最終作業日 (5/31) ではなく、その翌日 (6/1) を保存する。RFC 5545 / Google Calendar API / PostgreSQL daterange と同じ規約。

サンプルアイテム (2026-05-01 〜 2026-05-31 のアサイン):

{
  "pk": "TEAM#team_default",
  "sk": "ASN#2026-05-01#01HDEF...",
  "id": "01HDEF...",
  "resourceId": "01HXYZ...",
  "projectId": "01HABC...",
  "startDate": "2026-05-01",
  "endDateExclusive": "2026-06-01"
}

設計意図