2011-07-22 27 views
1

我期待在mongodb中创建一个简单的基于推荐的系统,其中用户可以使用代码来邀请其他用户。所有用户将成为相同代码/组的一部分。该组的用户也可以邀请其他人加入该组,或自己开始。在这种情况下,该用户成为两个组(两个不同的代码)的一部分。有关在mongodb中创建基于引用的系统的建议?

我想要跟踪的以下几件事:

1)对于给定的代码,有多少人你参考 2)码是用户的一部分(可以是许多代码的一部分/组)

最简单的集合包含所有的信息,我需要似乎是这样的:

串码 字符串用户引发 串UserReceived

所以在集合中的这三个字段中,我总是可以告诉用户发起了多少次代码(引用某人)。他们提到的人。其中编码/分组特定用户是其中的一部分。

这似乎是最简单的方法吗?

回答

2

我不太清楚你的建议模式会如何以有效的方式为你提供所需的信息。

我建议如下:

db.groups { 
    _id: <group code>, 
    creator: <UUID of creator>, 
} 

db.members { 
    _id: <UUID of group member>, 
    groupCode: <group code> 
    referrals: [ 
     <UUID of referred user> 
    ] 
    referralCount: <size of referrals array for speed/convenience> 
} 

CREATE GROUP : 
db.groups.save({_id: <group code>, creator:<UUID of creator>}) 
db.members.save({_id:<UUID of creator>, groupCode: <group code>}) 

REFER USER : 
db.members.update({_id: <UUID of referrer>}, {$push:{referrals: <UUID of referred user}, $inc:{referralCount:1}}) 

FOR A GIVEN CODE, HOW MANY PEOPLE DID YOU REFER : 
db.members.find({_id: <UUID of user>, groupCode: <group code>}) -> first result .referralCount 

WHICH CODES IS A USER PART OF : 
db.members.find({_id: <UUID of user>}) -> results .groupCode 

OR 

db.members.distinct("groupCode", {_id: <UUID of user>}) for a direct array of codes 

的原因我会分裂它,是因为维护组内的成员列表文档作为嵌入式阵列将复杂某些更新,可能会碰到16MB文档限制,并会大幅增加您的查询的带宽需求(请注意,在这种情况下,您必须为每个成员查询找到整个组文档)。

希望有所帮助。

+0

是的,当我想到设计效率不是我关心的。我试图想到我可以存储的最简单和最少量的数据,以便捕获我需要的所有信息。但是这是一个很好的信息,因为比我更有经验的设计mongodb集合的人可以提出一个更好的方法,记住效率。谢谢! – mike