Table Data Gateway
Descrição
O Table Data Gateway é um objeto que atua como gateway para uma tabela (ou view) do banco de dados. Uma única instância cuida de todas as linhas da tabela e concentra todo o SQL de consulta, inserção, atualização e exclusão.
O restante da aplicação não escreve SQL: chama métodos como findById, findByCustomer ou insert. Normalmente o gateway não tem estado e devolve estruturas de dados simples, como Record Sets ou DTOs, em vez de objetos de domínio com comportamento.
Com isso, o SQL fica em um só lugar, facilitando o trabalho de quem não domina SQL e permitindo que DBAs encontrem e ajustem as consultas quando o esquema muda.
Problemas que resolve
- SQL espalhado pela lógica de negócio e pela camada de apresentação.
- Mudanças de esquema que exigem alterações em muitos pontos do código.
- Dificuldade de DBAs localizarem e otimizarem as consultas usadas pela aplicação.
- Necessidade de uma camada de acesso simples para lógicas de domínio orientadas a tabela.
Quando usar
- Com Transaction Script, em que a lógica de negócio opera sobre dados tabulares.
- Com Table Module, que costuma receber Record Sets produzidos pelo gateway.
- Para encapsular o acesso a stored procedures, tratando-as como um gateway.
- Quando se quer isolar o SQL sem o custo de um mapeamento objeto-relacional completo.
Quando evitar
- Quando há um Domain Model rico com regras complexas; um Data Mapper ou ORM se adapta melhor.
- Quando se espera mapear heranças, associações e coleções de objetos de forma transparente.
- Quando o gateway tende a acumular dezenas de consultas e virar um "god object" da tabela.
Trade-offs
| Ganho | Custo / Risco |
|---|---|
| Todo o SQL fica centralizado e fácil de ajustar | Pouca ajuda para mapear objetos de domínio ricos |
| Interface simples, próxima da estrutura da tabela | Resultados tabulares expõem o esquema para quem os consome |
| Casa bem com Transaction Script e Table Module | Gateways podem crescer com muitas consultas específicas |
| Simples de substituir por um dublê em testes | Não gerencia identidade nem concorrência sozinho |
- Acoplamento: o código de negócio depende da interface do gateway, não do SQL; ainda assim, vê a forma das tabelas.
- Testabilidade: o gateway pode ser trocado por um Service Stub ou por um banco em memória.
- Complexidade: baixa, com uma classe por tabela.
Diagrama
O Client (por exemplo, um Transaction Script) chama apenas métodos do PersonGateway, que contém o SQL e conversa com o Database. Uma instância atende todas as linhas da tabela.
Exemplo
Um sistema de pedidos usa scripts de negócio que precisam consultar e gravar pedidos. Um OrderGateway isola o SQL da tabela orders e devolve linhas simples.
class OrderGateway:
def __init__(self, conn):
self.conn = conn
def find_by_id(self, order_id):
cur = self.conn.execute(
"SELECT id, customer_id, total FROM orders WHERE id = ?", (order_id,))
return cur.fetchone()
def find_by_customer(self, customer_id):
cur = self.conn.execute(
"SELECT id, customer_id, total FROM orders WHERE customer_id = ?",
(customer_id,))
return cur.fetchall()
def insert(self, customer_id, total):
cur = self.conn.execute(
"INSERT INTO orders (customer_id, total) VALUES (?, ?)",
(customer_id, total))
return cur.lastrowid
# Transaction Script
def close_order(gateway, order_id):
order = gateway.find_by_id(order_id)
...
No .NET, o TableAdapter do ADO.NET e a classe DAO do mundo Java seguem ideia semelhante.
Padrões relacionados
- Row Data Gateway — um objeto por linha em vez de um por tabela.
- Active Record — o objeto de domínio acumula também o acesso ao banco.
- Data Mapper — alternativa quando o modelo de domínio é rico e independente do esquema.
- Transaction Script — combinação típica de lógica de domínio com este gateway.
- Table Module — consome os Record Sets que o gateway produz.
- Record Set — formato comum dos resultados.
- Gateway — padrão base do qual este é uma especialização.
- Facade — também esconde detalhes de um subsistema atrás de uma interface simples.
Referência
- Página do padrão no catálogo do Fowler
- Patterns of Enterprise Application Architecture, Martin Fowler (Addison-Wesley, 2002)
- Table data gateway na Wikipedia