假设我们有一个对象的存储-- O (可以是SQL,NoSQL,不重要)--对象包含一些属性P_1到P_n。其中一些属性存储在存储S1中,有些存储在存储S2中,等等。通常,假设单个对象的完整定义只能通过调用某种类型的查找或跨多个存储连接来完成。您还可以认为,该对象是在不同的逻辑数据库之间垂直分区的,而且每个数据库都忽略了其他数据库。
现在,我们要定义一种过滤和排序这些对象的方法。但是,筛选和排序对象的函数依赖于跨多个数据库的属性。乍一看,这意味着如果我们要执行任何类型的排序或筛选,我们就必须提取整个数据库并加入调用方的属性,对于非平凡大小的数据库来说,这很快就会变得昂贵。
我们如何有效地实现这一目标?
我想到了一些选择:
在思考这个问题的同时,我也意识到这与Facebook如何为每个用户提供定制的新闻源类似。当每个新闻源项目的关联得分是特定于用户的时候,它如何有效地执行新闻源的排序?
发布于 2020-01-07 08:59:54
对于许多用例来说,有一个单独的预过滤列表并不是那么糟糕,我想FB确实在它的News Feed中使用了类似的东西。
例如,网上商店的产品推荐。你没有时间去做幻想人工智能,每次用户浏览或添加一个项目到一个篮子。但是,您可以预先列出彼此相似的项目列表,并使用这些列表的ids标记项目。
同样地,如果你有限制的搜索标准,“适合家庭度假的酒店”,你不会在每次有人键入家庭的描述中搜索,但你可以预先分类。
这种技术适用于任何昂贵的搜索操作,在这些操作中,您并不真正需要它100%地更新,或者它不是完全指定的行为。在我的两个例子中,你只是试图推动销售,而不是给人们一个准确的报告。
发布于 2020-01-07 09:40:57
如果您已经使用了一个异构的DB设置,那么您只有几个选项。
1.在应用程序中处理聚合:如果数据很小或者响应很小(例如,从2个源为单个登录用户派生一些数据),并且不必在应用程序的关键路径中进行多次连接,我就不介意这样做。然而,您的应用程序将膨胀,您更容易遇到更复杂的问题。
2.预处理或汇总数据:数据流管道尤其是出于这个原因。您可以在关键路径中不执行应用程序,但为要访问的关键路径准备数据。这可以像视图一样简单,也可以像另一个存储/缓存一样复杂,保存这些数据(正如您已经提到的)。这将导致职责分离,减轻应用程序代码,并且可以独立地扩展服务。
Facebook还根据用户的喜好、兴趣和类别为他们提供了预先汇总的数据。此外,只要有新的活动,他们就会有一个实时的粉丝来更新提要。一旦发布了一组新闻提要,事件可能会被触发,以刷新提要,并使其随时准备就绪,并可能实时传递它们。
https://softwareengineering.stackexchange.com/questions/403449
复制相似问题