Abbiamo un database di livello aziendale su larga scala. Come parte del nostro modello di business, tutti gli utenti Web colpiscono i nostri server Web ogni mese allo stesso tempo, il che a sua volta martella la nostra casella sql. Il traffico è molto intenso e continua a crescere più pesante quanto più cresce l'azienda. l'ottimizzazione di sql proc è stata eseguita e l'hardware è già stato ridimensionato a un livello molto alto.
Stiamo cercando di frammentare il database ora per assicurarci di poter gestire la crescita dell'azienda e i carichi futuri.
Abbiamo deciso quali dati particolari dovrebbero essere suddivisi. È un sottoinsieme del nostro database molto utilizzato.
Tuttavia, la mia domanda riguarda i dati non condivisi che sono comuni / universali. Un esempio di dati come questo può essere una tabella di inventario, ad esempio o una tabella dei dipendenti, una tabella degli utenti, ecc.
Vedo due opzioni per gestire questi dati comuni / universali:
1) design 1 - Posiziona i dati comuni / universali in un database esterno. Tutte le scritture verranno eseguite qui. Questi dati verranno quindi replicati fino a ciascun frammento consentendo a ciascun frammento di leggere questi dati e unirli internamente a questi dati in procs t-sql.
2) design 2 - Dai a ogni frammento la propria copia di tutti i dati comuni / universali. Consentire a ogni frammento di scrivere localmente su queste tabelle e utilizzare la replica di unione sql per aggiornare / sincronizzare questi dati su tutti gli altri frammenti.
preoccupazioni per il design n. 1
1) Problemi transazionali: se si verifica una situazione in cui è necessario scrivere o aggiornare i dati in un frammento e quindi scrivere / aggiornare una tabella comune / universale in 1 proc memorizzato, ad esempio, non sarà più possibile farlo facilmente. I dati ora esistono su istanze e database sql separati. Potrebbe essere necessario coinvolgere MS DTS per vedere se è possibile racchiudere queste scritture in una transazione poiché si trovano in un database separato. Le prestazioni sono una preoccupazione in questo caso e potrebbero essere coinvolte possibili riscritture per i proc che scrivono su dati condivisi e comuni.
2) una perdita di integrità referenziale. Non è possibile eseguire l'integrità referenziale tra database.
3) Ricodifica di vaste aree del sistema in modo che sappia scrivere dati comuni nel nuovo database universale ma leggere dati comuni dai frammenti.
4). aumento dei viaggi nel database. Come il n. 1 sopra, quando si verifica una situazione in cui è necessario aggiornare i dati condivisi e i dati comuni, si effettueranno più round trip per ottenere ciò poiché i dati si trovano ora in database separati. Un po 'di latenza di rete qui, ma non sono preoccupato per questo problema tanto quanto sopra 3.
preoccupazioni per il design n. 2
Nel progetto n. 2 ogni frammento ottiene la propria istanza di tutti i dati comuni / universali. Ciò significa che tutto il codice che unisce o aggiorna i dati comuni continua a funzionare / eseguire esattamente come avviene oggi. Il team di sviluppo necessita di pochissime ricodifiche / riscritture. Tuttavia, questo design dipende completamente dalla replica di unione per mantenere i dati sincronizzati tra tutti i frammenti. i dbas sono altamente qualificati e sono molto preoccupati che l'unione della replica potrebbe non essere in grado di gestirla e che la fusione non riesca, che il recupero da questo errore non è eccezionale e potrebbe avere un impatto molto negativo su di noi.
Sono curioso di sapere se qualcuno ha scelto l'opzione di progettazione n. 2. Sono anche curioso di sapere se sto trascurando una terza o quarta opzione di design che non vedo.
Grazie in anticipo.