PoEAA ch10 Table Data Gateway

PoEAAデザインパターン勉強メモ

出典: 


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 GatewayRow 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 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に処理を委譲する