2012-11-21 50 views
1

我目前正在MongoDB中的一个项目中从数据库中随机抽取新产品。但我的问题不是MongoDB的具体问题,我认为这是一个通用的数据库问题。如何保留每个用户使用的数据列表

该场景:

比方说,我们有一个产品集合(或表)。我们也有一个用户集合(或表)。每次用户登录时,都会显示10个产品。这些产品从收集/表中随机选择。足够简单,但问题在于,每次用户登录时,都必须提供10种他们从未见过的产品。我能想到的解决这个问题的两个明显的方法是:

  1. 每个用户开始的所有产品自己的私人列表。每次他们获得这些产品中的一种时,产品都会从其私人列表中删除。结果是,下次从先前修剪的列表中选择产品时,它只包含新项目。

  2. 每个用户都有一个以前看过的产品的私人列表。当用户登录时,他们从主列表中选择10个随机产品,将每个产品的ID与以前查看的产品列表进行比较,如果该项目出现在先前查看的列表中,应用程序会抛出该项目,选择一个新项目,并迭代,直到有10个新项目,然后将它添加到以前查看的列表下次。

#1的问题似乎是一个巨大的浪费。你基本上会复制n个用户的列表数据。同时删除/添加新项目到系统将是一场噩梦,因为它必须迭代所有用户。 #2似乎更可取,但它也有问题。为了保证10个新产品,您最终可能会向数据库进行额外的多余呼叫。随着用户越来越多地选择产品,新产品的选择越来越少,因此不得不从数据库中拿走新产品的机会大大增加。

是否有替代解决方案?我首要关心的是性能。我会放弃磁盘空间以优化性能。

+0

选项1看起来很糟糕(特别是如果您打算定期从通用列表中添加和删除产品),我会选择选项2.对于选项2,您可以简单地询问* *不是*的产品用户的列表并从该组中随机选择。 – NullUserException

+0

是的,我完全同意Null。我只列出了我能想到的唯一选项。我真的不喜欢这两种解决方案...... –

+0

我唯一的选择2是,随着时间的推移,你将拥有一个用户,他们将拥有以前看过的产品的巨大列表,这可能是一个问题。 – NullUserException

回答

0

这2种方式是完全浪费主存储器和辅助存储器。 你想展示2个从未见过的产品,但这是一个真正的必须? 如果你有很多产品,10个随机产品有很高的独特性。

3。你可以列出10级随机的产品,即使不那么容易,因为在MySQL,比1和2

0

如果你不介意的id的顺序是怎样随机你能做到这一点还不太复杂:

创建一个只包含产品ID和随机整数代理键列的随机表。在第一次登录时,在列表中随机选择一个客户,然后循环访问由该关键字定购的列表。如果你到达最后,从头开始重新开始。

客户记录将包含他们看到的最后一个产品(来自随机列表的代理,而不是实际ID)的单个值。然后,您将在登录后拉动下一个十次,并为客户做一次更新。当然,这不会是随机的。但是这种桌上种子策略是很多更简单的伪随机数发生器的工作原理。

我看到的唯一问题是,如果您的产品列表增长得比您的用户登录速度更快,那么他们永远无法看到列表中出现在他们开始之前的部分。即使如此,有大量产品和非常活跃的用户,这应该比存储他们看到的任何东西都要好得多。因此,如果产品以一套伪随机序列出现并不重要,这可能非常适合您。

编辑:

如果存储他们开始以及第一条记录,你仍然可以产生的看到所有事情的清单。这将是价值和最后观看之间的一切。

0

如何做到这一点:创建一个集合prodUser你将只有产品的id和customersID的列表(谁看过这些产品)。

{ 
    prodID : 1, 
    userID : [] 
} 

当你一个客户登录发现尚未分配给该用户

db.prodUser.find({ 
    userID : { 
    $nin : [yourUser] 
    } 
}) 

(出于某种原因,$不是没有:-(工作10 PRODID。我没有时间)在向他展示他的产品之后 - 你可以更新他的prodUser集合,为了减轻mongos无法找到随机元素 - 你可以随机插入元素并找到前10个元素。

一切都应该很快。

相关问题