🧩 Table Module
✅ このスタイルの概要
「テーブル全体(集合)に対するロジックを 1 つのモジュールにまとめる」
というデータ中心の構造スタイル。
Active Record が “1 行= 1 オブジェクト” を中心にするのに対し、
Table Module は “テーブル= 1 モジュール” を扱う。
✅ 解決しようとした問題
Active Record では集合(複数行)を扱う際にロジックが散りがちである。
- 集計処理を書く場所がバラバラになる
- バッチ処理・レポート処理の置き場所に迷う
- 1 行の状態より データ集合全体に対する操作 が中心なのに表現しづらい
Table Module はこうした問題を整理し、
「集合的なロジックはこのモジュールに全部置く」 という明確な置き場を作る。
✅ 基本思想・ルール
- テーブル 1 つにつき モジュール/クラス 1 つ
- モジュールは 行ではなく集合(テーブル全体) を扱う
- 操作はテーブルに対する関数として定義する
- 例:
findByStatus(status)calculateMonthlyTotals()bulkUpdateFlags(ids)
- 例:
- 主にクエリ・集計・一括更新など、データ処理寄りのロジックが対象
Active Record との役割分担イメージ
| ロジックの種類 | Active Record | Table Module |
|---|---|---|
| 行単位の属性操作 | ◎ | △ |
| 集計・検索・集合処理 | △ | ◎ |
✅ 得意なアプリケーション
- レポートや集計処理が頻繁に存在する業務システム
- バッチ処理が多いアプリケーション
- データウェアハウスへのロード前処理
- 大量データを前提とした集計/分析前処理
特に:
「このテーブルの集計処理はここを見れば全部分かる」
という状態を作りたい場面で非常に有効である。
❌ 不向きなケース
- オブジェクト中心で複雑なビジネスルールを扱う場合
- 行単位での振る舞いや状態遷移が中心のアプリ
- Active Record だけで十分な小規模 CRUD アプリ
✅ 歴史(系譜・親スタイル)
- Fowler の Patterns of Enterprise Application Architecture で定義
- 「テーブル中心」発想の一種で、Active Record と兄弟関係
- 集約オペレーションの置き場として実践的なパターン
- Repository パターン(DDD)とは異なる領域だが、役割が似る場面もある
✅ 関連スタイル
- Active Record:行単位の操作に強い
- Anemic Domain Model:データ中心の文脈でよく併発
- Repository パターン:DDD の集合操作。思想は異なるが関係性は深い
- CQRS の Read Model:Table Module 的な“ビュー用集合処理”が登場する
✅ 代表的なフレームワーク
Table Module 自体を直接採用するフレームワークは少ないが、次のような文脈で自然に登場する。
-
Django ORM(集合操作)
Django の QuerySet はテーブル全体を扱う操作が豊富で、Table Module 的利用がしやすい。 -
ETL / DWH 前処理(Airflow / Spark 前処理)
集合ロジックを 1 モジュールにまとめる構造は Table Module 的設計に一致する。 -
バッチ処理系(Java/Spring Batch, Node.js scripts)
テーブル単位で集計・一括更新処理を書く場合、自然と Table Module になる。
✅ このスタイルを支えるデザインパターン
-
Facade
集合処理(集計・検索・一括更新)の“入口”として働く。 -
Template Method
集計処理やレポート処理で共通ステップを統一するときに便利。 -
Strategy
集計アルゴリズムを切り替える場面で使用される。 -
Iterator
大量データをストリーム的に処理する場合に役立つ。
✅ まとめ
Table Module は、
集合的なロジックを一箇所に集約するためのデータ中心スタイル である。
Active Record を補完する形で:
- 単一行の操作 → Active Record
- 集合的な操作 → Table Module
という分担がうまく機能するケースが多く、
実務の CRUD +集計系アプリで特に効果を発揮する。