設計思想

なぜスタースキーマか

BizLP GAS Accounting は、スプレッドシート上に暗黙的なスタースキーマを採用している。

スタースキーマでは、中心にトランザクションデータを格納するファクトテーブルを配置し、その周囲に分析軸となるディメンションテーブルを一対多で接続する。対照的に、スノーフレークスキーマではディメンションをさらにサブテーブルに正規化するが、以下の理由からスタースキーマを選択した:

観点スタースキーマスノーフレークスキーマ
クエリの複雑性低(1段階の参照)高(多段階の結合が必要)
データ冗長性許容(ディメンション値を直接埋め込み)低(正規化で排除)
GAS環境との適合適合 — JOIN不可の環境では平坦な構造が必須不適合 — サブテーブル参照のコストが高い
保守性マスタ変更時にファクト側の更新が必要マスタ変更が自動伝播

非正規化を許容する理由

Google Spreadsheet はリレーショナルDBではない。SQL の JOIN に相当する操作は GAS の indexOf / buildHeaderIndex_ による手動ルックアップで代替しており、参照コストが高い。このため、ファクトテーブル(32_wrk_invoice 等)には以下の非正規化を意図的に適用している:

非正規化パターン理由
ディメンション値の直接埋め込みINV科目名取引先名PJ名組織名 を文字列で保持集計時にマスタ参照を最小化し GAS 6分制限内で処理を完了させる
派生属性の事前計算INV に 諸表区分大分類 を保持 (科目マスタから転記)P/LB/S の分類判定を集計時ではなく起票時に確定させる
残高の直接保持INV に 未決済残高(自動計算) を保持STL 消込のたびに再集計せず Action B で即時更新する

SSOT (Single Source of Truth) としての INV

全ての財務諸表(P/L・B/S・C/F)およびPJ別損益の集計は 32_wrk_invoice (INV) を起点とする。42_trn_journal (TRN) は監査証跡であり、集計ソースとしては使用しない。

詳細は ADR-0001: SSOTとしてのINV を参照。


ファクトテーブル

本システムのファクトテーブルは、トランザクションの発生を記録するテーブル群である。

テーブルキー粒度主キー形式主要メジャー役割
32_wrk_invoiceWRK_INVC1 請求INV_…計画 3 額 + 残高SSOT・全集計の起点
33_wrk_bankWRK_BANK1 決済STL_…決済額 + 差額キャッシュ移動・CF 起点
42_trn_journalTRN_JOUR1 仕訳TRN_…実績 3 額監査証跡(集計不使用)
31_wrk_orderWRK_ORDR1 発注ORD_…発注額 + 残高RPA 親 / INV 紐づけ

主キー形式: 全て <TYPE>_YYYYMMDD_NNNN。計画 3 額 = 税抜/消費税/税込(INV 列)。実績 3 額 = 同(TRN 列)。

32_wrk_invoice (INV) — 請求・債権債務台帳

#列名入力/自動ディメンション参照説明
1有効フラグBOOLEAN入力FALSE の行は全処理でスキップ
2請求ID(INV)TEXT自動主キー(INV_…
3親発注ID(ORD)TEXT自動→ 31_wrk_orderRPA起票時に自動紐づけ
4起票日時DATETIME自動RPA起票のタイムスタンプ
5起票者TEXT自動実行ユーザー
6申請種別TEXT自動APL_xxx (HC/TR/DD/AP/EX/JE)
7発生日(P/L計上日)DATE入力P/L計上月の決定に使用
8決済日_計画DATE入力期ずれ判定 (発生月 vs 決済月)
9請求ステータスTEXT入力→ 15_mst_dict未処理→承認済→決済完了
10収支区分TEXT入力→ 15_mst_dict収入 / 支出
11取引先名TEXT入力→ 12_mst_partner非正規化: 名称を直接保持
12PJ名TEXT入力→ 14_mst_project非正規化: PJ名を直接保持
13組織名TEXT入力→ 13_mst_org非正規化: 組織名直接保持
14諸表区分TEXT自動→ 11_mst_account科目マスタから転記(P/L or B/S)
15大分類TEXT自動→ 11_mst_account科目マスタから転記
16科目名TEXT入力→ 11_mst_account完全一致必須。マスタ未登録はエラー
17税区分TEXT入力→ 15_mst_dict課税 / 非課税 / 不課税
18通貨TEXT自動JPY 固定 (現行)
19税抜金額_計画NUMBER入力メジャー: 税抜金額
20消費税額_計画NUMBER入力メジャー: 消費税額
21税込金額_計画NUMBER入力メジャー: 税込金額
22未決済残高NUMBER自動請求総額 − Σ STL(逆算)
23決済手段TEXT入力→ 15_mst_dict銀行/クレカ/資産計上 等
24摘要TEXT入力自由記述
25証憑URLTEXT入力Drive リンク
26自動仕訳JNL_IDTEXT自動→ 42_trn_journalAction A 採番・冪等性チェック

33_wrk_bank (STL) — 入出金・消込台帳

#列名入力/自動ディメンション参照説明
1有効フラグBOOLEAN入力
2決済ID(STL)TEXT自動主キー (STL_YYYYMMDD_NNNN)
3消込対象請求ID(INV)TEXT自動→ 32_wrk_invoiceファクト間結合: INV→STL
4決済日_計画DATE自動INV の決済日_計画を転記
5立替日DATE入力クレカ立替の場合
6決済日_実績DATE入力実際の入出金日
7決済ステータスTEXT入力→ 15_mst_dict未処理→消込済
8入出金区分TEXT自動→ 15_mst_dict入金 / 出金
9決済口座TEXT入力銀行口座名
10取引先名TEXT自動→ 12_mst_partnerINV から転記
11税込金額_決済NUMBER入力メジャー: 決済金額
12差額(手数料等)NUMBER入力振込手数料等
13差額処理科目TEXT入力→ 11_mst_account差額の計上科目
14組織名TEXT自動→ 13_mst_orgINV から転記
15摘要TEXT入力
16消込手段TEXT自動自動 / 手動 / クレカ
17自動仕訳JNL_IDTEXT自動→ 42_trn_journalAction B で採番

ディメンションテーブル

ディメンションテーブルは、ファクトの分析軸を提供するマスタデータである。

テーブルキー種別主キー結合キー用途
11_mst_accountMST_ACCT勘定科目ACC_…INV.科目名P/L・B/S 分類
12_mst_partnerMST_PART取引先PTN_…INV.取引先名取引先識別
13_mst_organizationMST_ORGN組織ORG_…INV.組織名組織別集計
14_mst_projectMST_PROJPJPRJ_…INV.PJ 名PJ 別損益・配賦
15_mst_dictMST_DICTコード辞書カテゴリ + コードINV ステータス等プルダウン値定義
03_sys_paramsSYS_PARAMパラメータキー会計年度等

結合メカニズム

本システムでは SQL の JOIN に代わり、以下のメカニズムでファクト↔ディメンションを結合する:

1. ファクトテーブルにディメンション値を「名称」で直接埋め込み(非正規化)
   INV.科目名 = "旅費交通費"   ← 11_mst_account.科目名 と文字列完全一致

2. 集計時に必要な派生属性のみマスタ参照
   buildHeaderIndex_(mstAcctData) で科目マスタを連想配列化
   → 科目名をキーに 諸表区分・表示区分・固変区分 を取得

3. 参照はヘッダー名ベース(列番号ハードコード禁止)
   const idx = headers.indexOf("科目名");

設計トレードオフ: 名称ベースの結合は、マスタ側の名称変更時にファクト側の不整合を生む。これは 06. データ整合性チェック の科目マスタ存在チェックで検出する。

11_mst_account — 勘定科目マスタ

#列名説明ファクトでの役割
1有効フラグFALSE で論理削除
2主科目コードACC_NNNNコード参照用 (TRN で使用)
3諸表区分P/L or B/SINV 起票時に転記 → データマートで P/L・B/S 振り分け
4大分類流動資産/固定資産/売上/販管費INV 起票時に転記 → P/L セクション分類
5表示区分財務諸表上の表示グループデータマートでの表示行の決定
6表示科目財務諸表上の表示科目名
7正式科目名法的・会計基準上の正式名称
8固変区分固定費 / 変動費PJ別損益の限界利益計算
9デフォルト税率10% / 8% / 0%RPA 起票時の消費税計算
10科目名結合キー: INV.科目名と完全一致ファクト↔ディメンション結合の基準

14_mst_project — プロジェクトマスタ

#列名説明ファクトでの役割
1有効フラグ
2PJコードPRJ_NNNNコード参照用
3プロジェクト名INV.PJ名 と文字列一致で結合
4PJ小区分受託/自社/研究 等PJ別損益のグループ化
5PJ大区分上位グループ化
6PJ区分
7契約形態準委任/請負 等
8配賦区分配賦元 / 配賦先 / 対象外共通費配賦ロジックで使用
9-14(その他)社内外、資産化、ステータス等

ER図

erDiagram
    MST_ACCT ||--o{ WRK_INVC : "科目名"
    MST_ACCT ||--o{ WRK_BANK : "差額処理科目"
    MST_PART ||--o{ WRK_INVC : "取引先名"
    MST_PART ||--o{ WRK_BANK : "取引先名"
    MST_ORGN ||--o{ WRK_INVC : "組織名"
    MST_ORGN ||--o{ WRK_BANK : "組織名"
    MST_PROJ ||--o{ WRK_INVC : "PJ名"
    MST_DICT ||--o{ WRK_INVC : "ステータス/区分"
    MST_DICT ||--o{ WRK_BANK : "ステータス/区分"
    MST_DICT ||--o{ MST_PROJ : "PJ区分/契約形態"

    WRK_ORDR ||--o{ WRK_INVC : "親発注ID(ORD)"
    WRK_INVC ||--o{ WRK_BANK : "消込対象請求ID(INV)"
    WRK_INVC ||--o| TRN_JOUR : "自動仕訳JNL_ID"
    WRK_BANK ||--o| TRN_JOUR : "自動仕訳JNL_ID"

    MST_ACCT {
        string 主科目コード PK
        string 科目名 UK
        string 諸表区分
        string 大分類
        string 表示区分
        string 固変区分
        number デフォルト税率
    }

    MST_PART {
        string 取引先コード PK
        string 取引先名
        string 取引先区分
    }

    MST_ORGN {
        string 組織コード PK
        string 組織名
    }

    MST_PROJ {
        string PJコード PK
        string プロジェクト名
        string PJ区分
        string 配賦区分
    }

    MST_DICT {
        string カテゴリ PK
        string 設定コード PK
        string 表示名
    }

    WRK_ORDR {
        string 発注ID_ORD PK
        string 取引先名 FK
        string PJ名 FK
        number 税込金額_発注
        number 発注残高
    }

    WRK_INVC {
        string 請求ID_INV PK
        string 親発注ID_ORD FK
        date 発生日
        date 決済日_計画
        string 請求ステータス FK
        string 科目名 FK
        string 取引先名 FK
        string PJ名 FK
        string 組織名 FK
        number 税込金額_計画
        number 未決済残高
        string 自動仕訳JNL_ID FK
    }

    WRK_BANK {
        string 決済ID_STL PK
        string 消込対象請求ID_INV FK
        date 決済日_実績
        string 決済ステータス FK
        number 税込金額_決済
        string 自動仕訳JNL_ID FK
    }

    TRN_JOUR {
        string 取引ID PK
        date 発生日
        string 科目名 FK
        number 税込金額_実績
        string 仕訳ステータス
    }

ER図の読み方

  • 実線: ファクト↔ディメンションの結合(名称ベースの文字列一致)
  • ||--o{: 一対多(1つのマスタレコードが複数のファクト行で参照される)
  • ||--o|: 一対零or一(1つのINV/STLに対して0件or1件のTRNが紐づく)
  • FK列: スプレッドシート上は外部キー制約なし。データ整合性チェック (03_data_validator.js) で検証

データフロー図

flowchart TB
    subgraph MST["10s マスタデータ"]
        MST_A["11_mst_account
勘定科目"] MST_P["12_mst_partner
取引先"] MST_O["13_mst_organization
組織"] MST_J["14_mst_project
プロジェクト"] MST_D["15_mst_dict
コード辞書"] end subgraph BUD["20s 予算・契約マスタ"] B1["21_bud_pipeline
売上パイプライン"] B2["22_bud_headcount
人員・給与"] B3["23_bud_subscription
SaaS"] B4["24_bud_capex_loan
設備投資"] B5["25_bud_finance
資金移動"] B6["26_bud_adhoc
単発経費"] end subgraph WRK["30s サブ元帳"] ORD["31_wrk_order
発注台帳 (ORD)"] INV["32_wrk_invoice
請求台帳 (INV)
★ SSOT"] STL["33_wrk_bank
入出金台帳 (STL)"] end subgraph TRN["40s 総勘定元帳"] JNL["42_trn_journal
仕訳台帳 (TRN)
監査証跡"] end subgraph OUT["60s-90s 財務諸表"] PL["61/62 P/L"] BS["71/73 B/S"] CF["73/74 C/F"] PJ["78/79 PJ損益"] DCF["83-85 日次CF"] FS["91/92 財務諸表"] end MST --> BUD BUD -->|"RPA起票
401_bat_rpa.js"| ORD BUD -->|"RPA起票"| INV ORD -.->|"ORD_ID紐づけ"| INV INV -->|"Action A
承認→仕訳転記"| JNL INV -->|"Action A
STL自動作成"| STL STL -->|"Action B
消込→決済仕訳"| JNL STL -->|"Action B
残高更新"| INV INV -->|"PHASE 1
承認済INV"| OUT STL -->|"PHASE 2
消込済STL"| OUT MST_A -.->|"科目分類"| OUT style INV fill:#4a90d9,color:#fff,stroke:#2c5f8a style JNL fill:#95a5a6,color:#fff,stroke:#7f8c8d

データフローの段階

#フェーズトリガー入力処理出力
1RPA 起票メニュー実行20s 予算04_bat_rpa.jsORD + INV
2Action AINV 承認承認済 INV08_subledger.jsTRN + STL
3Action BSTL 消込消込済 STL08_subledger.jsTRN + INV 残高
4マート更新メニュー実行INV + STL06_datamart_*.js財務 3 表 + PJ + 日次

テーブル拡張ガイドライン

タブ番号体系

番号帯用途命名規則
01-09システム設定NN_sys_xxx01_sys_config, 03_sys_params
10-19マスタデータNN_mst_xxx11_mst_account
20-29予算・契約NN_bud_xxx22_bud_headcount
30-39サブ元帳(ワーク)NN_wrk_xxx32_wrk_invoice
40-49仕訳・総勘定元帳NN_trn_xxx42_trn_journal
60-69P/L 関連出力NN_pl_xxx61_pl, 63_pl_plan
70-79B/S・PJ 関連出力NN_bs_xxx / NN_pj_xxx71_bs, 78_pj_pl
80-89CF 関連出力NN_cf_xxx83_cf_daily
90-99財務諸表・テストNN_fs_xxx / NN_test_xxx91_fs_bs, 90_test_results

全タブ一覧(処理段階ツリー)

[10s MST] マスタデータ ─────────────────────────────────
  11_mst_account    科目マスタ(正式科目名・科目名・表示区分・固変区分)
  12_mst_partner    取引先マスタ
  13_mst_organization 組織マスタ
  14_mst_project    プロジェクトマスタ(配賦区分: 配賦元/先/対象外)
  15_mst_dict       コード辞書(プルダウン値の定義)
    ↓
[20s BUD] 予算・契約マスタ ──────────────────────────────
  21_bud_pipeline    売上パイプライン(確度・MRR・スポット)
  22_bud_headcount   人員・給与マスタ(社保・源泉税の自動計算)
  23_bud_subscription SaaS・サブスク管理
  24_bud_capex_loan  設備投資・借入管理
  25_bud_finance     資金移動・財務取引
  26_bud_adhoc       単発経費(領収書→自動登録連携)
  27_bud_resource    要員稼働率(PJ別工数配賦)
  28_bud_allocation  共通費配賦ルール
    ↓ RPA起票 (401_bat_rpa.js)
[30s WRK] サブ元帳 ─────────────────────────────────────
  31_wrk_order      発注・契約台帳 (ORD)
  32_wrk_invoice    請求・債権債務台帳 (INV) ← Single Source of Truth
  33_wrk_bank       入出金・消込台帳 (STL)
  34_wrk_card       クレカ明細(JCBインポート→STLマッチング)
  35_wrk_receipt    領収書・請求書(PDF→Gemini API解析)
    ↓ 仕訳エンジン (403_subledger_engine.js)
[40s TRN] 総勘定元帳 ───────────────────────────────────
  41_trn_budget     予算仕訳
  42_trn_journal    仕訳台帳 (JNL) — 監査証跡
    ↓ データマート (6xx_datamart_*.js)
[60s-90s] 財務諸表・管理会計レポート ──────────────────
  61/62_pl           P/L(単月/YTD)
  63/64_pl_plan      P/L計画(単月/YTD)
  71/73_bs           B/S(実績/計画)
  73/74_cf           C/F 間接法(実績/計画)
  78_pj_pl           PJ別P/L(通期・共通費配賦込み)
  79_pj_monthly      PJ別月次採算(限界利益)
  83/84/85_cf_daily  CF日次(計上/計画/実績)
  91/92_fs           財務諸表レンダリング(B/S・P/L)
タブ番号帯主要タブ関連仕様書
10s マスタ11_mst_account01 / 02 / 03
20s 予算21〜286 種 RPA: 07-12
30s サブ元帳31_wrk_order14. ORD自動作成
32_wrk_invoice13. 仕訳エンジン / 16. データ取込
33_wrk_bank15. STL自動作成 / 13. 仕訳エンジン
34_wrk_card04. クレカマッチング
35_wrk_receipt05. 領収書マッチング
40s 仕訳42_trn_journal13. 仕訳エンジン
60-90s 出力61/62 P/L18. P/L / 25. 法人税
71/91 B/S19. B/S
73/74 C/F20. C/F
78/79 PJ26. PJ別損益
83/84/85 日次CF21. 日次CF

新規タブ追加の手順

  1. 番号の割り当て: 上記番号帯から適切な範囲を選択。同番号帯内で空き番号を使用
  2. システムキーの定義: 01_sys_configシステムキー_GAS を追加 (例: WRK_NEWT)
  3. スキーマの定義: 101_sys_config.jssetupAllSchemas 内に列定義を追加
  4. IDプレフィックスの定義: 002_constants.jsID_PREFIXES に追加 (例: NEW_)
  5. ディメンション結合の設計: ファクトテーブルの場合、どのマスタと結合するかを決定
    • 結合キーはヘッダー名ベース(列番号ハードコード禁止)
    • 非正規化する属性(INVに直接埋め込む値)を明確にする
  6. DDL実行: setupAllSchemas を実行してスキーマを同期
  7. 仕様書の更新: docs/ 配下に対応する spec_xxx.md を作成

列追加のルール

ルール説明
ヘッダー名ベース列番号のハードコード禁止。indexOf / buildHeaderIndex_ で動的参照
命名規則ADR-0004 に準拠: 金額_計画 / 金額_決済 / 決済日_計画 / 決済日_実績
色分け入力列 = 薄青 (#dce6f1)、自動列 = 薄灰 (#f3f3f3)
入力規則プルダウン値は 15_mst_dict から参照。数値制限・TRUE/FALSE も DDL で設定
有効フラグ全マスタ・ワークテーブルの先頭列に配置。FALSE で論理削除

付録: アーキテクチャ決定記録

スタースキーマ型データモデルの採用根拠は ADR-0047: スタースキーマ型データモデルを採用する を参照。

本付録は元々「ADR-0008: スタースキーマ型データモデルの採用」として埋め込まれていたが、正規 ADR-0008 (Vertex AI 集約) との番号衝突を解消するため、ADR-0047 として独立採番した (2026-05-16)。決定内容に変更はない。