È una buona idea usare sinonimi per evitare di creare una tabella duplicata?


13

Abbiamo 3 copie dello stesso database esatto. Tutti e 3 i database hanno una Userstabella e un utente esisterà sempre in tutti e 3 i database con le stesse impostazioni esatte. Ogni volta che vogliamo aggiungere o modificare un utente, dobbiamo aggiornare 3 database.

Sarebbe una buona idea eliminare la Userstabella dai database 2 e 3 e sostituirla con una Synonymche punti al database 1?

Ecco i pro / contro che mi vengono in mente:

Professionisti

  • Manutenzione più semplice. Può aggiornare gli utenti in una posizione anziché 3
  • Gli ID utente corrisponderebbero tra i database (importante poiché molte app aggiuntive si basano su UserId)

Contro

  • Non pensare che questa sia una procedura standard, quindi potrebbe essere fonte di confusione
  • Gli utenti dovrebbero avere impostazioni identiche tra i database
  • (Dalla risposta di gbn di seguito) Se il Database 1 dovesse mai andare in fumo, anche i Database 2 e 3 non saranno disponibili. Inoltre, esiste il potenziale problema che i dati risultino incoerenti in caso di ripristino

Questa è un'opzione che sto prendendo in considerazione per alcune diverse tabelle contenenti impostazioni identiche tra i database, non solo la Userstabella. Sto usando gli utenti nell'esempio poiché è facile da capire.


3
Avrebbe più senso avere uno script per sincronizzare / unire le differenze tra loro? Personalmente non mi piace far dipendere 2 database da un terzo a causa di un sinonimo come questo.
FrustratedWithFormsDesigner,

@FrustratedWithFormsDesigner Sembra molto più lavoro ed è difficile unire le modifiche ai campi generati automaticamente come una chiave primaria.
Rachel,

Dipende dalla fantasia che vuoi ottenere. Se si desidera condividere le modifiche tra di loro, sì, può complicarsi. Se vuoi designarne uno come Maestro, allora si tratta semplicemente di sovrascrivere il contenuto degli altri con il contenuto del Maestro.
FrustratedWithFormsDesigner,

@FrustratedWithFormsDesigner Sfortunatamente l'applicazione è a codice chiuso e non c'è nulla che impedisca alle persone di aggiungere o modificare utenti in qualsiasi database. Dovrei apportare le modifiche in due modi poiché tutti hanno la possibilità di cambiare la propria password e quasi tutti i gestori hanno accesso alla gestione degli utenti per aggiungere / modificare utenti.
Rachel,

Risposte:


6

Perché hai 3 database con gli stessi utenti?

Cosa succede se un database si arresta adesso?

Sto ponendo queste domande perché il Con del database di origine utente che va in giù impedendo l'uso degli altri due database potrebbe non essere un problema così grande come sembra.

Inoltre, se un database si arresta ora, si avranno già problemi di coerenza se gli utenti vengono modificati negli altri due DB durante quel periodo. Non credo che possiamo dare il miglior consiglio senza più contesto.

In questo momento vorrei creare un quarto database per gli utenti, apportare modifiche solo lì e sincronizzarmi con gli altri database. Sei già distribuito-denormalizzato modificando essenzialmente gli stessi dati in tre punti e probabilmente hai già problemi di coerenza. Se la tolleranza agli errori è importante, questo schema lo fornisce ancora durante la risoluzione del problema di inserimento multiplo.

Penso che avere questo quarto database solo per utenti / impostazioni piuttosto che utilizzare uno dei tuoi database esistenti sia una buona strategia in quanto diventa meno probabile che vada giù poiché non è legato ad altre risorse o utilizzato pesantemente. Vedo ora che hai detto che non puoi farlo, ma non sono chiaro sul perché. Le applicazioni sul database principale supportano direttamente la modifica dell'utente o la modifica dell'utente è una funzione completamente separata che può essere indirizzata altrove?

È vero, con questa idea di "tabella utenti canonica", sia che si utilizzino sinonimi o si sincronizzino i dati, non è possibile modificare gli utenti durante un DB utente discendente, ma a me sembra giusto. Risolvi il problema e risolvilo! Una fonte, un posto da modificare, una cosa da riparare se rotta. Con la sincronizzazione, tutti gli altri database hanno copie temporanee da cui possono lavorare, ma nessuna modifica. Ridurre al minimo la duplicazione dei dati tra i sistemi è un obiettivo grande e utile. È un problema serio inserire gli stessi dati in tre punti, quindi fai tutto il possibile per eliminarli.

Per rispondere a più dei tuoi commenti, se i tuoi ID utente sono diversi in tutte le tue applicazioni, allora dovresti considerare seriamente un tempo di inattività pianificato per i tuoi due nuovi database per metterli in sincronia con quello principale (fai una domanda separata se hai bisogno di idee su come realizzare questo, che è difficile ma non è così difficile).

Se analizzi le tue esigenze aziendali e scopri che il database principale deve avere i dati dell'utente che vanno bene, lo usi comunque come canonico, quindi scegli tra sinonimi o sincronizzazione per affrontare l'impatto dei tempi di inattività non pianificati su tutti i database.

Un ulteriore svantaggio dell'uso dei sinonimi è che non si sarebbe più in grado di avere FK appropriati per gli utenti in ciascun database.


3

Manca un "Con"

Al ripristino, è possibile che l'utente non esista nel database di destinazione (del sinonimo). Dì che è danneggiato e devi ripristinare da un backup.

Cioè, l'uso di sinonimi assumerà integrità referenziale tra database che non può accadere nella vita reale.

Un'altra conseguenza di ciò sarebbe userid non corrispondenti quando si tenta di recuperare da questo. (aggiungendo l'utente dopo il ripristino). Tuttavia, ciò non dovrebbe mai essere assunto a causa dell'integrità referenziale tra database che ho menzionato.

Quindi, non farlo ...

Una risposta correlata su dba.se: criteri di decisione su quando utilizzare uno schema non dbo rispetto a un nuovo database sull'integrità referenziale tra database dopo i ripristini


Un buon punto sulla possibilità che l'obiettivo non esista, anche se sto ancora cercando di capire perché il link è legato a questa domanda
Rachel,

1
@ Rachel: no, la tabella di destinazione può esistere ma i dati potrebbero essere più vecchi. Quindi quando ripristini hai un utente mancante ... Il link riguarda "integrità referenziale tra database"
gbn

2

A seconda della piattaforma del database, un'altra opzione è eliminare le tabelle nei database 2 e 3 e sostituirle con viste materializzate della tabella nel database 1.

Professionisti

  • Manutenzione più semplice (dei dati)
  • ID corrispondenti
  • Le interruzioni non influiscono su altri database (almeno fino a quando non è necessario apportare modifiche)
  • È possibile utilizzare qualsiasi database per ripristinare la tabella.

Contro

  • I dati sono aggiornati solo come il programma di aggiornamento.
  • Se la definizione della tabella cambia, potrebbe essere necessario modificare anche le viste materializzate.

Si noti inoltre che, a seconda della frequenza delle ricerche, della frequenza degli aggiornamenti e della frequenza della modifica dei dati, ciò può o meno introdurre più carico di una soluzione sinonimo.


Aggiornamento: il commento di FrustratedWithFormsDesigner è essenzialmente una vista materializzata per piattaforme che non possono eseguire viste materializzate. Utilizzando uno script, le tabelle potrebbero essere periodicamente sincronizzate. Se un database è designato come master, tutti gli script potrebbero apportare le modifiche in base ad esso. Ciò avrebbe tutti i pro e i contro di una visione materializzata; semplicemente non poteva sfruttare la funzionalità integrata.


1
Non è possibile materializzare le viste (viste indicizzate qui) cross-db in SQL Server + non devono essere aggiornate: sono "in tempo reale"
gbn

@gbn Il mio post è stato scritto prima dell'aggiunta del tag SQL Server.
Leigh Riffel,

Ho aggiunto il tag in base alla tua risposta :)
Rachel,

1

Vorrei creare un quarto DB che memorizza le informazioni utente condivise. Creare Synonymso Viewsin ciascuno degli altri DBS che puntano al DB degli utenti.

Infine, creerei una tabella di estensioni (una tabella con una relazione One-one con "UserDB.Usertable") in ognuna delle 3 dbs esistenti che contengono i dati dell'utente specifici dell'app.


Modifica: in base al commento qui sotto

In tal caso, fare in modo che il primo db funga da tabella utente principale. Synonymse una tabella di estensione in ciascuno degli altri Dbs.

Nota importante : con questo approccio, se la tua prima app si interrompe, le altre due vengono abbattute con essa! Assicurati che tutti comprendano questo inconveniente.


Purtroppo non è un'opzione per me. Sarebbe la mia opzione preferita se stavo progettando qualcosa da zero, ma in questo caso sto lavorando con un sistema preesistente. Nel mio caso, avevamo il Database 1 che esisteva da molti anni e abbiamo recentemente aggiunto i Database 2 e 3.
Rachel,

Perché è possibile eliminare le tabelle e puntare il Sinonimo al primo db ma non a uno nuovo?

Scusa, ho modificato il mio commento prima di vedere il tuo. Il database 1 esiste da molti anni ed è accessibile da molte app esterne. Non sono sicuro di quale tipo di danno provocherei rimuovendo quel tavolo. I database 2 e 3 sono più recenti, quindi penso di poter fare a meno di rimuovere la tabella Users (e altre tabelle delle impostazioni) e sostituirli con sinonimi
Rachel,

Vedo la tua modifica ... è esattamente quello che sto cercando di fare, ma la mia domanda era: è una buona idea o no, e se no, perché?
Rachel,

Va bene. Se stai bene rendendo le 2 app di notizie completamente dipendenti dalla prima app.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.