ありがとうございます。
それでは、第2段階としてデータベース設計(ER設計・テーブル設計)を行います。
今回は将来的な機能追加(メンター、試験、アンケート、ライブ授業など)も考慮し、拡張性を重視した設計にします。
第2段階 DB設計
システム全体ER
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | |
このERをベースに設計します。
テーブル一覧
マスタ
| テーブル | 説明 |
|---|---|
| users | ユーザー |
| roles | 権限 |
| user_roles | ユーザー権限 |
| categories | カテゴリ |
教材
| テーブル | 説明 |
|---|---|
| courses | コース |
| sections | 章(無限階層) |
| lessons | レッスン |
| contents | コンテンツ共通 |
コンテンツ
| テーブル | 説明 |
|---|---|
| video_contents | 動画 |
| text_contents | テキスト |
| quiz_contents | クイズ |
| quiz_choices | 選択肢 |
| file_contents | ファイル |
学習
| テーブル | 説明 |
|---|---|
| learning_histories | 学習履歴 |
| quiz_answer_histories | クイズ回答履歴 |
管理
| テーブル | 説明 |
|---|---|
| approval_histories | 承認履歴 |
| notifications | 通知 |
users
1 2 3 4 5 6 7 | |
SpringSecurityそのまま利用できます。
roles
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
user_roles
複数ロール対応します。
1 2 3 | |
例えば
1 2 3 4 5 6 7 | |
という割り当ても可能になります。
categories
教材カテゴリ
1 2 3 4 5 6 7 | |
こちらも無限階層です。
例
1 2 3 4 5 6 7 | |
courses
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
teacher_idはusersを参照します。
sections
これが教材の木構造です。
1 2 3 4 5 6 7 8 9 10 11 | |
例えば
1 2 3 4 5 6 7 8 9 | |
となります。
lessons
1 2 3 4 5 6 7 8 9 | |
Lessonはコンテンツをまとめる箱です。
contents
ここが一番重要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
全種類共通になります。
video_contents
1 2 3 4 5 6 7 8 9 10 11 | |
video_type
1 2 3 4 5 | |
text_contents
1 2 3 4 5 | |
format
1 2 3 | |
Markdownなら
1 2 3 4 5 6 7 8 9 | |
になります。
quiz_contents
1 2 3 4 5 6 7 8 9 10 11 | |
例えば
1 2 3 | |
なら
1 2 3 | |
になります。
quiz_choices
1 2 3 4 5 6 7 8 9 | |
例えば
1 2 3 4 5 6 7 8 9 10 11 | |
全部ここです。
file_contents
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Cloudflare R2でも
S3でも
ローカルでも
対応できます。
learning_histories
受講履歴
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
progress
1 | |
quiz_answer_histories
1 2 3 4 5 6 7 8 9 10 11 | |
後で分析できます。
approval_histories
教材承認履歴
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
これで
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
が追跡できます。
notifications
1 2 3 4 5 6 7 8 9 10 11 | |
例えば
1 2 3 4 5 | |
などになります。
インデックス設計
性能面では以下のインデックスを推奨します。
| テーブル | インデックス |
|---|---|
| courses | (teacher_id, status) |
| sections | (course_id, parent_section_id, display_order) |
| lessons | (section_id, display_order) |
| contents | (lesson_id, status, content_type, display_order) |
| learning_histories | (student_id, lesson_id) |
| quiz_answer_histories | (student_id, quiz_content_id) |
| approval_histories | (content_id, approver_id) |
監査カラム(全テーブル共通)
更新履歴を追跡しやすくするため、多くのテーブルで以下の共通カラムを持つことをおすすめします。
1 2 3 4 5 6 7 8 9 | |
JPAの監査機能(Auditing)を利用すると、自動設定できます。
ここで見直したい設計ポイント
ここまでの設計でも十分実装可能ですが、さらに拡張性を高めるために、次の2点を第3段階で改善する予定です。
-
コンテンツのバージョン管理
-
公開中の教材を保持したまま編集・再申請できるようにする
-
「下書き」と「公開版」を同時に持てる設計
-
-
教材公開の柔軟な制御
-
コース公開・レッスン公開・コンテンツ公開を分離
-
公開開始・公開終了日時によるスケジュール公開
-
将来的な有料/無料、対象受講者限定公開への対応
-
この2つは実運用では非常に重要なため、第3段階(Springプロジェクト構成設計)の前に取り込むことで、より実践的な教材管理システムになります。