我在这里看到了一些关于存储用户偏好的问题,但它们似乎主要指的是一组相当少的偏好。我目前正在开发一个高度可定制的网络应用程序,它需要存储大量的首选项,而我正在努力解决如何存储它们。
我将要存储的首选项包括用于显示特定工具提示的布尔值,页面上各种内容面板的排列,登录后要显示的页面,特定表单字段的默认值等。总而言之,我希望每个用户都会有50多种此类偏好,数据主要是布尔值和整数。
我不是序列化的忠实粉丝,但我担心将每个首选项存储为单个行的可伸缩性。想法?
答案 0 :(得分:5)
序列化数据blob是这里的方法,但不是出于性能原因 - 而是因为这是系统的一个方面,可能会看到大量的更改。您不希望仅仅因为您需要允许首选项在某个页面上打开高级模式而更改数据库架构。
HLGEM提到的实体 - 属性 - 价值模型从“易于进化”的角度来看这一点,但正如他所说的那样,它的表现会非常糟糕。
您对序列化对象的放弃是能够直接查询数据库以查找匹配特定模式的用户(也许您正在追踪只有某些设置组合才会出现的错误,并且您希望查看是否你有任何有这种组合的用户。)
答案 1 :(得分:3)
除非你想要一个表现非常糟糕的系统,否则你应该避免使用entity-attrivute-value结构(http://en.wikipedia.org/wiki/Entity-Attribute-Value_model)。调用一个包含50列的表将比调用一个表要快得多,您必须加入50次才能获得所需的所有信息。
我会针对每个常规首选项组(登录首选项,整体网站首选项,特定页面或函数首选项)创建一个相关表格,其基础是您打算如何查询首选项(如果您希望全部重新登录当用户点击那些时,需要整个站点所需的那些以及那些只需要用于特定区域的那些,所以它们的一些组合)并且具有用于在其中设置的首选项类型的布尔列。这样,您对网站每个区域所需的所有首选项将位于同一个表中,或最多两个或三个表,这样可以相对轻松地获取信息。这是设计对性能至关重要的一个地方(您将一直查找首选项,因此即使毫秒数也是如此),因此您应该首先在设计中考虑性能。这里比任何希望使这看起来像面向对象或为开发人员设置更少的工作更重要。
答案 2 :(得分:0)
我不知道我是否会将用户首选项等信息存储在数据库中。您似乎希望在用户登录后立即查看许多(如果不是全部)用户首选项;如果你最终做了一堆数据库查询,你的系统最终会很慢。相反,我建议将所有用户的设置保存在单个文件中(或某个地方的单个记录),并在用户登录后立即将其吞并批发并缓存。
答案 3 :(得分:0)
假设用户数据已经存储在数据库中,那么我没有看到将它们全部存储在一行中的任何实际问题,特别是如果您可能需要根据数据进行查询,即。选择所有具有偏好A或B等的用户。
但是,我会将它加载到一个类中,并通过某种缓存机制来持久保存该类。答案 4 :(得分:0)
如果您不需要搜索首选项,则可以始终将首选项存储为XML并将其保存到“首选项”列。应该在以后添加新的首选项更容易一些;)
答案 5 :(得分:0)
您可以做的另一个选择(如果您不需要存储在数据库中的项目,例如检查数据的内容(谁做什么等)),您可以将所有设置放在cookie和存储中它在他们的机器上。
当然,使用cookies会出现使用cookie的所有注意事项。但只是另一个想法...
答案 6 :(得分:0)
用户更喜欢某些偏好(所有动物都相等但有些比其他动物更平等)。这些应该专门针对登录界面上的检索和应用进行优化。随着优先级的下降,它们可以使用任何标准进行聚合,并可以作为数组保存为单独的列(例如,字体首选项列包括字体类型,大小和颜色,并引用字体表)。还使用数据库工具索引使用频繁的列并重新设计以拆分聚合列,以便您可以识别聚合中哪个元素需求量很大。
总而言之,用户偏好往往是非常静态的(即习惯),不要将用户数据与偏好混淆得多。