Skip to content

データモデル・ER図

ステータス: ドラフト(2026-04-15 起案) 対象: M1 で扱う主要エンティティのスキーマ。関連: requirements.md / auth-rbac.md(策定予定) 注意: M1 のモックはインメモリ/JSON でこのスキーマを模擬する。DB・マイグレーションは M2 で ADR-0002 等で正式化する。


1. エンティティ一覧(概要)

エンティティ概要
Organization組織(送出し機関・日本語学校・受入企業)
User利用者(学習者・講師・OA・企業採用 等)
RoleAssignmentUser × Organization × Role の紐付け
Cohort研修期(クラス・期別)
Enrollment学習者 × Cohort 参加記録
Curriculumカリキュラム
CurriculumItemカリキュラム内の項目(単語/動画/クイズ/テスト割当)
VocabularySet単語セット
Vocabulary単語
VocabularyProgress学習者 × 単語 の習得状態
Video動画
VideoWatchLog動画視聴ログ(時間・区間・スキップ)
Quizクイズ
QuizQuestion設問
QuizAttempt受験試行
QuizAnswer回答(試行内の個別回答)
Exam試験
ExamResult試験結果
StudyTimeLog学習時間ログ(申告・実測)
AttendanceLog出席ログ
CredibilityScore学習行動の一貫性スコア
Appeal異議申立
ConsentRecord同意履歴
AuditLog監査ログ
DisclosurePolicy学習者の企業開示可否フラグ

2. ER図(Mermaid)

mermaid
erDiagram
  Organization ||--o{ RoleAssignment : has
  User ||--o{ RoleAssignment : has
  RoleAssignment }o--|| Organization : scopes
  Organization ||--o{ Cohort : manages
  Cohort ||--o{ Enrollment : includes
  Enrollment }o--|| User : learner
  Cohort ||--o{ Curriculum : uses
  Curriculum ||--o{ CurriculumItem : contains
  CurriculumItem }o--|| VocabularySet : may_reference
  CurriculumItem }o--|| Video : may_reference
  CurriculumItem }o--|| Quiz : may_reference
  CurriculumItem }o--|| Exam : may_reference
  VocabularySet ||--o{ Vocabulary : contains
  User ||--o{ VocabularyProgress : tracks
  Vocabulary ||--o{ VocabularyProgress : for
  User ||--o{ VideoWatchLog : watches
  Video ||--o{ VideoWatchLog : has
  Quiz ||--o{ QuizQuestion : contains
  User ||--o{ QuizAttempt : takes
  Quiz ||--o{ QuizAttempt : has
  QuizAttempt ||--o{ QuizAnswer : contains
  QuizQuestion ||--o{ QuizAnswer : answered_by
  User ||--o{ ExamResult : earns
  Exam ||--o{ ExamResult : of
  User ||--o{ StudyTimeLog : logs
  User ||--o{ AttendanceLog : logs
  User ||--o{ CredibilityScore : scored
  User ||--o{ Appeal : raises
  User ||--o{ ConsentRecord : consents
  User ||--o{ DisclosurePolicy : sets
  User ||--o{ AuditLog : acted

3. テーブル定義(主要)

3.1 User

カラム制約備考
iduuidPK
emailtextunique, not null
password_hashtextnot nullbcrypt 等
display_nametext
localetextdefault 'ja'ja/vi/en
statustextdefault 'active'active/suspended/deleted
created_attimestamptz
updated_attimestamptz

3.2 Organization

カラム制約備考
iduuidPK
nametextnot null
kindtextsending/school/employer/training
countrytextJP/VN

3.3 RoleAssignment

カラム制約備考
iduuidPK
user_iduuidFK → User
organization_iduuidFK → Organization
roletextlearner/teacher/org_admin/trainer/employer/sending_manager/operator
created_attimestamptz

3.4 Cohort(研修期/クラス)

カラム制約備考
iduuidPK
organization_iduuidFK
nametext例: 2026年春期 A組
start_datedate
end_datedate
phasetextpre-departure/in-japan-onboarding

3.5 VocabularyProgress

カラム制約備考
iduuidPK
user_iduuidFK
vocabulary_iduuidFK
statustextnew/learning/mastered/forgotten
last_seen_attimestamptz
correct_countintdefault 0
incorrect_countintdefault 0

3.5b QuizAttempt / QuizAnswer

QuizAttempt

カラム制約備考
iduuidPK
user_iduuidFK
quiz_iduuidFK
started_attimestamptznot null
ended_attimestamptz
duration_secondsintnot null, default 0実測所要時間(エンドイベントで確定)
scorenumeric総合スコア
statustextin_progress/submitted/abandoned

QuizAnswer

カラム制約備考
iduuidPK
attempt_iduuidFK → QuizAttempt
question_iduuidFK → QuizQuestion
answerjsonb選択肢ID or 入力文字列
is_correctboolean
response_time_msintnot null設問表示〜回答までの時間

3.6 VideoWatchLog

カラム制約備考
iduuidPK
user_iduuidFK
video_iduuidFK
session_iduuid1視聴セッション
watched_secondsint実再生秒数
distinct_segmentsjsonb[{start, end}, ...] 視聴区間
skipped_segmentsjsonbスキップ区間
completedboolean
created_attimestamptz

3.7 StudyTimeLog

カラム制約備考
iduuidPK
user_iduuidFK
log_datedate
reported_minutesint申告時間
measured_minutesint実測(ログ合算)
sourcetextself-report/calculated

3.8 CredibilityScore

カラム制約備考
iduuidPK
user_iduuidFK
period_startdate
period_enddate
scorenumeric(4,2)0.00 〜 1.00
breakdownjsonb指標ごとのスコア内訳
versiontext算出ロジックのバージョン

3.9 Appeal(異議申立)

カラム制約備考
iduuidPK
user_iduuidFK申立者
target_kindtextcredibility_score/exam_result
target_iduuid
reasontext
statustextopen/reviewing/accepted/rejected
assignee_iduuidFK → UserOA

3.10 ConsentRecord

カラム制約備考
iduuidPK
user_iduuidFK
consent_kindtextlearning_log/employer_disclosure
versiontext文言バージョン
statustextgranted/withdrawn
occurred_attimestamptz

3.11 DisclosurePolicy

カラム制約備考
iduuidPK
user_iduuidFK
employer_org_iduuidFK → Organizationnullable(全企業対象)
visibleboolean企業ロールへの公開可否

3.12 AuditLog

カラム制約備考
iduuidPK
actor_user_iduuidFK → User
actor_roletext
actiontext例: employer.view_report
target_user_iduuid閲覧対象(必要時)
metajsonb
occurred_attimestamptz

4. データ保持ポリシー(ドラフト)

  • 学習ログ(Video/Quiz/StudyTime):学習者アクティブ期間 + 3年(Q5 で確定)
  • 監査ログ:最低 1年(法令準拠で見直し)
  • 同意履歴:撤回後も撤回記録として永続保持(削除しない)
  • 削除請求:ユーザー識別子を匿名化、学習ログを匿名 ID に付け替え(解析上の有用性維持と個人特定不能の両立)

5. 計測指標(計算式ドラフト)

  • 単語習得率 = mastered / total-assigned
  • 実測学習時間 = Σ(VideoWatchLog.watched_seconds + QuizAttempt所要時間) を日別集計
  • 申告 vs 実測乖離 = |reported_minutes - measured_minutes| / reported_minutes
  • 一貫性スコア = 重み付き合算(乖離・スキップ率・回答バラツキ 等)。重み・閾値は別途定義(G4 ゲート)

6. 未確定事項

  • 単語習得判定のアルゴリズム(間隔反復、正答率閾値)
  • 試験の出題形式(紙/オンライン)に伴う Exam スキーマ拡張
  • 越境データ移転のためのフィールド匿名化範囲

7. 改訂履歴

  • 2026-04-15: 初版ドラフト作成

Internal — thriveJobs