Questa è una domanda di progettazione / pianificazione , non specifica per un particolare software / implementazione. Le cose di cui sto parlando non esistono ancora, ma spero di evitare errori all'inizio del processo.
Ecco la situazione che mi piacerebbe dare consigli su:
- Abbiamo 7 "verticali" aziendali (ad esempio vendite, marketing, ecc.) con ogni verticale che mantiene separatamente i suoi dati e un'API RESTful che usano per consentire l'accesso ai propri dati.
- I dati grezzi vengono mantenuti separatamente dalla rispettiva verticale. Ciò conferisce a ciascun verticale più libertà di definire la propria architettura, la pipeline dei dati e l'elaborazione.
- L'API per ogni verticale viene utilizzata per definire un "contratto" di livello superiore che dovrebbe rimanere invariato (sintatticamente e semanticamente) indipendentemente dalle modifiche all'architettura dei dati sottostante.
Ecco il problema:
Ci piace l'idea di cui sopra perché disaccoppia ogni business unit. Tuttavia, il disaccoppiamento è anche un problema --- dal momento che facciamo parte di una singola azienda, ci siamo resi conto che condividiamo un modello di dati comune per un ampio sottoinsieme dei nostri dati.
Ad esempio: i potenziali siti di progetto sono tracciati dal team di marketing, quindi perseguiti dal team commerciale come un'opportunità, poi persi / vinti dalle vendite, quindi progettati dall'ingegneria e mantenuti dai servizi.
Ogni verticale tiene traccia di cose diverse su queste entità e potrebbe non avere cardinalità one-to-one (ad es. opportunità multiple per potenziale progetto).
Un altro esempio è l'applicazione dei vincoli di denominazione: abbiamo un insieme comune di nomi per concorrenti, modelli, paesi, ecc. e vogliamo applicarlo nei nostri set di dati così, ad esempio, "Acme X-35" è l'unico modo per descrivere questa marca e modello su tutti i nostri set di dati.
le mie idee
Indirizzamento delle connessioni tra modelli di dati (meta modello)
O applichiamo il modello di dati cross-database "per convenzione" (sembra fragile) o creiamo un "meta database" che estrae da ciascuna API in un database relazionale composto da "viste" ... creiamo e mettiamo in relazione un Mazzo di viste materializzate (senza tabelle non elaborate). Questo database conterrà campi e tabelle normalizzati che implementano il modello comune.
Applicazione dei vincoli di denominazione
L'assunto chiave è che i nomi sono immutabili dopo che decidiamo su di loro. Supponendo che ciò valga, possiamo fornire un semplice "server di convalida" che serve i nomi consentiti per un campo (una tabella di ricerca RESTful, in sostanza) e ogni database può incorporare questo nel proprio flusso di lavoro di convalida.
Ok, come puoi vedere, ho provato a riflettere su questo, ma non sono sicuro che ci sia un modo più standard per coordinare e sincronizzare il modello di dati cross-database con i vincoli.