Negli ultimi 20 anni ho visto alcuni grandi progetti di database modulari e ho visto lo scenario suggerito da David parecchie volte ora in cui le applicazioni hanno accesso in scrittura al proprio schema / set di tabelle e accesso in lettura a un altro schema / set di tavoli. Molto spesso questi dati a cui un'applicazione / modulo ottengono l'accesso in sola lettura potrebbero essere descritti come "dati principali" .
In quel momento non ho visto i problemi suggeriti dalle risposte precedenti, quindi penso che valga la pena dare un'occhiata più da vicino ai punti sollevati nelle risposte precedenti in modo più dettagliato.
Scenario: leghi direttamente un paio di componenti a un RDBMS e vedi un particolare componente diventare un collo di bottiglia prestazionale
Sono d'accordo con questo commento, tranne per il fatto che questo è anche un argomento per avere una copia dei dati localmente per la lettura del microservizio. Cioè, la maggior parte dei database maturi supporta la replica e quindi, senza alcuno sforzo dello sviluppatore, i "dati principali" possono essere replicati fisicamente nel database dei microservizi se ciò è desiderato o necessario.
Alcuni potrebbero riconoscerlo come un "database aziendale" replicando le tabelle core in un "database dipartimentale". Un punto qui è che in genere è buono se un database lo fa per noi con la replica integrata dei dati modificati (solo delta, in forma binaria e con costi minimi per il database di origine).
Al contrario, quando le nostre scelte di database non consentono questo supporto di replica "standardizzato", possiamo entrare in una situazione in cui vogliamo spingere "dati anagrafici" nei database dei microservizi e questo può comportare una notevole quantità di sforzi degli sviluppatori e essere anche un meccanismo sostanzialmente meno efficiente.
potrebbe voler denormalizzare il database, ma non è possibile perché tutti gli altri componenti ne risentirebbero
Per me questa affermazione non è corretta. La denormalizzazione è un cambiamento "additivo" e non un "cambiamento di rottura" e nessuna applicazione dovrebbe rompersi a causa della denormalizzazione.
L'unico modo in cui un'interruzione di un'applicazione è in cui il codice dell'applicazione utilizza qualcosa come "select * ..." e non gestisce una colonna aggiuntiva. Per me sarebbe un bug nell'applicazione?
In che modo la denormalizzazione può interrompere un'applicazione? Mi sembra FUD.
Dipendenza dallo schema:
Sì, l'applicazione ora ha una dipendenza dallo schema del database e la conseguenza è che questo dovrebbe essere un grosso problema. Mentre l'aggiunta di qualsiasi dipendenza aggiuntiva non è ovviamente l'ideale, la mia esperienza è che una dipendenza dallo schema del database non è stata un problema, quindi perché potrebbe essere così? Sono stato solo fortunato?
Dati anagrafici
Lo schema a cui normalmente vorremmo che un microservizio avesse accesso in sola lettura è più comunemente quello che definirei " dati anagrafici " per l'impresa. Ha i dati di base essenziali per l'impresa.
Storicamente questo significa che lo schema su cui aggiungiamo la dipendenza è maturo e stabile (un po 'fondamentale per l'impresa e immutabile).
Normalizzazione
Se 3 progettisti di database vanno e progettano uno schema db normalizzato, finiranno con lo stesso design. Ok, potrebbe esserci qualche variazione 4NF / 5NF ma non molto. Inoltre, ci sono una serie di domande che il designer può porre per convalidare il modello in modo che il designer possa essere sicuro di essere arrivato a 4NF (sono troppo ottimista? Le persone che lottano per arrivare a 4NF?).
aggiornamento: Per 4NF qui intendo che tutte le tabelle nello schema sono arrivate alla loro forma normale più alta fino a 4NF (tutte le tabelle sono state normalizzate in modo appropriato fino a 4NF).
Credo che il processo di progettazione della normalizzazione sia il motivo per cui i progettisti di database sono generalmente a proprio agio con l'idea di dipendere da uno schema di database normalizzato.
Il processo di normalizzazione porta il design del DB a un design "corretto" noto e le variazioni da lì dovrebbero essere denormalizzazione per le prestazioni.
- Possono esserci variazioni in base ai tipi di DB supportati (JSON, ARRAY, tipo di supporto geografico ecc.)
- Alcuni potrebbero argomentare per una variazione basata su 4NF / 5NF
- Escludiamo la variazione fisica (perché non importa)
- Limitiamo questo al design OLTP e non al design DW perché quelli sono gli schemi a cui vogliamo garantire l'accesso in sola lettura
Se a 3 programmatori fosse assegnato un progetto da implementare (come codice) l'aspettativa sarebbe per 3 diverse implementazioni (potenzialmente molto diverse).
Per me esiste potenzialmente una questione di "fede nella normalizzazione".
Rompere le modifiche allo schema?
La denormalizzazione, l'aggiunta di colonne, l'alterazione di colonne per l'archiviazione più ampia, l'estensione del design con nuove tabelle ecc. Sono tutte modifiche non interruttive e i progettisti di DB che sono arrivati al 4 ° modulo normale ne saranno certi.
È ovviamente possibile interrompere le modifiche eliminando colonne / tabelle o apportando una modifica al tipo di interruzione. Possibile sì, ma in termini pratici non ho riscontrato alcun problema qui. Forse perché si capisce quali sono i cambiamenti di rottura e questi sono stati ben gestiti?
Sarei interessato a sentire casi di interruzione delle modifiche dello schema nel contesto di schemi condivisi di sola lettura.
Cosa c'è di più importante e significativo in un microservizio: la sua API o il suo schema di database? L'API, perché questo è il suo contratto con il resto del mondo.
Mentre sono d'accordo con questa affermazione, penso che ci sia un avvertimento importante che potremmo sentire da un Enterprise Architect che è "Data vive per sempre" . Cioè, mentre l'API potrebbe essere la cosa più importante, i dati sono anche piuttosto importanti per l'impresa nel suo insieme e saranno importanti per molto tempo.
Ad esempio, una volta che è necessario popolare Data Warehouse for Business intelligence, lo schema e il supporto CDC diventano importanti dal punto di vista del reporting aziendale indipendentemente dall'API.
Problemi con le API?
Ora, se le API fossero perfette e facili, tutti i punti sarebbero controversi, dato che sceglieremmo sempre un'API anziché avere accesso locale in sola lettura. Quindi la motivazione per considerare anche l'accesso di sola lettura locale è che potrebbero esserci dei problemi nell'uso delle API che l'accesso locale evita.
What motivates people to desire local read-only access?
Ottimizzazione API:
LinkedIn ha un'interessante presentazione (dal 2009) sulla questione dell'ottimizzazione della loro API e del perché è importante per loro su vasta scala. http://www.slideshare.net/linkedin/building-consistent-restful-apis-in-a-highperformance-environment
In breve, una volta che un'API deve supportare molti casi d'uso diversi, può facilmente entrare nella situazione in cui supporta un caso d'uso in modo ottimale e il resto piuttosto male dal punto di vista della rete e del database.
Se l'API non ha la stessa raffinatezza di LinkedIn, puoi facilmente ottenere gli scenari in cui:
- L'API recupera molti più dati del necessario (sprechi)
- API Chatty dove devi chiamare l'API più volte
Sì, possiamo ovviamente aggiungere la memorizzazione nella cache alle API, ma alla fine la chiamata API è una chiamata remota e ci sono una serie di ottimizzazioni disponibili per gli sviluppatori quando i dati sono locali.
Ho il sospetto che ci sia un gruppo di persone là fuori che potrebbero aggiungerlo come:
- Replica a basso costo dei dati anagrafici nel database dei microservizi (senza costi di sviluppo e tecnicamente efficiente)
- Fede nella normalizzazione e la resilienza delle applicazioni ai cambiamenti dello schema
- Capacità di ottimizzare facilmente ogni caso d'uso ed evitare potenzialmente chiamate API remote loquaci / dispendiose / inefficienti
- Oltre ad alcuni altri vantaggi in termini di vincoli e design coerente
Questa risposta è troppo lunga. Scuse!!