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?

【タスク管理】生成AIを使いつつつDB設計をば【#4】

0
Last updated at Posted at 2026-09-22

生成AIとの付合いと開発順序の見直し

このタスク管理ツールを作るにあたって、なるべくは
生成AIを使わないでやっていこうと思ったが、
あるものは使って楽したくなるのが人の性ってやつで、
Geminiに協力してもらって、手順の見直しを図ったら
こうなりました。

フェーズ0:データ構造と基盤設計
    まずはCSVや画面に依存しない「統一データモデル」を定義します。

    ステップ1: DBスキーマ設計とデータ型の統一
        可変ツリー構造(parent_task_id)、依存関係テーブル、担当者履歴テーブルの定義。
        日時精度(日時・日単位)をブレさせないため、DB内の時刻データ型をISO8601文字列またはUnixタイムスタンプに一元化。

    ステップ2: Pythonでのデータモデル(Class)と自動計算ロジックの実装
        タスクオブジェクトの定義と、重要度合成スコア(日ごと×当日)の計算ロジック実装。
        依存関係の循環参照(デッドロック)を防止するDAG(有向非巡回グラフ)チェック関数の作成。

フェーズ1:データ層の作成(CUI & DB / CSV)
画面を作る前に、データの保存・読込処理を確定させます。

    ステップ3: SQLCipher(DB)の接続・CRUD処理の実装
        PythonからSQLCipherへ接続し、タスクの作成・読み出し・更新・削除(CRUD)を行うデータアクセス層(Repository)を作成。

    ステップ4: CSVインポート/エクスポート機能の実装(CUI)
        「CSV ⇔ DB」の変換ロジックをCUIで実装(※CSVに直接依存させるのではなく、DBのデータをCSV形式で出力・取り込む機能として位置付け)。

フェーズ2:GUI基本機能(マトリクス表示 & データ同期基盤)
操作の拠点となるマトリクス(テーブル/ツリー)画面を作り、データ更新の仕組みを確立します。

    ステップ5: PySide6によるマトリクス(ツリー)表示
        QAbstractItemModel または QTreeWidget を使用し、DBのデータを可変階層構造でGUIに描画。

    ステップ6: 単方向データフロー(更新・同期)の実装
        GUI上でのセル編集・行追加・削除イベントを発生させ、「GUI操作 → DB更新 → GUI再描画」を一元的に処理するシグナル設計(無限ループ防止)。

    ステップ7: 起動時自動判定ロジックの実装
        アプリ起動時に「期日」と「現在日時」を比較し、ステータス(順調・遅延)や日ごと重要度(今週中→今日中など)を自動一括更新する処理を追加。

フェーズ3:マルチビュー展開(看板形式)
データ構造が整った状態で、マトリクス以外の見せ方を追加します。

    ステップ8: 看板(カンバン)ビューの表示
        マトリクスのデータを元に「未着手 / 作業中 / 完了 / 中断」のレーンを作成。
        フィルタースイッチ(今日 / 今週 / 今月)を設置し、表示対象カードを切り替え。

    ステップ9: 看板上でのステータス変更・並び替え
        ドラッグ&ドロップまたはステータス変更操作を、ステップ6で作った共通DB更新ロジックへ流す。

フェーズ4:ガントチャート機能の実装(最難関)
最難関となるガント描画を、土台が完成したこのタイミングで組み込みます。

    ステップ10: マトリクス連動型のガントチャート描画(閲覧メイン)
        マトリクスのタスク行と同期したタイムライン描画(日・週・月表示の切り替え)。

    ステップ11: ガントチャート上での依存関係(前後関係)の視覚化
        先行タスクと後続タスクを繋ぐ矢印線の描画。

    ステップ12: ガントチャートからの双方向編集(操作 → マトリクス・看板反映)
        ガントバーの期間変更やドラッグ操作イベントを受け取り、DBを更新して全画面(マトリクス・看板)へ変更を波及させる。

フェーズ5:セキュリティ・最終調整
実用に向けた最終仕上げを行います。

    ステップ13: DBの暗号化(SQLCipher鍵管理)の適用
        アプリ起動時にパスワード入力を求め、DBを完全暗号化状態で開くセキュリティ処理を適用。

    ステップ14: 担当者遷移履歴・例外ハンドリングのGUI化
        担当変更ログの表示ダイアログや、CSVインポート時のエラー判定などの仕上げ。

ほんと良くできてますよ、正直DB設計は後回しでいいかと思っていたけども、
先にやったほうが骨組みが固まるという意味でいいんだろうなーと

今回はそんなgeminiと決めた手順の第0会のDB設計をやってみました。

##DB設計について
今回使うのはSQLiteになるので、実務で使っている
SQLSERVERと違うところもあり、ちょっと戸惑ったけども、
geminiの助けもあり、無事できたものがこちら

データベース詳細設計書 (SQLCipher)

1. 概要・共通仕様

  • 物理DB: SQLCipher(SQLite3互換暗号化データベース)
  • 文字コード: UTF-8
  • 日時精度・書式: YYYY-MM-DD hh:mm:ss(ISO8601準拠テキスト形式 / 19桁)
  • キー採番方針:
    • 主キー(PK)は基本的に INTEGER PRIMARY KEY AUTOINCREMENT(自動採番)を使用。
    • 識別コード(PJ_CD, TASK_CD, WORKER_ID)は表示・CSVインポート/エクスポート用のユニークキーとして定義(CHECK(length(...) = 10) により右詰めスペース埋め等の10桁固定長を強制)。

2. ER図 (Entity Relationship Diagram)


3. テーブル一覧

物理テーブル名 論理テーブル名 主な役割
PROJECTS プロジェクトテーブル タスクをグループ化して管理する上位プロジェクト情報
TASKS タスクテーブル タスクの基本情報(名称・ステータス・階層構造等)
PRIORITY 重要度テーブル タスクの2軸重要度(日ごと/当日)と計算された合成スコア
SCHEDULES 予定テーブル タスクの予定期間(開始〜終了)および履歴フラグ
WORKLOGS 実績テーブル タスクに対する実際の作業時間ログ(複数回の中断・再開に対応)
INDEPENDENCY 依存関係テーブル 先行タスクと後続タスクの関連性(多対多対応)
ASSIGNMENT 担当テーブル 予定または実績に対する作業担当者の割り当て
ASSIGNMENT_LOG 担当履歴テーブル 担当者変更の追跡ログ(単体完結型)
M_WORKER 担当マスタテーブル 作業担当者のマスター情報
M_PRIORITY 重要度マスタテーブル 重要度(日ごと/当日)の名称・順序・重み付けマスター

4. テーブル詳細定義書

1. プロジェクトテーブル (PROJECTS)

物理カラム名 論理カラム名 データ型 PK FK UK NotNull 初期値・制約事項
PJ_NO プロジェクト番号 INT ○ - - ○ AutoIncrement
PJ_CD プロジェクトコード TXT - - ○ ○ 右詰めスペース(10桁固定)
PJ_NM プロジェクト名 TXT - - - ○ -
UPD_DATETIME 更新日時 TXT - - - ○ YYYY-MM-DD hh:mm:ss

2. タスクテーブル (TASKS)

物理カラム名 論理カラム名 データ型 PK FK UK NotNull 初期値・制約事項
PJ_NO プロジェクト番号 INT - ○ - ○ FK: PROJECTS.PJ_NO
TASK_NO タスク番号 INT ○ - - ○ AutoIncrement
TASK_CD タスクコード TXT - - ○ ○ 右詰めスペース(10桁固定)
NAME タスク名 TXT - - - ○ -
TASK_MEMO タスクメモ TXT(MAX) - - - - -
STATUS ステータス INT - - - ○ 初期値 1 (1:未着, 2:作業中, 3:完了, 4:中断)
PARENT_TASK_NO 親タスク番号 INT - ○ - - FK: TASKS.TASK_NO(可変ツリー構造)
UPD_DATETIME 更新日時 TXT - - - ○ YYYY-MM-DD hh:mm:ss

3. 重要度テーブル (PRIORITY)

物理カラム名 論理カラム名 データ型 PK FK UK NotNull 初期値・制約事項
TASK_NO タスク番号 INT ○ ○ - ○ FK: TASKS.TASK_NO (PK兼FK)
DAY_PRIORITY_NO 日ごと重要度番号 INT - ○ - ○ FK: M_PRIORITY.PRIORITY_NO (CATEGORY=1)
INTRADAY_PRIORITY_NO 当日内重要度番号 INT - ○ - - FK: M_PRIORITY.PRIORITY_NO (CATEGORY=2)
PRIORITY_SCORE 合成優先度スコア INT - - - ○ 自動計算値(重みの合算)
UPD_DATETIME 更新日時 TXT - - - ○ YYYY-MM-DD hh:mm:ss

4. 予定テーブル (SCHEDULES)

物理カラム名 論理カラム名 データ型 PK FK UK NotNull 初期値・制約事項
TASK_NO タスク番号 INT - ○ - ○ FK: TASKS.TASK_NO
SCHEDULE_NO 予定番号 INT ○ - - ○ AutoIncrement
SCHEDULE_BGN 予定開始日時 TXT - - - - YYYY-MM-DD hh:mm:ss
SCHEDULE_END 予定終了日時(期限) TXT - - - ○ YYYY-MM-DD hh:mm:ss
IS_AVAILABLE 最新フラグ BOOLEAN - - - ○ 1:最新(有効), 0:過去履歴
SCHEDULE_MEMO 予定メモ TXT(MAX) - - - - -
UPD_DATETIME 更新日時 TXT - - - ○ YYYY-MM-DD hh:mm:ss

5. 実績テーブル (WORKLOGS)

物理カラム名 論理カラム名 データ型 PK FK UK NotNull 初期値・制約事項
TASK_NO タスク番号 INT - ○ - ○ FK: TASKS.TASK_NO
WORKLOG_NO 実績番号 INT ○ - - ○ AutoIncrement
BEGIN_DATE 作業開始日時 TXT - - - ○ YYYY-MM-DD hh:mm:ss
END_DATE 作業終了日時 TXT - - - ○ YYYY-MM-DD hh:mm:ss
WORKLOG_MEMO 作業メモ TEXT(MAX) - - - - -
UPD_DATETIME 更新日時 TXT - - - ○ YYYY-MM-DD hh:mm:ss

6. 依存関係テーブル (INDEPENDENCY)

物理カラム名 論理カラム名 データ型 PK FK UK NotNull 初期値・制約事項
INDEPENDENCY_NO 依存関係番号 INT ○ - - ○ AutoIncrement
PRE_TASK_NO 先行タスク番号 INT - ○ ※ ○ FK: TASKS.TASK_NO
SUB_TASK_NO 後続タスク番号 INT - ○ ※ ○ FK: TASKS.TASK_NO
INDEPENDENCY_TYPE 依存関係種別 TXT - - - ○ 初期値 'FS' (FS, SS, FF, SF)
UPD_DATETIME 更新日時 TXT - - - ○ YYYY-MM-DD hh:mm:ss

※補足: (PRE_TASK_NO, SUB_TASK_NO) の組み合わせに対して複合ユニークキー(UNIQUE)制約を設定。

7. 担当テーブル (ASSIGNMENT)

物理カラム名 論理カラム名 データ型 PK FK UK NotNull 初期値・制約事項
ASSIGN_NO 担当割り当て番号 INT ○ - - ○ AutoIncrement
SCHEDULE_NO 予定番号 INT - ○ - - FK: SCHEDULES.SCHEDULE_NO(条件付き必須)
WORKLOG_NO 実績番号 INT - ○ - - FK: WORKLOGS.WORKLOG_NO(条件付き必須)
WORKER_NO 担当作業者番号 INT - ○ - ○ FK: M_WORKER.WORKER_NO
ASSIGN_MEMO 割り当てメモ TXT(MAX) - - - - -
UPD_DATETIME 更新日時 TXT - - - ○ YYYY-MM-DD hh:mm:ss

※補足 (CHECK制約): SCHEDULE_NO と WORKLOG_NO はいずれか一方のみが入力(もう一方はNULL)となるよう制御。

8. 担当履歴テーブル (ASSIGNMENT_LOG)

物理カラム名 論理カラム名 データ型 PK FK UK NotNull 初期値・制約事項
ASSIGN_LOG_NO 担当履歴連番 INT ○ - - ○ AutoIncrement
ASSIGN_NO 担当割り当て番号 INT - ○ - ○ FK: ASSIGNMENT.ASSIGN_NO
WORKER_NO_OLD 変更前作業者番号 INT - ○ - ○ FK: M_WORKER.WORKER_NO
WORKER_NO_NEW 変更後作業者番号 INT - ○ - ○ FK: M_WORKER.WORKER_NO
ASSIGN_MEMO_OLD 変更前メモ TXT(MAX) - - - - -
UPD_DATETIME 更新日時 TXT - - - ○ YYYY-MM-DD hh:mm:ss

9. 担当マスタテーブル (M_WORKER)

物理カラム名 論理カラム名 データ型 PK FK UK NotNull 初期値・制約事項
WORKER_NO 作業者番号 INT ○ - - ○ AutoIncrement
WORKER_ID 作業者ID(コード) TXT - - ○ ○ 右詰めスペース(10桁固定)
WORKER_NM 作業者氏名 TXT - - - ○ -
UPD_DATETIME 更新日時 TXT - - - ○ YYYY-MM-DD hh:mm:ss

10. 重要度マスタテーブル (M_PRIORITY)

物理カラム名 論理カラム名 データ型 PK FK UK NotNull 初期値・制約事項
PRIORITY_NO 重要度定義番号 INT ○ - - ○ AutoIncrement
CATEGORY 重要度カテゴリ INT - - - ○ 1:Daily (日ごと), 2:Intraday (当日内)
PRIORITY 重要度名称 TEXT - - - ○ 例: '至急', '今日中', '最優先' 等
RANK 表示順序 INT - - - ○ カテゴリ内でのソート順
WEIGHT 重み付け数値 INT - - - ○ 合成スコア計算用スコア
UPD_DATETIME 更新日時 TXT - - - ○ YYYY-MM-DD hh:mm:ss

なんかhh:mm:ssの形式がいかれて国旗:flag_mm:になる
とか言う謎事象があったけど、適当なhtmlタグを
:の前に入れてやるとエスケープできた、うっとしすぎるわこれ

何にせよDB設計はできたのでまた次回は、次のステップに進んで、
開発の方を進めていこうと思います。

というわけで今回はこれで終わり
ではまたー (`・ω・´)ノシ

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?