存储非常精细的用户首选项

Tho*_*ody 5 database scalability preferences

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

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

我不是序列化的忠实粉丝,但我担心将每个首选项存储为单个行的可伸缩性.思考?

Kev*_*son 6

序列化数据blob是这里的方法,但不是出于性能原因 - 而是因为这是系统的一个方面,可能会看到大量的更改.您不希望仅仅因为您需要允许首选项在某些页面上打开高级模式而更改数据库架构.

HLGEM提到的实体 - 属性 - 价值模型从"易于发展"的角度来看这一点,但正如他所说,它的表现会非常差.

您放弃序列化对象的能力是直接查询数据库以查找匹配特定模式的用户(也许您正在追踪只有某些设置组合才会出现的错误,并且您希望查看是否有任何设置拥有该组合的用户).

  • "HLGEM提到的实体 - 属性 - 价值模型从"易于发展"的角度来看是合适的,但正如他所说,它的表现会非常差." 其实她这么说. (5认同)

HLG*_*GEM 5

无论您做什么,都要避免为此使用实体属性值结构(http://en.wikipedia.org/wiki/Entity-Attribute-Value_model),除非您想要一个性能非常差的系统。调用一个包含 50 列的表将比调用一个必须加入 50 次才能获得所需信息的表快得多。

我会根据您打算如何查询首选项(如果您想全部撤回登录,副拉那些登录时整个站点都需要,而当用户点击这些站点时,只需要专门区域的那些站点,因此它们的某种组合),并在其中设置了首选项类型的布尔列。这样,站点每个区域所需的所有首选项都将位于同一张表中,或者最多两到三张表中,这样可以相对容易地获取信息。这是设计对性能至关重要的地方(您将一直在查找首选项,因此即使毫秒也很重要),因此您确实应该在设计中首先考虑性能。