Quale funzionalità esporre in un livello di astrazione del database?

3

Sto provando a progettare un modo semplice per estrapolare la persistenza dei dati dietro un'interfaccia, ma sto facendo fatica a capire quanto controllo a grana fine debba essere esposto agli strati superiori.

Limite, Filtro, Ordine, ecc.

La definizione di un'interfaccia per un repository di dati stupido è perfetta e dandy per le operazioni CRUD di base, ma per quanto riguarda tutte le altre funzionalità di database comuni come filtraggio dei risultati, limitazione, mappatura / riduzione e altre operazioni trasformative o condizionali? Questi tipi di operazioni violano il principio di responsabilità singola nel senso che un livello di persistenza dovrebbe essere solo una scatola nera stupida di recupero / permanenza e, di conseguenza, questa funzionalità sarebbe meglio implementata dal lato del codice chiamante (cioè, in un livello di servizio, o anche lato client)?

Trasformazioni lato client

Anche se ciò semplificherebbe enormemente il livello di persistenza, personalmente, ritengo che sarebbe abbastanza dispendioso eseguire queste operazioni lato client. Ad esempio, indipendentemente dal fatto che un utente esegua una query per un insieme di 10 risorse o 1000, il database dovrebbe restituire l'intero set di dati incorrere in costi di larghezza di banda e di memorizzazione nella cache, tra le altre cose. Anche molte di queste query sono probabilmente strongmente ottimizzate in modo nativo, e questo porterebbe tutto questo fuori dalla finestra.

Un'astrazione intelligente del database

D'altra parte, se dovessi esporre questa funzionalità del database nel livello di persistenza, aumenterebbe notevolmente la complessità dell'interfaccia e probabilmente finirà per sembrare un wrapper 1: 1 del driver del database (che è utile per scopi di test di simulazione, suppongo, ma in qualche modo sconfigge lo scopo di scrivere l'astrazione in primo luogo).

La mia domanda è: esiste una regola generale per la progettazione di un livello di astrazione del database per quale funzionalità esporre e cosa tenere nascosto?

    
posta Anchor 22.05.2016 - 17:46
fonte

1 risposta

5

I sistemi di database possono implementare approcci molto diversi. Basta confrontare SQL vs NoSQL. E per quest'ultimo confrontare negozi di valore-chiave con database di grafici . Quindi non troverai un proiettile d'argento che offrirà una singola API con tutti i vantaggi di questi database. Quindi dovrai restringere il campo di applicazione.

Considerando i limiti, il filtraggio, l'ordine, molti di questi sono correlati alle query del database. Quindi penso che tu abbia definitivamente bisogno di prenderti cura di questo nella tua API. Se non lo fai, potresti soffrire. Non a causa di chiamate extra tra client e API, ma perché se si impone di farlo sul lato client, si costringerà la propria app a sollecitare il server di database molto più del necessario. È una variante del tradizionale problema di elaborazione lato client vs server .

Ma a meno che tu non voglia scrivere la tua API generica, ti consiglio caldamente di progettare il tuo livello di persistenza partendo dall'architettura dell'applicazione, e specialmente come la tua architettura gestirà il mapping tra gli oggetti in memoria e gli oggetti dati su il database (ad es. mappatura relazionale degli oggetti ).

Il problema ha alcune somiglianze con le sfide di serializzazione / deserializzazione: cioè come mappare le relazioni tra oggetti, composizione di oggetti, contenitori di oggetti, ecc ... Una volta che hai la chiara immagine, dovresti progettare il tuo livello di database con l'operazione necessario per supportare i primitivi della mappatura degli oggetti.

Un buon inizio sarebbe prendere in considerazione il schema di progettazione del proxy per i proxy di mappatura in memoria che controllano il database oggetti. L'approccio che ti propongo qui è molto diverso dallo sviluppo di un wrapper universale per database. Ma ha il vantaggio di permetterti di ottenere il meglio dall'architettura del database sottostante, ad esempio, sfruttare i database di grafici e documenti.

    
risposta data 22.05.2016 - 21:05
fonte

Leggi altre domande sui tag