勉強日記

チラ裏

PoEAA ch10 Table Data Gateway

martinfowler.com


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)ですら複数のデータを返す必要がある
      • カラムが複数あるから
    • 連想配列で返すのはよくない
    • 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 GatewayRow Data Gatewayとどちらを使うのか
  • ドメイン層とのかねあい
    • Domain Modelと併用することはまずない
      • Data Mapper使え
    • Table Moduleとの親和性よい
      • Table Module採用時は、データソース層はこれ一択
    • Transaction Scriptとよく合う
  • Row Data Gatewayとのちがい
    • 複数行データを扱う
      • DTO vs Data Table Gateway
        • 他のところで使わないならDTOはイマイチ
          • 労力に見合わない
          • 【補】そもそもリモートコール時のTransfer用
        • 行を集合として扱うのが便利ならTable Data Gateway
  • Data MappersTable 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に処理を委譲する