首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >属性存储在分布式存储中的过滤/排序对象的系统设计

属性存储在分布式存储中的过滤/排序对象的系统设计
EN

Software Engineering用户
提问于 2020-01-07 08:18:09
回答 2查看 351关注 0票数 1

假设我们有一个对象的存储-- O (可以是SQL,NoSQL,不重要)--对象包含一些属性P_1P_n。其中一些属性存储在存储S1中,有些存储在存储S2中,等等。通常,假设单个对象的完整定义只能通过调用某种类型的查找或跨多个存储连接来完成。您还可以认为,该对象是在不同的逻辑数据库之间垂直分区的,而且每个数据库都忽略了其他数据库。

现在,我们要定义一种过滤和排序这些对象的方法。但是,筛选和排序对象的函数依赖于跨多个数据库的属性。乍一看,这意味着如果我们要执行任何类型的排序或筛选,我们就必须提取整个数据库并加入调用方的属性,对于非平凡大小的数据库来说,这很快就会变得昂贵。

我们如何有效地实现这一目标?

我想到了一些选择:

  1. 将用于筛选/排序的列存储在一个存储区中。换句话说,确保用于筛选/排序的属性结合在一起,以便我们可以在数据库服务器中执行筛选/排序。但这是不灵活的,因为当我们需要更改过滤/排序算法时,我们可能需要更改存储模式。诚然,在NoSQL数据库中不会太痛苦,但仍然是隐式模式的更改。
  2. 将任何筛选/排序算法限制在存在于一个数据库中的属性上。这实际上是1号的变体,但把不灵活的负担放在了呼叫方。
  3. 有一个专门用于存储过滤+排序的对象列表的存储。这感觉有点傻,而且空间效率很低,特别是如果过滤器/排序算法非常通用的话。

在思考这个问题的同时,我也意识到这与Facebook如何为每个用户提供定制的新闻源类似。当每个新闻源项目的关联得分是特定于用户的时候,它如何有效地执行新闻源的排序?

EN

回答 2

Software Engineering用户

发布于 2020-01-07 08:59:54

对于许多用例来说,有一个单独的预过滤列表并不是那么糟糕,我想FB确实在它的News Feed中使用了类似的东西。

例如,网上商店的产品推荐。你没有时间去做幻想人工智能,每次用户浏览或添加一个项目到一个篮子。但是,您可以预先列出彼此相似的项目列表,并使用这些列表的ids标记项目。

同样地,如果你有限制的搜索标准,“适合家庭度假的酒店”,你不会在每次有人键入家庭的描述中搜索,但你可以预先分类。

这种技术适用于任何昂贵的搜索操作,在这些操作中,您并不真正需要它100%地更新,或者它不是完全指定的行为。在我的两个例子中,你只是试图推动销售,而不是给人们一个准确的报告。

票数 2
EN

Software Engineering用户

发布于 2020-01-07 09:40:57

如果您已经使用了一个异构的DB设置,那么您只有几个选项。

1.在应用程序中处理聚合:如果数据很小或者响应很小(例如,从2个源为单个登录用户派生一些数据),并且不必在应用程序的关键路径中进行多次连接,我就不介意这样做。然而,您的应用程序将膨胀,您更容易遇到更复杂的问题。

2.预处理或汇总数据:数据流管道尤其是出于这个原因。您可以在关键路径中不执行应用程序,但为要访问的关键路径准备数据。这可以像视图一样简单,也可以像另一个存储/缓存一样复杂,保存这些数据(正如您已经提到的)。这将导致职责分离,减轻应用程序代码,并且可以独立地扩展服务。

Facebook还根据用户的喜好、兴趣和类别为他们提供了预先汇总的数据。此外,只要有新的活动,他们就会有一个实时的粉丝来更新提要。一旦发布了一组新闻提要,事件可能会被触发,以刷新提要,并使其随时准备就绪,并可能实时传递它们。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/403449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档