Domanda

In un database-centric applicazione che è stato progettato per più clienti, ho sempre pensato che fosse "migliore" per l'utilizzo di un database unico per TUTTI i clienti - associazione di record, con la corretta indici e le chiavi.In ascolto di Overflow dello Stack podcast, ho sentito Joel ricordare che FogBugz utilizza un database per ogni client (quindi se ci sono stati 1000 clienti, ci sarebbero 1000 database).Quali sono i vantaggi dell'utilizzo di questa architettura?

Posso capire che per alcuni progetti, i clienti hanno bisogno di un accesso diretto a tutti i dati in un'applicazione, è ovvio che ogni cliente ha bisogno di un proprio database.Tuttavia, per i progetti in cui un client non ha bisogno di accedere direttamente al database, ci sono vantaggi per l'utilizzo di un database per ogni cliente?Sembra che in termini di flessibilità, è molto più semplice di utilizzare un unico database con una sola copia delle tabelle.E ' più facile aggiungere nuove funzioni, è più facile per creare report, ed è più facile da gestire.

Ero abbastanza fiducioso nel "database unico per tutti i clienti" metodo fino a quando ho sentito Joel (uno sviluppatore esperto) ricordare che la sua software utilizza un approccio diverso, e io sono un po ' confuso con la sua decisione...

Ho sentito citare che i database di rallentare, con un numero elevato di record, ma qualsiasi database relazionale con un po ' di merito non hanno questo tipo di problema, soprattutto se gli indici appropriati e i tasti sono utilizzati.

Ogni ingresso è molto apprezzato!

È stato utile?

Soluzione

Assumere c'è nessuna scala di rigore per la memorizzazione di tutti i clienti in un database;per la maggior parte delle persone, e ben configurato database/query, questo sarà abbastanza vero in questi giorni.Se non siete una di queste persone, beh, allora il beneficio di un singolo database è evidente.

In questo caso, i benefici dal incapsulamento di ogni cliente.Dal codice prospettiva, ogni client esiste in isolamento - non è possibile una situazione in cui l'aggiornamento di un database, è possibile sovrascrivere, corrotti, recuperare o modificare i dati appartenenti a un altro client.Questo semplifica anche il modello, in quanto non si devono mai prendere in considerazione il fatto che i record potrebbe appartenere a un altro client.

Potete anche ottenere i benefici di separabilità - è banale per estrarre i dati associati a un determinato cliente ,e li sposta in un altro server.O ripristinare un backup del client quando la chiamata fino a dire "Abbiamo eliminato alcuni dati chiave!", utilizzando il database incorporato meccanismi.

Si ottiene un facile e gratuito del server di mobilità - se si outscale un server di database, si può solo ospitare i nuovi clienti su un altro server.Se fossero tutti in una sola banca, avete bisogno di ottenere di più massiccio hardware, o eseguire il database su più macchine.

Si ottiene un facile controllo - se un cliente vuole rimanere sulla versione 1.0 del software, e un altro vuole 2.0, dove il 1.0 e 2.0 utilizzare diversi schemi di database, non c'è nessun problema, è possibile eseguire la migrazione senza dover tirare fuori un database.

Posso pensare a qualche decina di più, credo.Ma tutto sommato, il concetto chiave è "semplicità".Il prodotto gestisce un cliente e, quindi, di un database.Non c'è mai alcuna complessità del "Ma il database contiene anche altri clienti" il problema.Si adatta il modello mentale dell'utente, dove esiste da solo.Vantaggi come essere in grado di fare attività di reporting su tutti i client alla volta, sono minimi - come spesso si desidera un rapporto sul mondo intero, piuttosto che uno solo del client?

Altri suggerimenti

Qui è un approccio che ho visto prima:

  • Ogni cliente ha una unica stringa di connessione memorizzati in un master database di clienti.
  • Il database è stato progettato in modo che tutto ciò che è segmentato per CustomerID, anche se non c'è un singolo cliente in un database.
  • Gli script vengono creati per eseguire la migrazione di tutti i dati dei clienti in un nuovo database, se necessario, e solo poi, che il cliente stringa di connessione deve essere aggiornata per indicare la nuova posizione.

Questo permette di usare un unico database, e quindi facilmente segmentazione più di una volta hai avuto un gran numero di clienti o, più comunemente, quando si dispone di un paio di clienti che un uso eccessivo del sistema.

Ho trovato che il ripristino di specifici dati dei clienti è veramente dura quando tutti i dati nello stesso database, ma la gestione di aggiornamenti è molto più semplice.

Quando si utilizza un unico database per ogni cliente, si esegue in un problema enorme di mantenere tutti i clienti, a parità di versione di schema, e che non ha nemmeno prendere in considerazione processi di backup di un intero gruppo di cliente-specifiche banche dati.Naturalmente il ripristino dei dati è più facile, ma se si assicurarsi di non eliminare definitivamente record (basta segnare con un flag cancellato o spostare una tabella di archivio), quindi si hanno meno necessità di ripristino di database, in primo luogo.

Per mantenere le cose semplici.Si può essere sicuri che il vostro cliente è solo che vedendo i loro dati.Il cliente, con un minor numero di record non deve pagare la penale di dover competere con centinaia di migliaia di record che possono essere nel database, ma non i loro.Non mi importa quanto bene il tutto è indicizzato e ottimizzato ci sarà query che determinano che essi hanno per la scansione di ogni record.

Bene, cosa succede se uno dei tuoi clienti ti dice di ripristinare una versione precedente di propri dati a causa di alcune complicazioni processo di importazione o simili?Immaginate come i vostri clienti sentireste se lo hai detto tu "non si può fare, dal momento che i dati è condivisa tra tutti i nostri clienti" o "mi Dispiace, ma le modifiche sono state perse perché il cliente X chiesto un ripristino del database".

Come per il dolore di aggiornamento di 1000 server di database in una volta, alcuni abbastanza semplice automazione dovrebbe prendere cura di questo.Fintanto che ogni database mantiene un identico schema, quindi non sarà un problema.Abbiamo anche utilizzare il database per cliente approccio, e funziona bene per noi.

Ecco un articolo su questo argomento (sì, è MSDN, ma si tratta di una tecnologia indipendente articolo): http://msdn.microsoft.com/en-us/library/aa479086.aspx.

Un'altra discussione di multi-tenancy per quanto riguarda il modello di dati qui: http://www.ayende.com/Blog/archive/2008/08/07/Multi-Tenancy--The-Physical-Data-Model.aspx

Scalabilità.Di sicurezza.La nostra azienda si avvale di 1 DB per l'approccio del cliente pure.Inoltre, rende il codice un po ' più facile da mantenere.

Sto solo aggiungere che questa risposta di includere la parola "multi-tenant" qui.Ero alla ricerca di questo, l'utilizzo di "multi-tenant" come query, e questo non viene visualizzato.

Grazie per il vostro input -- tutti eccellenti e molto valido punti.Suppongo che sto guardando più al di aggiornamento flessibilità.Se è necessario modificare lo schema per aggiungere una nuova funzione, (diciamo per una applicazione web) o per migliorare le caratteristiche esistenti, è semplice da fare in un unico database.Se dovessi replicare questa modifica in 1000 database separati, la possibilità di errore aumenta.Cosa succede se un'operazione non riesce?Quanto tempo ci vuole per aggiornare tutti i client?

Se corretto i backup sono conservati (o se il database è stato strutturato in cui i dati non è mai stata effettivamente sostituita), il ripristino di dati per un particolare client è banale.

La semplicità del codice, pur importante, non è davvero molto complicato.A seconda della lingua utilizzata e le metodologie, è semplice per creare oggetti che rappresentano solo che il client specifico (per l'archiviazione di un particolare Client ID) e il resto del progetto, deve essere codificato per un singolo oggetto (un po ' come un singolo cliente).

La scalabilità è qualcosa da prendere in considerazione: - hai ragione che è facile prendere un singolo e isolato database e spostare su un altro server fisico;tuttavia, sta diventando sempre più facile per i server di cluster insieme - e anche senza il clustering, sembra che sarebbe una piccola modifica al punto che ogni client a un SERVER di database che ospita il database universale (così si potrebbe avere due o tre server di database hosting di un singolo database, per esempio).Questo approccio tiene il processo di aggiornamento limitata a soli tre database.

In settori regolamentati come l'assistenza sanitaria può essere un requisito di un database per ogni cliente, eventualmente anche un server di database separato.

La risposta più semplice per aggiornare più database quando si esegue l'aggiornamento è da fare l'aggiornamento come una transazione, e prendere una fotografia istantanea prima di aggiornare, se necessario.Se si esegue le operazioni beh, allora si dovrebbe essere in grado di applicare l'aggiornamento a qualsiasi numero di database.

Il Clustering non è davvero una soluzione al problema degli indici e delle scansioni complete di tabella.Se si sposta di un cluster, poco cambia.Se si hanno molti database di piccole dimensioni, da distribuire su più macchine si può fare questo in modo più economico senza un cluster.Affidabilità e disponibilità sono le considerazioni, ma possono essere trattate in altri modi (alcune persone hanno ancora bisogno di un cluster, ma la maggior parte probabilmente non).

Sarei interessato a sentire un po ' più di contesto, con questa operazione, perché il clustering non è un argomento semplice ed è costoso da implementare in RDBMS mondo.C'è un sacco di parlare/bravata sul clustering nel non-mondo relazionale Google Bigtable etc.ma si stanno risolvendo un diverso insieme di problemi, e la perdita di alcune caratteristiche utili da un RDBMS.

Ci sono un paio di significati di "database"

  • la scatola hardware
  • l'esecuzione di software (ad es."oracle")
  • la particolare set di file di dati
  • il particolare il login o schema

È probabile che Joel è uno dei livelli più bassi.In questo caso, è solo una questione di configurazione del software di gestione...non è una patch 1000 software server per la correzione di un bug di sicurezza, per esempio.

Penso che sia una buona idea, in modo che un bug software non perdita di informazioni attraverso i clienti.Immaginiamo il caso di un errante clausola where che mi ha mostrato i dati del cliente così come il mio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top