Progettazione di un'applicazione Web con due diversi database di backend [chiuso]

0

Sto lavorando a un'applicazione web LAMP piuttosto standard. Il server stesso ha un database MySQL standard e l'applicazione è scritta in PHP. Il kicker è, usiamo anche database SQL Server con questa applicazione.

L'impostazione corrente dei dati è questa:

  • MySQL memorizza le informazioni dell'account utente (Username, password, privilegi, ecc.) e un "identificatore di connessione".
  • L'identificatore di connessione si collega a un'altra tabella che memorizza le credenziali di connessione per un database del server SQL.
  • Quando un utente effettua l'accesso, viene stabilita una connessione a un database SQL Server remoto (questi sono ospitati indipendentemente dall'applicazione Web e non nel mio controllo).
  • Usando questa connessione, l'applicazione web elabora ed emette i dati (solo letture, nessuna scrittura).

L'applicazione si è evoluta notevolmente e, mentre l'organizzazione e le pratiche sono migliorate, il design è ancora piuttosto disordinato e confuso. Faccio fatica ad implementare qualsiasi tipo di framework o ORM perché la maggior parte sono progettati con un database in mente.

Ho unito insieme un framework che funziona molto bene per i report (dove è necessaria solo la connessione SQL Server) ma non va bene con le cose come l'interazione con l'account (dove il server SQL viene utilizzato per la convalida dei dati che entrano in MySQL).

L'installazione non sembra che cambierà quindi mi chiedevo se ci fosse qualche consiglio sulla progettazione e sul mantenimento di un'applicazione web con due diversi database back-end allo stesso tempo.

Da un lato, memorizzare le credenziali per i database SQL Server remoti nel nostro database MySQL mi rende nervoso. Posso solo crittografare le password in quanto ne ho bisogno per le connessioni e, così com'è attualmente, tutti gli account utilizzati sono account admin con privilegi completi. Non qualcosa che vuoi uscire soprattutto quando questi database sono aperti per le connessioni Internet. Quindi qualsiasi consiglio sarebbe bello.

    
posta Will Meldon 26.12.2012 - 20:49
fonte

2 risposte

3

When a user logs in, a connection is made to a remote SQL Server database (these are hosted independently of the web application and not in my control).

Spero che la connessione al server SQL non venga effettuata e mantenuta quando l'utente accede in modo arbitrario. La connessione deve essere presa dal pool solo quando necessario, il più tardi possibile, quindi restituita alla piscina il prima possibile.

Using that connection, the web application processes and outputs the data (only reads, no writes).

Se i dati sono di sola lettura, non utilizzare gli account admin con privilegi completi. Utilizza solo ciò di cui hai bisogno.


Consigli:
Gli unici problemi che vedo sono operazioni che si estendono su entrambi i database o che tengono sincronizzati i dati duplicati.

Se i dati devono essere duplicati, provare a limitarli a surrogare le chiavi che non cambiano MAI. Evitare la duplicazione dei dati per motivi di prestazioni. Ciò renderà la tua vita molto più semplice e, ironia della sorte, potrebbe migliorare le prestazioni se ci sono aggiornamenti enormi.

Non astrarre il fatto che ci sono 2 DB nel livello dati. Rendi questo fatto il più chiaro ed esplicito possibile.

Non rendere la chiusura di una connessione dipendente dal completamento di un'operazione sul database 2cd. (tranne nel caso di transazioni atomiche)

Unire insiemi tra MySQL e SQLServer sarà un problema. Recupera i set di dati da entrambi i DB (filtrati il più finemente possibile) quindi esegui il "join" nel codice. Il codice di stile funzionale sarebbe molto utile qui, ma l'imperativo farà il lavoro.

Le transazioni atomiche che si estendono su entrambi i DB sono un problema. (anche se non nello scenario) È necessario eseguire il commit a 1 db prima dell'altro, quindi è necessario eseguire un rollback manuale se il commit fallisce sul DB 2cd. Non vedo una via facile là fuori.

    
risposta data 26.12.2012 - 21:56
fonte
2

Separa il codice del database dal resto dell'applicazione in modo che il resto dell'applicazione riceva i dati da una fonte, il tuo codice base separato (astratto).

Per quanto riguarda le tue credenziali SQL Server, spero che la connessione tra il tuo software web e SQL Sever sia sicura. Per quanto riguarda la memorizzazione delle credenziali, crittografare come dici tu e denominare la tabella con le credenziali qualcosa di innocuo (come gli hobby dei clienti). Blocca i privilegi sulla tabella delle credenziali per leggere solo dalla tua applicazione.

    
risposta data 26.12.2012 - 21:29
fonte

Leggi altre domande sui tag