部門案件・人員・スキル・週次進捗管理アプリ DB設計
1. アプリの目的
Flaskアプリケーションで、部門内の以下情報をリレーショナルデータベースで管理する。
- 部門メンバー
- メンバーが担当する案件
- 案件の週次進捗
- 部門目標
- 年度別の部門目標
- 案件と部門目標の紐づけ
- メンバーの保有スキル
- スキル分類
主目的は、以下を見える化すること。
- 誰がどの案件を担当しているか
- 各案件がどの部門目標に貢献しているか
- 各案件の週次進捗はどうなっているか
- 各メンバーがどのスキルを持っているか
- 部門全体で不足しているスキルは何か
2. 使用技術前提
- Webアプリ:Flask
- ORM:SQLAlchemy
- DB:最初はSQLite、将来的にPostgreSQLへ移行可能な設計
- マイグレーション:Flask-Migrate / Alembic を想定
3. 全体ERイメージ
members
├─ project_assignments ─ projects
│ └─ project_goal_links ─ department_goals ─ fiscal_years
│
└─ member_skills ─ skills ─ skill_categories
projects
└─ weekly_progress
4. テーブル一覧
テーブル名 役割
members 部門メンバー情報
projects 案件情報
project_assignments 案件とメンバーの担当関係
weekly_progress 案件ごとの週次進捗
fiscal_years 年度マスタ
department_goals 年度別の部門目標
project_goal_links 案件と部門目標の紐づけ
skill_categories スキル分類マスタ
skills スキルマスタ
member_skills メンバーごとの保有スキル
5. テーブル定義
5.1 members:部門メンバー
目的
部門に所属するメンバーの基本情報を管理する。
カラム定義
カラム名 型 必須 キー 説明
id INTEGER Yes PK メンバーID
name TEXT Yes 氏名
email TEXT No メールアドレス
department TEXT No 部門名
team TEXT No 課・チーム名
position TEXT No 役職
role TEXT No 部門内での役割
is_active BOOLEAN Yes 在籍中かどうか
created_at DATETIME Yes 作成日時
updated_at DATETIME Yes 更新日時
SQL例
CREATE TABLE members (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT,
department TEXT,
team TEXT,
position TEXT,
role TEXT,
is_active BOOLEAN DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
5.2 projects:案件
目的
部門で扱う案件情報を管理する。
カラム定義
カラム名 型 必須 キー 説明
id INTEGER Yes PK 案件ID
project_name TEXT Yes 案件名
description TEXT No 案件概要
project_type TEXT No 案件種別
status TEXT No 案件ステータス
priority TEXT No 優先度
business_unit TEXT No 依頼元の事業部・部門
requester TEXT No 依頼者
business_issue TEXT No 解決したい業務課題
expected_effect TEXT No 期待効果
data_source TEXT No 利用データ・参照データ
poc_required BOOLEAN Yes PoCが必要か
production_required BOOLEAN Yes 本番化を目指すか
ai_related BOOLEAN Yes AI関連案件か
risk_level TEXT No リスクレベル
start_date DATE No 開始日
end_date DATE No 終了予定日
owner_member_id INTEGER No FK 主担当メンバーID
created_at DATETIME Yes 作成日時
updated_at DATETIME Yes 更新日時
ステータス候補
値 意味
idea 案件候補
planning 構想中
poc PoC中
development 開発中
operation 運用中
closed 完了
stopped 停止
案件種別候補
値 意味
ai_agent AIエージェント
chatbot チャットボット
data_analysis データ分析
automation 自動化
education 教育・展開
governance ガバナンス
other その他
SQL例
CREATE TABLE projects (
id INTEGER PRIMARY KEY AUTOINCREMENT,
project_name TEXT NOT NULL,
description TEXT,
project_type TEXT,
status TEXT,
priority TEXT,
business_unit TEXT,
requester TEXT,
business_issue TEXT,
expected_effect TEXT,
data_source TEXT,
poc_required BOOLEAN DEFAULT 0,
production_required BOOLEAN DEFAULT 0,
ai_related BOOLEAN DEFAULT 0,
risk_level TEXT,
start_date DATE,
end_date DATE,
owner_member_id INTEGER,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (owner_member_id) REFERENCES members(id)
);
5.3 project_assignments:案件担当者
目的
案件とメンバーの多対多関係を管理する。
1つの案件に複数メンバーが関わる可能性があるため、projects と members を直接結合せず、中間テーブルを作る。
カラム定義
カラム名 型 必須 キー 説明
id INTEGER Yes PK 担当ID
project_id INTEGER Yes FK 案件ID
member_id INTEGER Yes FK メンバーID
assignment_role TEXT No 案件内での役割
allocation_rate INTEGER No 工数割合。0〜100
start_date DATE No 担当開始日
end_date DATE No 担当終了日
役割候補
値 意味
owner 主担当
sub 副担当
advisor 技術支援
manager 管理者
user_side 事業部側担当
SQL例
CREATE TABLE project_assignments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
project_id INTEGER NOT NULL,
member_id INTEGER NOT NULL,
assignment_role TEXT,
allocation_rate INTEGER,
start_date DATE,
end_date DATE,
FOREIGN KEY (project_id) REFERENCES projects(id),
FOREIGN KEY (member_id) REFERENCES members(id)
);
5.4 weekly_progress:週次進捗
目的
案件ごとの週次進捗を記録する。
基本は案件単位で進捗を記録するが、必要に応じてメンバー単位の進捗も記録できるように member_id を持たせる。
カラム定義
カラム名 型 必須 キー 説明
id INTEGER Yes PK 週次進捗ID
project_id INTEGER Yes FK 案件ID
member_id INTEGER No FK 記入者または担当者
week_start_date DATE Yes 対象週の開始日
progress_summary TEXT No 今週の進捗概要
achievement TEXT No 今週できたこと・成果
issue TEXT No 課題・困りごと
next_action TEXT No 来週やること
status TEXT No 進捗状態
progress_rate INTEGER No 進捗率。0〜100
created_at DATETIME Yes 作成日時
updated_at DATETIME Yes 更新日時
進捗状態候補
値 意味
good 順調
watch 注意
delay 遅延
blocked 停滞
closed 完了
SQL例
CREATE TABLE weekly_progress (
id INTEGER PRIMARY KEY AUTOINCREMENT,
project_id INTEGER NOT NULL,
member_id INTEGER,
week_start_date DATE NOT NULL,
progress_summary TEXT,
achievement TEXT,
issue TEXT,
next_action TEXT,
status TEXT,
progress_rate INTEGER,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (project_id) REFERENCES projects(id),
FOREIGN KEY (member_id) REFERENCES members(id)
);
5.5 fiscal_years:年度マスタ
目的
年度をマスタとして管理する。
部門目標は年度ごとに登録するため、department_goals から参照する。
カラム定義
カラム名 型 必須 キー 説明
id INTEGER Yes PK 年度ID
year INTEGER Yes Unique 年度。例:2026
label TEXT Yes 表示名。例:2026年度
start_date DATE No 年度開始日
end_date DATE No 年度終了日
is_active BOOLEAN Yes 有効年度か
SQL例
CREATE TABLE fiscal_years (
id INTEGER PRIMARY KEY AUTOINCREMENT,
year INTEGER NOT NULL UNIQUE,
label TEXT NOT NULL,
start_date DATE,
end_date DATE,
is_active BOOLEAN DEFAULT 1
);
データ例
year label start_date end_date
2026 2026年度 2026-04-01 2027-03-31
2027 2027年度 2027-04-01 2028-03-31
5.6 department_goals:部門目標
目的
年度別の部門目標を管理する。
部門目標は必ず年度に紐づく。
カラム定義
カラム名 型 必須 キー 説明
id INTEGER Yes PK 部門目標ID
fiscal_year_id INTEGER Yes FK 年度ID
goal_name TEXT Yes 目標名
description TEXT No 目標の説明
kpi TEXT No KPI
target_value TEXT No 目標値
owner_member_id INTEGER No FK 目標オーナー
status TEXT No 状態
created_at DATETIME Yes 作成日時
updated_at DATETIME Yes 更新日時
ステータス候補
値 意味
draft 下書き
active 実行中
closed 完了
stopped 停止
SQL例
CREATE TABLE department_goals (
id INTEGER PRIMARY KEY AUTOINCREMENT,
fiscal_year_id INTEGER NOT NULL,
goal_name TEXT NOT NULL,
description TEXT,
kpi TEXT,
target_value TEXT,
owner_member_id INTEGER,
status TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (fiscal_year_id) REFERENCES fiscal_years(id),
FOREIGN KEY (owner_member_id) REFERENCES members(id)
);
5.7 project_goal_links:案件と部門目標の紐づけ
目的
案件と部門目標の多対多関係を管理する。
1つの案件が複数の部門目標に関係することがある。
また、1つの部門目標に複数の案件が紐づくこともある。
カラム定義
カラム名 型 必須 キー 説明
id INTEGER Yes PK 紐づけID
project_id INTEGER Yes FK 案件ID
goal_id INTEGER Yes FK 部門目標ID
contribution_level TEXT No 貢献度
note TEXT No 補足
貢献度候補
値 意味
high 強く関係
middle 一部関係
low 間接的に関係
SQL例
CREATE TABLE project_goal_links (
id INTEGER PRIMARY KEY AUTOINCREMENT,
project_id INTEGER NOT NULL,
goal_id INTEGER NOT NULL,
contribution_level TEXT,
note TEXT,
FOREIGN KEY (project_id) REFERENCES projects(id),
FOREIGN KEY (goal_id) REFERENCES department_goals(id)
);
5.8 skill_categories:スキル分類
目的
スキルを分類して管理する。
例:
案件推進
プロジェクトマネジメント
技術開発
AI・データ
運用・ガバナンス
業務設計
コミュニケーション
教育・展開
分類は階層化できるように parent_category_id を持たせる。
カラム定義
カラム名 型 必須 キー 説明
id INTEGER Yes PK スキル分類ID
category_name TEXT Yes 分類名
parent_category_id INTEGER No FK 親分類ID
description TEXT No 分類説明
display_order INTEGER No 表示順
SQL例
CREATE TABLE skill_categories (
id INTEGER PRIMARY KEY AUTOINCREMENT,
category_name TEXT NOT NULL,
parent_category_id INTEGER,
description TEXT,
display_order INTEGER,
FOREIGN KEY (parent_category_id) REFERENCES skill_categories(id)
);
分類例
大分類 中分類
案件推進 ヒアリング
案件推進 課題整理
案件推進 要件整理
プロジェクトマネジメント 進捗管理
プロジェクトマネジメント リスク管理
技術開発 Python
技術開発 Flask
AI・データ RAG
AI・データ DataRobot
運用・ガバナンス 権限管理
運用・ガバナンス 評価・監視
5.9 skills:スキル
目的
具体的なスキルを管理する。
スキルは必ずスキル分類に紐づく。
カラム定義
カラム名 型 必須 キー 説明
id INTEGER Yes PK スキルID
skill_name TEXT Yes スキル名
category_id INTEGER Yes FK スキル分類ID
description TEXT No スキル説明
SQL例
CREATE TABLE skills (
id INTEGER PRIMARY KEY AUTOINCREMENT,
skill_name TEXT NOT NULL,
category_id INTEGER NOT NULL,
description TEXT,
FOREIGN KEY (category_id) REFERENCES skill_categories(id)
);
スキル例
分類 スキル
案件推進 事業部ヒアリング
案件推進 課題整理
案件推進 要件整理
案件推進 合意形成
プロジェクトマネジメント WBS作成
プロジェクトマネジメント 進捗管理
プロジェクトマネジメント リスク管理
技術開発 Python
技術開発 Flask
技術開発 SQL
技術開発 GitHub
AI・データ RAG設計
AI・データ ベクトルDB
AI・データ DataRobot
AI・データ プロンプト設計
運用・ガバナンス 権限設計
運用・ガバナンス 評価設計
運用・ガバナンス ログ管理
教育・展開 研修設計
教育・展開 利用者支援
5.10 member_skills:メンバー別スキル
目的
メンバーがどのスキルをどのレベルで保有しているかを管理する。
カラム定義
カラム名 型 必須 キー 説明
id INTEGER Yes PK メンバースキルID
member_id INTEGER Yes FK メンバーID
skill_id INTEGER Yes FK スキルID
skill_level INTEGER No スキルレベル。1〜5
experience_years REAL No 経験年数
evidence TEXT No スキル根拠
note TEXT No 補足
updated_at DATETIME Yes 更新日時
スキルレベル定義
level 意味
1 知識として知っている
2 支援があればできる
3 自力で実行できる
4 他者に教えられる
5 部門内で専門家レベル
SQL例
CREATE TABLE member_skills (
id INTEGER PRIMARY KEY AUTOINCREMENT,
member_id INTEGER NOT NULL,
skill_id INTEGER NOT NULL,
skill_level INTEGER,
experience_years REAL,
evidence TEXT,
note TEXT,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (member_id) REFERENCES members(id),
FOREIGN KEY (skill_id) REFERENCES skills(id)
);
6. リレーション一覧
親テーブル 子テーブル 関係
members projects.owner_member_id 1対多
members project_assignments 1対多
projects project_assignments 1対多
projects weekly_progress 1対多
members weekly_progress 1対多
fiscal_years department_goals 1対多
members department_goals.owner_member_id 1対多
projects project_goal_links 1対多
department_goals project_goal_links 1対多
skill_categories skills 1対多
skill_categories skill_categories.parent_category_id 自己参照
members member_skills 1対多
skills member_skills 1対多
7. 代表的な画面
7.1 案件一覧画面
表示項目:
案件名
ステータス
優先度
主担当
関連部門目標
進捗率
最新週次進捗
課題有無
7.2 案件詳細画面
表示項目:
案件概要
依頼元
業務課題
期待効果
担当メンバー
関連部門目標
週次進捗履歴
次アクション
7.3 週次進捗入力画面
入力項目:
対象案件
対象週
今週やったこと
成果
課題
来週やること
進捗状態
進捗率
7.4 メンバー詳細画面
表示項目:
基本情報
担当案件
案件内の役割
保有スキル
スキルレベル
スキル根拠
週次進捗履歴
7.5 部門目標一覧画面
表示項目:
年度
部門目標
KPI
目標値
オーナー
関連案件数
状態
7.6 スキル一覧画面
表示項目:
スキル分類
スキル名
説明
保有メンバー数
8. MVPとして最初に作る範囲
最初から全テーブルを作ってもよいが、開発の優先順位は以下とする。
Phase 1:案件・人員・週次進捗
最初に作るテーブル:
members
projects
project_assignments
weekly_progress
目的:
誰がどの案件を持っているか
今週何をやったか
何が課題か
来週何をするか
を見える化する。
Phase 2:部門目標・年度管理
追加するテーブル:
fiscal_years
department_goals
project_goal_links
目的:
年度ごとの部門目標を登録する
案件がどの部門目標に貢献しているかを見える化する
Phase 3:スキル管理
追加するテーブル:
skill_categories
skills
member_skills
目的:
メンバーごとのスキルを見える化する
案件に必要なスキルとメンバーのスキルを比較できるようにする
部門全体のスキル不足を把握できるようにする
9. LLMへの実装依頼内容
このDB設計をもとに、以下を作成してほしい。
作成してほしいもの
Flaskアプリケーションの基本構成
SQLAlchemyモデル
Flask-Migrate対応
CRUD画面
Bootstrapを使った簡易UI
案件一覧画面
案件詳細画面
週次進捗登録画面
メンバー一覧画面
部門目標一覧画面
スキル一覧画面
ファイル構成案
department_management_app/
├─ app.py
├─ config.py
├─ models.py
├─ forms.py
├─ routes/
│ ├─ members.py
│ ├─ projects.py
│ ├─ progress.py
│ ├─ goals.py
│ └─ skills.py
├─ templates/
│ ├─ base.html
│ ├─ members/
│ │ ├─ list.html
│ │ ├─ detail.html
│ │ └─ form.html
│ ├─ projects/
│ │ ├─ list.html
│ │ ├─ detail.html
│ │ └─ form.html
│ ├─ progress/
│ │ └─ weekly_form.html
│ ├─ goals/
│ │ ├─ list.html
│ │ └─ form.html
│ └─ skills/
│ ├─ list.html
│ └─ form.html
├─ static/
│ └─ style.css
└─ migrations/
10. 補足設計方針
10.1 正規化方針
メンバー、案件、目標、スキルは別テーブルに分ける
多対多関係は中間テーブルで表現する
スキル分類はマスタ化する
年度は fiscal_years としてマスタ化する
10.2 将来的に追加できる要素
将来的に必要になれば、以下を追加する。
案件に必要なスキルを管理する project_required_skills
案件の課題管理を行う project_issues
案件の成果物リンクを管理する project_artifacts
会議メモを管理する meeting_notes
ダッシュボード集計用ビュー
10.3 現時点では作らないもの
最初のMVPでは以下は作らない。
権限管理
承認フロー
通知機能
詳細な工数管理
ガントチャート
ファイルアップロード
ログイン機能
まずは部門内の案件台帳・週次進捗管理として使えることを優先する。
このままClaudeに渡すなら、最後に次の一文を追加すると精度が上がります。
```markdown
上記の設計に基づき、まずはPhase 1の `members`、`projects`、`project_assignments`、`weekly_progress` を対象に、Flask + SQ