MongoDB设计问题-双向参考
我是MongoDB的新手,如果这些问题很简单,我很抱歉 我正在开发一个应用程序,它将跟踪特定的用户交互,并将有关用户和交互的信息放入MongoDB。有几种类型的交互都会从用户那里收集不同的信息 我的第一个问题是:所有这些交互应该在同一个集合中,还是应该按类型将它们分开(就像在RDBMS中那样) 此外,我希望能够查找:MongoDB设计问题-双向参考,mongodb,database,nosql,Mongodb,Database,Nosql,我是MongoDB的新手,如果这些问题很简单,我很抱歉 我正在开发一个应用程序,它将跟踪特定的用户交互,并将有关用户和交互的信息放入MongoDB。有几种类型的交互都会从用户那里收集不同的信息 我的第一个问题是:所有这些交互应该在同一个集合中,还是应该按类型将它们分开(就像在RDBMS中那样) 此外,我希望能够查找: 特定用户进行的所有交互 进行特定交互的所有用户 我在考虑为用户在文档中执行的每个交互添加一个交互文档的手动引用,并为每个交互文档中执行交互的用户添加一个手动引用 我的第二个问题是:
user\u id
,听起来就足够了
因此,当您想要获取所有用户交互时,只需通过交互集合user\u id
进行查询
如果您想以另一种方式查询适合您的查询区域的所有交互,请拉出那些user\u id
s,然后对用户集合执行$in
子句
我的第一个问题是:所有这些交互应该在同一个集合中,还是应该按类型将它们分开(就像在RDBMS中那样)
我会说,在不太了解数据大小、写入量、读取量、查询需求等的情况下;是的,集所有功能于一身
我也不确定在RDBMS中是否会将它们分离出来
“手动参考的“加倍”有意义吗?还是有更好的方法?”
不,我觉得数据库设计不合理
在交互集合文档上放置一个user\u id
,听起来就足够了
因此,当您想要获取所有用户交互时,只需通过交互集合user\u id
进行查询
如果您想以另一种方式查询适合您的查询区域的所有交互,请拉出那些user\u id
s,然后对用户集合执行$in
子句
我的第一个问题是:所有这些交互应该在同一个集合中,还是应该按类型将它们分开(就像在RDBMS中那样)
与关系数据库相比,文档存储的最大优势就是您可以做到这一点。将所有不同的交互放在一个集合中,不要害怕给它们不同的字段集
此外,我希望能够查找:
特定用户进行的所有交互
我在考虑为用户在文档中执行的每个交互添加一个交互文档的手动引用,并为每个交互文档中执行交互的用户添加一个手动引用
请注意,让文档无限增长通常不是一个好主意。MongoDB对文档大小有一个上限(默认为16MB)。MongoDB不擅长处理大型文档,因为文档完全加载到ram缓存中。当您有许多大型对象时,缓存中容纳的对象不多。此外,当文档增长时,有时需要将它们移动到另一个硬盘位置,这会减慢更新速度(这也会造成问题,但无论如何,您不应该依赖于此)
进行特定交互的所有用户
您是指特定的交互实例(假设多个用户可以是一个交互的一部分)还是指已经执行特定交互类型的所有用户
在后一种情况下,我将向用户文档添加一个已执行交互类型的数组,因为否则您将不得不执行类似联接的操作,这将需要MapReduce或一些应用程序端逻辑
第一种情况与Sammaye的建议相反,我建议不要使用用户集合的_id字段,而是使用用户名。当您使用user.username上带有唯一标志的索引时,它与按用户搜索一样快。\u id和唯一性得到保证
原因是,当您搜索特定用户的交互时,很可能您知道用户名而不是id。当您只有用户名并且您通过id引用用户时,您首先必须搜索users集合以获取用户名的_id,这是一个附加的数据库查询
当然,这是假设您手头并不总是有用户id。当您这样做时,您当然可以使用_id作为参考
我的第一个问题是:所有这些交互应该在同一个集合中,还是应该按类型将它们分开(就像在RDBMS中那样)
与关系数据库相比,文档存储的最大优势就是您可以做到这一点。将所有不同的交互放在一个集合中,不要害怕给它们不同的字段集
此外,我希望能够查找:
特定用户的所有交互