通常情况下,我有一个简单的应用程序,允许用户上传照片并关注其他人。因此,每个用户都将拥有类似于“墙”或“活动源”的东西,他或她可以查看来自朋友(他或她关注的人)上传的最新照片。
大多数功能很容易实现。然而,当涉及到历史活动源时,由于性能原因,事情很容易变得混乱。
我在这里遇到了以下困境: 我可以轻松地将活动源设计为数据库中的规范化部分,这将节省我的写入周期,但在为每个用户选择这些结果时,复杂度会极大增加(针对在一定时间段内上传的每张照片,选择一定数量的上传者,我正在关注 / 针对每个我关注的人,选择他的照片)
一种优化选项是引入一系列阈值约束条件,例如基于其最后上传日期对我关注的人进行排序,甚至排除某些人以节省周期,并且对于每个用户,仅选择最近上传的5张照片。
第二种方法是引入完全非规范化的活动源模式,其中每行代表一个关注者的通知。这意味着每次我上传照片时,DB都会将n行放入此“下拉桶”中,n表示我关注的人数,即需要大量写入周期。但如果我有这样的表,可以很容易地应用一些优化技术,例如巧妙的索引以及修剪比一定时间段早的条目(队列)。
然而,第三种方法是一种更少规范化的模式,其中服务器端应用程序将从数据库中卸下一些复杂性。我看到一些社交应用程序(如friendfeed)严重依赖于在DB中存储序列化对象,例如JSON对象。
我肯定还没有完全掌握可扩展的DB设计技巧,因此我相信还有很多东西我错过了或需要学习。如果有人能给我指点迷津,我将不胜感激。
大多数功能很容易实现。然而,当涉及到历史活动源时,由于性能原因,事情很容易变得混乱。
我在这里遇到了以下困境: 我可以轻松地将活动源设计为数据库中的规范化部分,这将节省我的写入周期,但在为每个用户选择这些结果时,复杂度会极大增加(针对在一定时间段内上传的每张照片,选择一定数量的上传者,我正在关注 / 针对每个我关注的人,选择他的照片)
一种优化选项是引入一系列阈值约束条件,例如基于其最后上传日期对我关注的人进行排序,甚至排除某些人以节省周期,并且对于每个用户,仅选择最近上传的5张照片。
第二种方法是引入完全非规范化的活动源模式,其中每行代表一个关注者的通知。这意味着每次我上传照片时,DB都会将n行放入此“下拉桶”中,n表示我关注的人数,即需要大量写入周期。但如果我有这样的表,可以很容易地应用一些优化技术,例如巧妙的索引以及修剪比一定时间段早的条目(队列)。
然而,第三种方法是一种更少规范化的模式,其中服务器端应用程序将从数据库中卸下一些复杂性。我看到一些社交应用程序(如friendfeed)严重依赖于在DB中存储序列化对象,例如JSON对象。
我肯定还没有完全掌握可扩展的DB设计技巧,因此我相信还有很多东西我错过了或需要学习。如果有人能给我指点迷津,我将不胜感激。