0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

進捗管理アプリケーション

0
Posted at

部門案件・人員・スキル・週次進捗管理アプリ 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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?