【问题标题】:"User Preferences" Database Table Design“用户偏好”数据库表设计
【发布时间】:2009-02-28 23:20:21
【问题描述】:

我希望为用户偏好创建一个表格,但我想不出最好的方法。默认情况下 ASP.NET 执行此操作的方式似乎非常尴尬,并且希望避免这种情况。目前,我为每个用户使用一行,每个用户偏好都有不同的列(我知道,未标准化)。

所以,我想出的另一个想法是将首选项本身拆分到自己的表中,然后在用户首选项表中为每个用户设置一行;但是,这意味着每个首选项都必须是完全相同的数据类型,这对我来说也不太吸引人。

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

【问题讨论】:

    标签: asp.net database sql-server-2005 database-design


    【解决方案1】:

    我在数据库工作中尽量避免的一些想法是数据重复和不必要的复杂化。您还想避免使用“insert, update, and deletion anomalies”。话虽如此,将用户偏好存储在一个表中,每行 = 一个用户和列,可用的不同偏好是有意义的。

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

    至于你所描述的,我看不出第一条路线行不通的原因。

    【讨论】:

      【解决方案2】:

      如果您将所有用户首选项存储在用户表的单行中,您将面临维护噩梦!

      每个首选项、每个用户使用一行,并将首选项值存储为 varchar(例如长度为 255,或者某个值足够大以满足您的要求)。显然,您必须将值转换进/出此列。

      很容易不起作用的唯一情况是,如果您想存储一些大型二进制数据作为用户偏好,但我发现这不是一个常见的要求。

      【讨论】:

      • 但是,听起来每个用户每个偏好使用一行会导致 EAV 类型模型,我一直认为应该不惜一切代价避免这种模型。
      【解决方案3】:

      我通常这样做:

      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 数据类型,因此它可以是不同的数据类型,并将选项的数据类型记录为选项表中选项定义的一部分,以便在查询时将其转换回正确的类型。

      【讨论】:

      • 那么,在这种情况下,data_type 是什么?您是否有另一个包含所有数据类型的表,所以这是一个 FK?
      • data_type 可以是类似 "decimal(4,2)" 的字符串,或者只是您在应用程序中使用枚举定义的数字......这样您的应用程序就可以确定如何将结果转换为一种常见的数据类型。
      • 嗯,它不需要是一个字符串。您可以定义一组有效的数据类型并创建一个类型表。这将类似于我的解决方案。
      • 有效数据类型表的问题是许多数据类型都有宽度和精度参数(十进制(4,2)或十进制(12,4)),所以你可能会得到很多微不足道的不同条目。
      • 如果你使用 sql_variant 类型(我对此一无所知),你可以像这样查询类型:SELECT *, SQL_VARIANT_PROPERTY(val,'BaseType') AS basetype, SQL_VARIANT_PROPERTY( val,'Precision') AS PRECISION, SQL_VARIANT_PROPERTY(val,'Scale') AS scale, SQL_VARIANT_PROPERTY(val,'BaseType') AS basetype, SQL_VARIANT_PROPERTY(val,'TotalBytes') AS totalbytes, SQL_VARIANT_PROPERTY(val,'Collat​​ion') AS 排序规则,SQL_VARIANT_PROPERTY(val,'MaxLength') AS maxlength
      【解决方案4】:

      真正快速,一种方法:

      User(UserID, UserName, ...)
      
      PreferenceDataType(PreferenceDataTypeID, PreferenceDataTypeName)
      
      PreferenceDataValue(PreferenceDataValueID, PreferenceDataTypeID, IntValue, VarcharValue, BitValue, ...)
      
      Preference(PreferenceID, PreferenceDataTypeID, PreferenceName, ...)
      
      UserHasPreference(UserID, PreferenceID, PreferenceDataValueID)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-17
        • 2014-02-08
        • 1970-01-01
        • 1970-01-01
        • 2011-10-02
        • 1970-01-01
        • 2013-02-18
        相关资源
        最近更新 更多