我目前正在 MongoDB 中开展一个项目,我想从数据库中随机抽取新产品的样本。但我的问题不是 MongoDB 特定的,我认为这是一个一般的数据库问题。
场景:
假设我们有一个产品集合(或表格)。我们还有一个用户集合(或表)。每次用户登录时,他们都会看到 10 个产品。这些产品是从集合/表中随机选择的。很简单,但要注意的是,每次用户登录时,都必须向他们展示 10 种他们以前从未见过的产品。我能想到的解决这个问题的两种明显方法是:
每个用户都从他们自己的所有产品的私人列表开始。每次他们获得其中一种产品时,该产品都会从他们的私人列表中删除。结果是下一次从这个先前修剪的列表中选择产品时,它已经只包含新项目。
每个用户都有一个以前查看过的产品的私人列表。当用户登录时,他们从主列表中随机选择 10 个产品,将每个产品的 id 与他们之前查看过的产品列表进行比较,如果该项目出现在之前查看过的列表中,应用程序会丢弃这个选择一个新的, 并迭代直到有 10 个新项目,然后将其添加到先前查看的列表中以供下次使用。
#1的问题是它似乎是一种巨大的浪费。您基本上会为 n 个用户复制列表数据。此外,向系统删除/添加新项目将是一场噩梦,因为它必须遍历所有用户。#2 似乎更可取,但它也有问题。为了保证 10 个新产品,您最终可能会对数据库进行大量额外和不必要的调用。随着用户使用的产品越来越多,可供选择的新产品越来越少,因此不得不扔掉一个并从数据库中获取新产品的机会大大增加。
有替代解决方案吗?我首先关心的是性能。我将放弃磁盘空间以优化性能。