2009-02-28 9 views
5

Sto cercando di creare una tabella per le preferenze dell'utente e non riesco a capire il modo migliore per farlo. Il modo in cui ASP.NET lo fa per impostazione predefinita sembra estremamente complicato e vorrebbe evitarlo. Attualmente sto usando una riga per utente, dove ho una colonna diversa per ogni preferenza dell'utente (non normalizzata, lo so).Design della tabella di database "Preferenze utente"

Quindi, l'altra idea che mi era venuta in mente era di dividere le Preferenze stesse nella loro tabella, e poi avere una riga PER preferenza per utente in una tabella delle preferenze utente; tuttavia, questo significherebbe che ogni preferenza dovrebbe essere lo stesso identico tipo di dati, il che non sembra troppo attraente per me.

Quindi, la mia domanda è: qual è il modo migliore/più logico per progettare un database per contenere i valori delle preferenze dell'utente?

risposta

3

Alcune delle idee che cerco di evitare nel lavoro di database sono duplicazione dei dati e inutili complicazioni. Vuoi anche evitare "insert, update, and deletion anomalies". Detto questo, memorizzando le preferenze utente in una tabella con ogni riga = un utente e le colonne, le diverse preferenze disponibili sono sensate.

Ora se è possibile vedere queste preferenze utilizzate in qualsiasi altra forma o modo nel database, come più oggetti (non solo utenti) che utilizzano le stesse preferenze, allora si vorrà scendere il secondo percorso e fare riferimento al preferenze con coppie FK/PK.

Per quanto riguarda ciò che hai descritto, non vedo alcun motivo per cui il primo percorso non funzionerà.

2

solito faccio questo:

Users table (user_id, .... etc.) 
. 
Options table (option_id, data_type, ... etc.) 
(list of things that can be set by user) 
. 
Preferences table (user_id, option_id, setting) 

Io uso il nuovo tipo di dati SqlVariant per il campo di impostazione in modo che possa essere diversi tipi di dati e registrare il tipo di dati l'opzione come parte della definizione opzione nel Tabella delle opzioni per restituirlo al tipo giusto quando richiesto.

+0

Quindi, in questo caso, quale sarebbe data_type essere? Avresti un'altra tabella contenente tutti i tipi di dati, quindi questo è un FK? – NSX

+0

data_type potrebbe essere una stringa come "decimal (4,2)" o solo un numero definito con un'enumerazione nella tua app ... solo così la tua app può determinare come trasmettere il risultato in un tipo di dati comune. –

+0

Beh, non ha bisogno di essere una stringa. È possibile definire un set di tipi di dati validi e creare una tabella dei tipi. Questo sarebbe simile alla mia soluzione. – BobbyShaftoe

0

reale rapida, un metodo:

User(UserID, UserName, ...) 

PreferenceDataType(PreferenceDataTypeID, PreferenceDataTypeName) 

PreferenceDataValue(PreferenceDataValueID, PreferenceDataTypeID, IntValue, VarcharValue, BitValue, ...) 

Preference(PreferenceID, PreferenceDataTypeID, PreferenceName, ...) 

UserHasPreference(UserID, PreferenceID, PreferenceDataValueID) 
+0

@ GregD, grazie. :) – BobbyShaftoe

2

Se si memorizzano tutte le preferenze degli utenti in una singola riga di una tabella utente si avrà un incubo di manutenzione!

Utilizzare una riga per preferenza, per utente e memorizzare il valore di preferenza come varchar (lunghezza 255 dire, o un valore abbastanza grande per soddisfare i propri requisiti). Dovrai convertire i valori in/out di questa colonna ovviamente.

L'unica situazione in cui questo non funzionerà facilmente è se si desidera archiviare alcuni dati binari di grandi dimensioni come preferenza utente, ma non ho trovato che sia un requisito comune.

+0

Tuttavia, sembra che farlo con una riga per preferenza per utente comporterà un modello di tipo EAV, che ho sempre letto dovrebbe essere evitato a tutti i costi. – NSX

Problemi correlati