2009-02-28 17 views
5

Estoy buscando crear una tabla para las preferencias del usuario y no puedo encontrar la mejor manera de hacerlo. La forma en que ASP.NET lo hace de forma predeterminada parece extremadamente incómodo, y me gustaría evitarlo. Actualmente, estoy usando una fila por usuario, donde tengo una columna diferente para cada preferencia de usuario (no normalizada, lo sé)."Preferencias de usuario" Diseño de tabla de base de datos

Entonces, la otra idea que me surgió fue dividir las Preferencias en su propia tabla, y luego tener una fila PER preferencia PER usuario en una tabla de preferencias del usuario; sin embargo, esto significaría que cada preferencia debería ser exactamente del mismo tipo de datos, lo que tampoco me parece demasiado atractivo.

Entonces, mi pregunta es: ¿Cuál es la mejor/más lógica forma de diseñar una base de datos para mantener los valores de preferencia del usuario?

Respuesta

3

Algunas de las ideas que trato de evitar en el trabajo de la base de datos, es la duplicación de datos y la complicación innecesaria. También quiere evitar "insert, update, and deletion anomalies". Habiendo dicho eso, tiene sentido almacenar las preferencias del usuario en una tabla con cada fila = un usuario y las columnas, las diferentes preferencias que están disponibles.

Ahora, si puede ver que estas preferencias se usan de cualquier otra forma en su base de datos, como varios objetos (no solo usuarios) usando las mismas preferencias, entonces querrá ir por su segunda ruta y hacer referencia al preferencias con pares FK/PK.

En cuanto a lo que ha descrito, no veo ninguna razón por la cual la primera ruta no funcionará.

2

que suelo hacer esto:

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) 

uso el nuevo tipo de datos SQLVARIANT para el campo de ajuste por lo que puede haber diferentes tipos de datos y registrar el tipo de datos de la opción de compra dentro de la definición de opción en el Tabla de opciones para devolverlo al tipo correcto cuando se lo consulta.

+0

Entonces, en este caso, ¿qué sería data_type? ¿Tendrías otra tabla que contenga todos los tipos de datos así que esto es un FK? – NSX

+0

data_type podría ser una cadena como "decimal (4,2)" o simplemente un número que usted define con una enumeración en su aplicación ... solo para que su aplicación pueda determinar cómo convertir el resultado en un tipo de datos común. –

+0

Bueno, no necesita ser una cadena. Podría definir un conjunto de tipos de datos válidos y crear una tabla de tipos. Esto sería similar a mi solución. – BobbyShaftoe

0

Muy rápido, un método:

User(UserID, UserName, ...) 

PreferenceDataType(PreferenceDataTypeID, PreferenceDataTypeName) 

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

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

UserHasPreference(UserID, PreferenceID, PreferenceDataValueID) 
+0

@GregD, gracias. :) – BobbyShaftoe

2

Si almacena todas sus preferencias de usuario en una sola fila de una tabla de usuario que tendrá una pesadilla de mantenimiento!

Utilice una fila por preferencia, por usuario y almacene el valor de preferencia como varchar (longitud 255 por ejemplo, o algún valor lo suficientemente grande como para cumplir con sus requisitos). Tendrás que convertir valores dentro/fuera de esta columna obviamente.

La única situación en la que esto no funcionará fácilmente es si desea almacenar algunos datos binarios grandes como preferencia de usuario, pero no he encontrado que sea un requisito común.

+0

Sin embargo, parece que hacerlo con una fila por preferencia por usuario dará como resultado un modelo de tipo EAV, que siempre he leído y debe evitarse a toda costa. – NSX

Cuestiones relacionadas