2009-02-28 52 views
5

我正在为用户首选项创建一个表,并且无法找到最好的方法来完成它。 ASP.NET默认的方式看起来非常尴尬,并且希望避免这种情况。目前,我为每个用户使用一行,其中每个用户首​​选项都有不同的列(未规范化,我知道)。“用户首选项”数据库表设计

所以,我想到的另一个想法是将首选项自己分成自己的表,然后在用户首选项表中有一行PER首选PER用户;但是,这意味着每个首选项需要完全相同的数据类型,这对我来说听起来也不太吸引人。

所以,我的问题是:什么是最好/最合乎逻辑的方式来设计一个数据库来保存用户偏好值?

回答

3

我在数据库工作中试图避免的一些想法是数据重复和不必要的复杂性。你也想避免“insert, update, and deletion anomalies”。话虽如此,将用户偏好存储在一个表中,每行=一个用户和列,可用的不同偏好是有道理的。

现在,如果您可以看到这些偏好在数据库中以任何其他形式或方式使用,例如使用相同首选项的多个对象(而不仅仅是用户),那么您将希望沿着第二条路线走下去并引用FK/PK对的偏好。

至于你所描述的,我没有看到第一条路线不起作用的原因。

2

我经常这样做:

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) 

我使用新SQLVARIANT数据类型的设置字段,以便它可以是不同的数据类型和记录选项的数据类型的选项定义的一部分选项表查询时将其转换回正确的类型。

+0

因此,在这种情况下,data_type是什么?你会有另一个包含所有数据类型的表,所以这是一个FK? – NSX 2009-03-01 02:21:59

+0

data_type可以是像“decimal(4,2)”这样的字符串,也可以是您在应用程序中使用Enumeration定义的数字...只是让您的应用程序可以确定如何将结果转换为常用数据类型。 – 2009-03-01 02:44:32

+0

嗯,它不需要是一个字符串。您可以定义一组有效的数据类型并创建一个Type表。这将与我的解决方案类似。 – BobbyShaftoe 2009-03-01 03:08:42

0

真正的快,一个方法:

User(UserID, UserName, ...) 

PreferenceDataType(PreferenceDataTypeID, PreferenceDataTypeName) 

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

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

UserHasPreference(UserID, PreferenceID, PreferenceDataValueID) 
2

如果您存储在用户表的单个行中的所有用户的喜好,你将有一个维护的噩梦!

为每个用户使用一行,并将每个用户的首选项值存储为varchar(长度为255,或者某个值足够大以满足您的要求)。您将不得不明显地将值转入/转出该列。

唯一的情况是,这不会工作容易是如果你想存储一些大的二进制数据作为用户的偏好,但我没有发现这是一个共同的要求。