像app

时间:2017-07-04 12:49:03

标签: mongodb database-design database-schema tinder database

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

我根据每个对象的位置选择每个对象(最先选择最接近用户的对象),也基于少数用户设置。

我在mongoDB下。

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

1 个答案:

答案 0 :(得分:0)

好吧,考虑到您已经选择使用MongoDB,您将不得不维护多个集合。一个是您的主要集合,您必须维护用户特定的集合来保存用户数据,比如用户刷过的文档ID。然后,当您想要获取数据时,您可能希望执行setDifference聚合。 SetDifference执行此操作:

  

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

现在效果如何取决于你的套装的大小和整体规模。

修改

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

解决方案2:

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

您无法对图表进行分片,这会带来缩放挑战。基于图形的解决方案要求整个图形在内存中。所以这个解决方案的可行性取决于你。

解决方案3:

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

解决方案4:

使用Bloom过滤器。您的问题最终归结为集​​合成员问题。给出一组id,检查它是否是另一组的一部分。 Bloom过滤器是一种概率数据结构,它可以回答集合成员资格。它们超小,超高效。但是,但是,它的概率,假阴性永远不会发生,但误报可以。这就是权衡。看看它的使用方法:http://blog.vawter.com/2016/03/17/Using-Bloomfilters-to-Avoid-Repetition/

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