我正在为用户首选项创建一个表,但无法找到最佳方法。 ASP.NET默认使用它的方式似乎非常尴尬,并且希望避免这种情况。目前,我每个用户使用一行,每个用户首选项都有一个不同的列(我知道没有规范化)。
因此,我提出的另一个想法是将首选项本身拆分为自己的表,然后在用户首选项表中具有行PER优先权PER用户;但是,这意味着每个首选项都需要是完全相同的数据类型,这对我来说也不太有吸引力。
所以,我的问题是:设计数据库以保存用户偏好值的最佳/最合理的方法是什么?
答案 0 :(得分:3)
我在数据库工作中试图避免的一些想法是数据重复和不必要的复杂化。您还想避免使用“insert, update, and deletion anomalies”。话虽如此,将用户首选项存储在一个表中,每行=一个用户和列,可用的不同首选项是有意义的。
现在,如果您可以看到这些首选项在数据库中以任何其他形式或方式使用,例如使用相同首选项的多个对象(不仅仅是用户),那么您将需要沿着第二条路线前进并引用首选项使用FK / PK对。
至于你所描述的内容,我认为没有理由说第一条路线不起作用。
答案 1 :(得分: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数据类型作为设置字段,因此它可以是不同的数据类型,并将选项的数据类型记录为选项表中选项定义的一部分,以便在查询时将其转换回正确的类型。
答案 2 :(得分:2)
如果您将所有用户首选项存储在User表的一行中,您将面临维护噩梦!
每个用户每个首选项使用一行,并将首选项值存储为varchar(长度为255,或者某个值足以满足您的要求)。您必须明显地在此列中输入/输出值。
唯一不能轻松的情况是,如果你想将一些大的二进制数据存储为用户首选项,但我还没有发现这是一个常见的要求。
答案 3 :(得分:0)
真快,一种方法:
User(UserID, UserName, ...)
PreferenceDataType(PreferenceDataTypeID, PreferenceDataTypeName)
PreferenceDataValue(PreferenceDataValueID, PreferenceDataTypeID, IntValue, VarcharValue, BitValue, ...)
Preference(PreferenceID, PreferenceDataTypeID, PreferenceName, ...)
UserHasPreference(UserID, PreferenceID, PreferenceDataValueID)