Table Data Gateway
An object that acts as a Gateway to a database table.
One instance handles all the rows in the table.
- 【補】LaravelのDatabaseManager(DBファサードの実体)は、全テーブルを対象とするTable Data Gatewayといえそう
-
アプリケーションのロジックとSQLを混ぜるとよくない
- アプリケーション開発者の多くはSQLに不慣れ・上手ではない
- DB管理者がチューニングしやすくするためにも分離すべき
-
Table Data Gateway
-
一つの表もしくはビューに対するSQLを一元管理する
- SELECT
- INSERT
- UPDATE
- DELETE
- 他のコードはこいつ経由でDBアクセスする
-
How It Works
-
シンプルなインタフェースをもたせる
-
メソッド
- find
- update
- insert
- delete
- 各メソッドをSQLにマッピングし、クエリ発行する
-
ステートレス
- RDBからデータ取得して、返すだけ
-
-
戻り値どうする
-
1行取得メソッド
findById(id)
ですら複数のデータを返す必要がある- カラムが複数あるから
-
連想配列で返すのはよくない
-
コンパイル時チェックを得られない
- typoで死ぬ
-
- Data Transfer Object
-
Record Set
-
概念的には汚い
-
利用者にSQLを意識させてしまう
- 本来必要ないのに
- データソースをRDBからファイルに置換できなくなる
-
- だが効果的
- .NETなどのプラットフォームにより提供されている
-
Tale Moduleとの親和性よい
- こちらもプラットフォームにより提供される
-
-
Domain Modelを返すのはどうか
- Domain ModelとTable Data Gatewayとが相互依存になるのが微妙
-
- たいていは1テーブル1Table Data Gateway
- 非常にシンプルなケースでは全テーブル1Table Data Gateway可
-
Table Data Gatewayで隠蔽するのは実表に限らない
- ビュー
- ビューにはしていないクエリ
- ビューに対してTable Data Gatewayを作り、ビューの元となる実表へのUPDATEをupdateメソッドとして隠蔽するのはよいテクニック
When To Use It
- そもそもGatewayを使うのか
- Gatewayを使う場合、Table Data GatewayとRow Data Gatewayとどちらを使うのか
-
ドメイン層とのかねあい
-
Domain Modelと併用することはまずない
- Data Mapper使え
-
Table Moduleとの親和性よい
- Table Module採用時は、データソース層はこれ一択
-
Transaction Scriptとよく合う
- Row Data Gatewayもそう
-
-
Row Data Gatewayとのちがい
-
複数行データを扱う
-
DTO vs Data Table Gateway
-
他のところで使わないならDTOはイマイチ
- 労力に見合わない
- 【補】そもそもリモートコール時のTransfer用
- 行を集合として扱うのが便利ならTable Data Gateway
-
-
-
-
Data MappersとTable Data Gatewayの併用
- Table Data Gatewayのコードをmetadataで自動生成する
- Domain Modelとの表指向データとのマッピング手で書く
-
SQLとストアドプロシージャとを同一のインタフェースに隠蔽できる
- 実表の構造を隠蔽
Further Reading
-
DAO: Data Accessor Pattern
- [Alur et al.]
-
Table Data Gatewayと同じもの
- DTOのコレクションを返す
- Row Data Gatewayを指して使用している部分もある?
-
DAOという名前を使わなかった理由
- Gatewayの一種であることを強調したいから
- DAOはMicrosoft感のある言葉だから
Example: Person Gateway (C#)
- 略
Example: Using ADO.NET Data Sets (C#)
- コード略(pp.148-151)
- Data Set: 表指向データの保持。ステートフル
- Data Adapter: 実際にDBアクセスするクラス。ステートレス
- Data Set Holder: Data SetとData Adapterとを集約するやつ
- Data Gateway: Data Set Holderに処理を委譲する