Come utilizzare correttamente un database contenente tabelle comuni in un sistema multi-applicazione?

4

Sto cercando di determinare la migliore applicazione e l'architettura del database per un progetto su cui sto lavorando.

L'idea è che ci saranno più applicazioni separate che condivideranno tutte le tabelle come un utente e una tabella Employee. Ogni Applicazione avrà una porzione web (che potrebbe richiedere un'API, a seconda che il rendering sia lato server o lato client) e una porzione iOS (che richiederà un'API). Se decido di eseguire il rendering lato client e utilizzare un qualcosa come Vue.js, React o Ember. Potrei riuscire a consolidare le API web e iOS. (Una nota a margine: mi sento molto più a mio agio con il rendering lato server e dovrei imparare un framework JS se decido di andare dal lato client ma lo faremo se questa è l'opzione migliore.)

Attualmente ho 3 diversi approcci su come implementare questo tipo di sistema. Tutti loro separano le tabelle comuni all'interno di un database separato che chiamerò COMMON_DB.

(scusate per favore l'ultima opzione, ho dovuto ridisegnarla dalla prima pagina.)

-------------------- Descrizione del testo delle opzioni -------------------

Opzione 1:

Usa un'API insieme a GraphQL che faccia tutte le comunicazioni con tutti i database del sistema. Se c'erano 2 applicazioni Web, l'API avrebbe 3 database collegati, DB_APP_1, DB_APP_2 e DB_COMMON. Il database comune conterrebbe tabelle duplicate / condivise tra le 2 applicazioni. Le applicazioni (App1 e App2) sarebbero server client o server laterali e sarebbero in grado di comunicare con l'API DB per ottenere determinate informazioni richieste.

Opzione 2:

Ogni applicazione si connette a 2 diversi database. L'app 1 si collegherebbe a DB_APP_1 e DB_COMMON, l'app 2 si collegherebbe a DB_APP_2 e DB_COMMON. App1 e App 2 sarebbero server-side (ether API per client-side o rendering client tramite rendering lato server)

Opzione 3:

Ogni applicazione comunica con un server API comune. Il server API comune ha 1 database, ovvero le tabelle comuni di ciascuna applicazione. Ogni app ha il proprio database, che contiene tutta la tabella univoca per ogni applicazione. Ogni Applicazione non avrebbe accesso diretto al database comune come l'Opzione 2. Di nuovo, l'app 1 e l'app 2 sarebbero API lato server, etere per un rendering lato client o rendering lato client.

Attualmente sto combattendo su quale di questi approcci sarebbe il più vantaggioso e prevenirò i blocchi stradali in futuro. Ci sarà un po 'di apprendimento delle nuove tecnologie che ci si può aspettare.

Qualunque opinione e opinione sarebbe molto apprezzata, per favore fatemi sapere se qualcosa non è chiaro o avete qualche domanda.

Grazie

    
posta SegFaultDev 20.04.2018 - 18:42
fonte

2 risposte

2

Mi piace l'opzione 1. Le tue app ignorano quindi il loro schema di persistenza sottostante e la gestione della persistenza viene eseguita dall'API (o livelli sotto / all'interno).

Un percorso comune sarebbe la tua opzione # 1, con un pattern di repository che ha un'interfaccia come "get this", "get that", e l'implementazione del repository si occupa di estrarre le informazioni da (e salvare le informazioni in) database corretto.

In alternativa, un'API separata per ogni app, in cui ogni API ha un repository da qualche parte sotto che fa la stessa cosa.

Eviterei che le app "parlino" direttamente con il database come indicato nelle opzioni 2 e 3.

Ricorda che (in genere) ogni componente non dovrebbe in genere riguardare i dettagli dei servizi sottostanti.

In generale, più i tuoi servizi / livelli sono separati, più è facile mantenerli a lungo termine, al costo di una configurazione iniziale più complessa. D'altra parte, iniziare con un'architettura molto semplice può essere estremamente difficile da trattare in seguito, quindi se c'è una qualche longevità attesa nel progetto, sono molto più adatto ad andare con l'investimento in architettura.

Ci sono molte varianti su di esso (e se stai facendo qualcosa come microservizi sei in un regno molto diverso), ma ecco una rapida visione che ottiene il punto di partenza:

    
risposta data 20.04.2018 - 19:30
fonte
2

Sto vedendo la necessità di tabelle comuni, che poi sono esplose in più database. Questo mi preoccuperebbe.

Separare il livello dell'applicazione in più applicazioni può essere un buon punto di partenza, ma separare i database non è sicuramente il primo passo.

Crea 1 database. Le tabelle "comuni" andrebbero in uno schema "comune". Ogni applicazione otterrebbe il proprio schema e può contenere riferimenti a chiavi esterne a tabelle nello schema comune.

Da lì sei libero di suddividere il livello applicazione in tutte le app e le API che ritieni più idonee.

Se le prestazioni del database sono un problema, iniziare con un'architettura server che consenta la condivisione del database. Ciò può aiutare a distribuire il carico e, poiché vengono utilizzati più server, è possibile aggiornare l'hardware senza un "ecosostenimento" coordinato delle applicazioni da un nuovo database aggiornato.

Inizia con 1 database. Schemi separati. Dividi il tuo livello di applicazione in tutti i livelli, API e micro servizi che ritieni adatti. È molto più semplice rifattorizzare il codice che ristrutturare i dati, in particolare i dati in server di database separati.

Quando si estraggono report troppo lenti, è ora di aggiungere un "database di report". Dopo tutto, i rapporti trimestrali non hanno bisogno di dati aggiornati al secondo. La coerenza finale va bene per questo.

Quindi fondamentalmente le opzioni 1-3 sembrano buone, tranne la parte del database. Farli puntare tutti allo stesso DB. Quindi scegli qualsiasi opzione che ti piace.

Aggiornamenti in risposta ai commenti:

SegFaultDev ha commentato:

With mySQL, every schema is actually a Database, as they are synonymous ( at least that is my understanding of it).

Penso che il punto principale sia quello di consentire l'integrità referenziale tra database / schemi / raccolte di tabelle all'inizio. Rompila solo in sistemi completamente separati se devi assolutamente. MySQL non dovrebbe avere un problema con questo.

È del tutto perfetto rompere il livello delle applicazioni in più sistemi (applicazioni web, web API, micro-servizi), ma con l'architettura generale avrai ancora più tempo a disposizione se il tuo meccanismo di archiviazione dei dati è un'unità coesa, sia "schemi" in Oracle o "database" in MySQL.

    
risposta data 21.04.2018 - 03:54
fonte