Database 存储非常精细的用户偏好

Database 存储非常精细的用户偏好,database,scalability,preferences,Database,Scalability,Preferences,我在这里看到了一些关于存储用户首选项的问题,但它们似乎主要指的是一组相当小的首选项。我目前正在开发一个高度可定制的web应用程序,它需要存储大量的首选项,我正在努力解决如何存储这些首选项的问题 我将存储的首选项包括用于显示特定工具提示的布尔值、页面上各种内容面板的排列、登录后显示的页面、特定表单字段的默认值等。总之,我预计每个用户都会有50多个此类首选项,数据主要是布尔数和整数 我不太喜欢序列化,但我关心的是将每个首选项存储为单个行的可伸缩性。想法?无论您做什么,都要避免为此()使用实体属性值结

我在这里看到了一些关于存储用户首选项的问题,但它们似乎主要指的是一组相当小的首选项。我目前正在开发一个高度可定制的web应用程序,它需要存储大量的首选项,我正在努力解决如何存储这些首选项的问题

我将存储的首选项包括用于显示特定工具提示的布尔值、页面上各种内容面板的排列、登录后显示的页面、特定表单字段的默认值等。总之,我预计每个用户都会有50多个此类首选项,数据主要是布尔数和整数


我不太喜欢序列化,但我关心的是将每个首选项存储为单个行的可伸缩性。想法?

无论您做什么,都要避免为此()使用实体属性值结构,除非您想要一个性能非常差的系统。对一个包含50列的表的调用要比对一个表的调用快得多,而一个表需要连接50次才能获得所需的所有信息


我会根据您想要查询偏好的方式,为每个一般偏好组(登录偏好、总体网站偏好、特定页面或功能偏好)创建一个相关表(如果你想在登录时全部收回,那么就在登录时收回整个站点所需的,以及在用户点击特定区域时仅收回特定区域所需的,因此需要将它们结合起来)并在其中设置首选项类型的布尔列。这样,站点每个区域所需的所有首选项都将位于同一个表中,或最多两个或三个表中,从而相对容易地获取信息。这是一个设计对性能至关重要的地方(您将一直查找首选项,因此即使是毫秒数)所以,你真的应该在设计中首先考虑性能。在这里,要想使它看起来是面向对象的,或者在开发过程中为开发人员创造更少的工作,就显得非常重要。

< P>我不知道我是否甚至会将像用户偏好这样的信息存储在数据库中。(如果不是全部)用户登录后立即选择用户首选项;如果您最终执行了一系列数据库查询,则您的系统将非常慢。相反,我建议将用户的所有设置保留在单个文件(或某个地方的单个记录)中,并将其全部吞下,并在用户登录后立即缓存。

假定用户数据已存储在数据库中,则我看不出将所有数据存储在一行中有任何实际问题,尤其是如果您可能需要根据数据进行查询,即选择首选项为a或B的所有用户等


不过,我会将其加载到一个类中,并通过某种缓存机制持久化该类。

如果您不需要搜索首选项,您可以始终将首选项存储为XML,并将其保存到“首选项”列。这将使将来添加新首选项变得更容易;)

您可以做的另一个选择(如果您不需要将项目存储在数据库中,例如检查数据(谁做什么等)),您可以将其所有设置放在cookie中并存储在机器上


当然,使用cookie的所有注意事项都伴随着cookie。但还有一个想法…

序列化一块数据是一种方法,但不是出于性能原因,而是因为这是系统的一个方面,可能会看到大量的更改。你不想因为现在需要更改数据库模式d允许首选项在某个页面或某物上打开高级模式


HLGEM提到的实体属性值模型从“易于发展”的角度来看符合这一点,但正如她所说,它的性能非常差


对于序列化对象,您将放弃直接查询db以查找与特定模式匹配的用户的功能(可能您正在跟踪一个只在某些设置组合下才会出现的错误,并且您希望查看是否有任何具有该组合的用户).

用户更喜欢某些偏好(所有动物都是平等的,但有些动物比其他动物更平等)。应特别针对登录时界面上的检索和应用程序进行优化。随着首选项深度的降低,可使用任何标准对其进行聚合,并保存为单独的列,可能为数组(例如,字体首选项列包括字体类型、大小和颜色,并参考字体表)。还可以使用db工具对大量使用的列进行索引,并重新设计以拆分聚合列,以便您可以确定聚合中的哪个元素需求量很大


总而言之,用户偏好往往是非常静态的(即,像一种习惯),不要混淆用户数据,因为用户数据与偏好之间的易变性更高。

“HLGEM提到的实体属性值模型从“易于演变”的角度来看符合这一点,但正如他所说的那样,它的性能非常差。”事实上,她是这么说的。“…跟踪仅在某些设置组合下才会出现的错误…”-感谢您提供的示例,但我只想指出,这可能不是一个非常依赖性能的情况。