文档DB中的多对多

时间:2014-05-14 22:21:51

标签: mongodb document-database

我刚刚开始MongoDB(晚会,我知道......)

在考虑文档设计时,我仍然试图让10多年的关系DBing失去理智。

假设我有很多用户使用了很多应用。任何用户都可以使用多个应用,任何数量的用户都可以使用任何应用。

在登录程序中,我想访问用户使用的所有应用程序。在另一个程序中,我想获得特定应用程序的所有用户。

我应该有重复的数据吗?也许在App文档中有一组用户和用户文档中的一系列应用程序?这有意义吗?这是文档DB中的传统方法吗?

2 个答案:

答案 0 :(得分:2)

好问题!

你有很多场景。 在Mongo中,您可以通过多种方式解决此问题: 使用SQL中的查找表或具有数组。 您应该考虑的是索引,与SQL中的索引相同,但这次您有更多选项。 由于它有很多种情况,我可能会使用查找表。 这是获取用户的应用和应用的用户的最有效方式。 数组不适合动态值,特别是如果您需要两个数组字段(app / user),而app.users数组字段将经常更改。 缺点是你可以“加入”并且必须从两个表中“选择”数据并自己“加入”,但这不应该是一个问题,特别是因为你总是可以缓存结果(应用程序中的本地缓存) )如果要为用户字段添加索引,Mongo将以超快的速度返回结果

{
_id: "<appID>_<userID>" ,
user: "<userID>"
}

默认情况下_id索引。应该为“user”字段创建另一个索引,然后Mongo将btree加载到内存中,你们都很好。

答案 1 :(得分:1)

根据您的情况,您不需要重复数据。由于它是多对多的关系,并且数据会不断变化,因此您需要使用文档引用而不是文档嵌入。

所以你将有两个系列:

应用集合:

{
     _id : appId,
    app_name : "appname",
    // other property of app
    users : [userid1, userid2]

}

用户集合:

{
      _id : userId,
      // other details of user
     apps: [appid1, appid2, ..]

}

正如您所提到的,您需要在app collection&amp ;;用户集合中的应用程序数组。

当您在客户端中获取数据时,首先在用户登录时,您将从用户文档中获取应用程序ID数组。

然后,再次使用应用ID,您需要在应用集合中查询应用详情。

当我们使用参考时,这次往返肯定会在那里。但是你可以通过缓存细节来提高性能。通过适当的索引。

这在mongodb中是常规的,用于多对多的关系