3

我有一个包含数百万个对象的数据库(简单地说很多对象)。每天我都会向我的用户展示 3 个选定的对象,并且像 tinder 一样,他们可以向左滑动表示他们不喜欢或向右滑动表示他们喜欢它。

我根据它们的位置选择每个对象(首先选择更接近用户的对象)以及基于少数用户设置。

我在 mongoDB 下。

现在的问题是,如何以每天快速提供对象选择以向最终用户显示的方式实现数据库(并跳过他已经刷过的所有对象)。

4

1 回答 1

0

好吧,考虑到您已选择使用 MongoDB,您将不得不维护多个集合。一个是您的主要集合,您必须维护包含用户数据的用户特定集合,例如用户刷过的文档 ID。然后,当您想要获取数据时,您可能想要执行 setDifference 聚合。SetDifference 这样做:

接受两个集合并返回一个数组,其中包含仅存在于第一个集合中的元素;即执行第二组相对于第一组的相对补充。

现在,这将取决于您的集合的大小和整体规模。


编辑

我同意您的评论,即这不是一个可扩展的解决方案。

解决方案2:

我能想到的一种解决方案是使用基于图形的解决方案,例如 Neo4j。您可以将所有 1M 对象和所有用户对象表示为节点,并在用户和他刷过的对象之间建立关系。您的查询将返回用户未连接到的所有对象的列表。

您不能对图表进行分片,这会带来扩展挑战。基于图的解决方案要求整个图都在内存中。所以这个解决方案的可行性取决于你。

解决方案3:

使用 MySQL。有 2 个表,一个是对象表,另一个是 (uid-viewed_object) 映射。加入可以解决您的问题。加入工作的时间最长,直到你达到一个规模。所以我不认为这是一个糟糕的起点。

解决方案4:

使用布隆过滤器。您的问题最终归结为一组成员问题。给出一组 id,检查它是否属于另一组。布隆过滤器是一种回答集合成员资格的概率数据结构。它们超级小而且超级高效。但是,虽然是概率性的,假阴性永远不会发生,但假阳性可以。所以这是一个权衡。看看它是如何使用的:http: //blog.vawter.com/2016/03/17/Using-Bloomfilters-to-Avoid-Repetition/

如果我能想到别的东西,我会更新答案。

于 2017-07-04T13:21:14.827 回答