2010-12-27 14 views
7

Sono disponibili per l'utente circa 200 impostazioni, tra cui le impostazioni di avviso e le impostazioni di tracciamento dalle attività dell'utente sugli oggetti. Il problema è come archiviarlo nel DB? Ogni impostazione dovrebbe essere una riga o una colonna? Se la tabella successiva avrà una tabella di 200 colonne. Se fila allora circa 3 colonne ma 200 righe per utente x anche 10 milioni di utenti = non va bene.Memorizzazione delle impostazioni utente nella tabella: come?

Quindi in che altro modo posso memorizzare tutte queste impostazioni? NOTA: queste impostazioni sono un mix di immissione di testo e ricerche FK su altre tabelle.

Grazie.

+0

Se non c'è bisogno di cercare su qualche campo, è possibile serializzare e tutti memorizzarli in un campo di testo. Per me, la creazione di una colonna per campo è OK. Per migliorare la ricerca/selezione, si potrebbe dividere in più tabelle come profilo_utente, user_inteface_settings, utente _... (tabelle che possono essere utilizzati indepently). - Creazione di una tabella generica che contiene le impostazioni: una per riga come (uid, campo, valore) è utile se si hanno un sacco di campi opzionali e potrebbe portare a un tavolo 200 * 10 000 000 = 2 000 000 000 di righe. –

+1

Mdillion - solo per ricordartelo, dovresti 'accettare' la risposta che ti ha aiutato di più. –

+0

Il mio problema non è ancora risolto. Ci sono così tante impostazioni ed entrambi i modi menzionati qui non funzionano correttamente. Quindi sto esplorando alcune altre opzioni e una volta trovato qualcosa accetterò la risposta più vicina. – Mdillion

risposta

3

Le 200 impostazioni da tracciare suggeriscono uno schema di database flessibile. In quanto tale io suggerirei un approccio ibrido:

  1. Utenti: tavolo con la fila per utente per le proprietà che un utente sarà probabilmente sempre avere, come ad esempio il nome utente e la password. Questa tabella può anche tenere le chiavi esterne, ma questa è un'euristica e dipende anche se la relazione è da zero a zero o da zero a molti. Dove quest'ultimo richiede una tabella separata.
  2. Caratteristiche: due opzioni
    1. tavolo con riga per ogni funzione, in modo efficace una tabella hash, con UserID, nome e valore colonne. Questo potrebbe anche essere un punto per le relazioni estere, ma non sarebbe in grado di rafforzare l'integrità dei dati in questa configurazione.
    2. XML, ma solo con un database dotato di funzionalità che consentono di eseguire query sui dati o solo per dati che non è necessario eseguire una query, ma funzionano solo con il proprio server applicazioni.

Penso che la risposta più grande è che non si ha intenzione di arrivare ad una soluzione dalla tua domanda iniziale, ma invece necessario utilizzare sia per soddisfare i dati.

+0

qual è il leggere il tempo se la tabella dice 10 milioni di righe e ha bisogno di trovare 200 impostazioni per un utente per caricare la pagina delle impostazioni? L'utente vedrà l'istante della pagina o richiederà un minuto per cercare e caricare la pagina utente? – Mdillion

+0

Con gli indici giusti, il tempo di lettura dovrebbe essere buono. Ciò premesso, suggerirei di caricare le informazioni una volta al login come parte della sessione dell'utente invece di ripetere i viaggi del database ogni volta che un'autorizzazione deve essere verificata. – orangepips

2

Penso che 200 colonne non sia sicuramente una buona idea, a causa della difficoltà nella scrittura di stored proc, visualizzazione manuale dei dati o estensione a più impostazioni in seguito.

Puoi provare XML per tutte queste 200 impostazioni e quindi avrai solo 1 riga per utente. nome utente e impostazioni corrispondenti xml. Ma di nuovo limiterà le tue capacità di interrogazione, ma i DB ora supportano XML. È possibile verificare in modo specifico i DB XML.

+0

Puoi inserire FK in XML? – Mdillion

+0

Non sono sicuro di tutti i dettagli, ma può essere fatto. Leggi questo: http://www.stylusstudio.com/xsllist/200205/post70200.html http://msdn.microsoft.com/en-us/library/ms345117(v=sql.90).aspx –

4

La serializzazione dei dati si rivela quasi sempre una cattiva idea, perché in tal modo si blocca i dbms. Tutti gli anni che sono andati a produrre un dbms efficiente verranno sprecati in un secchio di bit serializzato.

Se avete la logica dell'applicazione collegato contro ogni impostazione, penso che si dovrebbe applicare come sia:

1 colonna per l'impostazione della tabella impostazioni. Ciò semplifica l'utilizzo della potenza dei dbms, con controllo dei vincoli, integrità referenziale, tipo di dati corretti per i valori, molte informazioni sull'ottimizzatore. Lo svantaggio è che le dimensioni delle righe crescono.

o

1 tabella per ogni impostazione (o gruppo di impostazioni correlate). Questo ha tutti i vantaggi di cui sopra, ma consente di visualizzare le righe per una penalizzazione delle prestazioni quando è necessario recuperare la maggior parte o tutte le impostazioni contemporaneamente.Quando le impostazioni sono opzionali, questa alternativa sarà significativamente più piccola se i dati effettivi sono sparsi.

Inoltre, un sacco di colonne è spesso un "odore", che suggerisce che non hai normalizzato correttamente i dati, ma non deve essere in questo modo. Solo tu conosci i tuoi dati.

+0

Il numero di colonne è dovuto a "livelli di privacy per attività dell'utente". Ogni attività dell'utente ha un livello di privacy definito dall'utente e un livello di privacy definito dal sistema predefinito. Per l'impostazione del sistema va bene, ma i setts dell'utente sfuggono di mano quando abbiamo 200 attività ciascuna con le proprie impostazioni. – Mdillion

Problemi correlati