2014-11-27 10 views
5

Ho cercato di saperne di più sui modelli di progettazione leggendo Modelli di Enterprise Application Architecture di Martin Fowler. Mi sono imbattuto nel numero Table Data Gateway pattern e mi chiedevo come lo usi se hai operazioni che coinvolgono più tabelle?Come si utilizza il pattern di Gateway dati Table che coinvolge le relazioni uno-a-molti?

La mia comprensione è che ogni tavolo avrà una sua classe. Ogni classe avrà istruzioni SQL per accedere a una singola tabella, ma cosa succede quando alcune delle mie affermazioni si basano su altre tabelle?

Ecco un esempio concreto. Se ho una relazione uno-a-molti tra due tabelle, come Questions e Choices (domande a scelta multipla), e vorrei recuperare una domanda con tutte le sue scelte. Quindi avrei una classe QuestionGateway con un metodo find() ma avrei anche una classe ChoiceGateway con un metodo findByQuestionId() per recuperare tutte le scelte per la domanda?

risposta

0

La tua idea di come si presenta questo modello è quella giusta. La tua domanda suggerisce di cogliere anche l'idea più importante del tipo di problemi che il modello intende risolvere.

Il modello di Gateway dati tabella non è destinato a modelli di dati complessi in cui i dati correlati sono memorizzati in più tabelle. È pensato per dati semplici che non hanno relazioni con altri dati nel tuo database. È un ritorno da prima dei giorni degli store dedicati ai valori-chiave, quando le persone volevano godere delle garanzie ACID su dati che non avevano alcuna utilità per un modello relazionale. Come hai notato, il pattern si degrada non appena ti interessi delle relazioni tra i tuoi dati. Se ti immagini di voler utilizzare questa tabella con un'altra, non utilizzare questo modello. Dal momento che l'intero punto di un modello relazionale è quello di preservare le relazioni tra i dati, in pratica è solitamente evitato.

+0

Non avere qualche suggerimento su altri modelli che dovrei guardare? – Mikey

+0

@Mikey sicuro. In nessun ordine particolare: Decoratore, Fabbrica, Costruttore, Fabbrica astratta, Inversione del controllo (non tecnicamente un modello, ma un concetto di progetto molto utile), Adattatore, Localizzatore di servizio e Pool di thread. Sono tutti molto utili. – Floegipoky

4

Suggerirei di essere un po 'più flessibile interpretando questo modello. Non dovresti sentirti limitato o prendere decisioni strane solo per essere al 100% compatibile con la definizione del patter.

Per favore non fraintendermi. Non sto suggerendo di buttare via schemi. Quello che sto effettivamente suggerendo è di usarli in modo appropriato.

rispondere alla tua domanda:

  • se non ci sono così tante le interdipendenze tra il ChoiceGateway e QuestionGateway è normale averli separati.
  • se ci sono interdipendenze ed è meglio avere quelle tabelle "unite" dal punto di vista della logica di business è possibile creare qualcosa come una "vista", chiamatelo per esempio QuiestionView. In tal modo la logica di business potrebbe essere un po 'più chiara e tutte le cose specifiche del DB verranno incapsulate nella vista definita.

Fondamentalmente, si tratta di astrazioni utili. Se si ha dimestichezza con queste tabelle, definire autonomamente gateway indipendenti con alcune potenziali duplicazioni. Se hai bisogno di "tutto in un posto", basta definire un'astrazione di vista di alto livello.

BTW, il modello stesso non è astratto solo delle tabelle, ma vista. Quindi non vedo alcun motivo per cui non si possa creare un'astrazione di livello superiore usando un approccio definito.

un gateway Tabella dati contiene tutte le SQL per l'accesso a una singola tabella o vista

Problemi correlati