10

我来自一个MySQL背景,并试图绕过我的头MongoDB。特别是,我正在努力概念化我应该如何n:n以“Mongo 方式”为关系建模。

对于这个例子,假设我们有两个collections:usersinterests. 我们需要能够表示或查询数据中的几件事:

  • 用户兴趣
  • 用户的兴趣等级,例如“喜欢”或“不喜欢”
  • 具有特定兴趣的用户
  • 每个利息评级的计数器(可以增加/减少)
  • 兴趣名称

MySQL中,我会创建一个users_interests索引用户 ID兴趣 ID 的表。对于柜台,我会为每种评级类型设置单独的列,并且每次用户对兴趣进行评级/未评级时,都会进行交易以确保计数永远不会错误。

我试过阅读一些架构设计,但无济于事。

你能帮助一个迷失的灵魂找到路吗?

4

2 回答 2

14

好问题。让我首先概述一下 N:N 关系的工作原理,然后我将详细介绍您的每个要点。

在 MySQL 中,N:N 通常你有你的数据透视表关联你的用户和兴趣(user_interests 表)。在 mongo 中,你这样做有点不同。您仍然有一个用户和兴趣集合,但是现在,您在用户的兴趣下存储了一个键列表。所以是这样的:

User Collection {
      "name":"Josh",
      "user":"jsmith",
      "interests":[
           {
            "_id":12345,
            "rating":"like"
           },
           {..}..
      ]
}

通过将您的兴趣存储在兴趣表上的一个列表中,您可以执行您需要的每个操作。如果您想进行查询,您可以根据兴趣表中的 ID 进行查询,然后使用$in 修饰符进行查询。

现在,为了您的兴趣收藏,我将执行以下操作:

User Interest {
      "_id":objectId
      "label":"Swimming",
      "count":intValue
}

向用户文档添加兴趣时,计数变量将取决于您的评分定义。如果您将评级存储在单独的区域(或逻辑中),那么您分配给它们的值将是您与感兴趣的 int 值相关的值。IE:用户给它打分(它的值为 1)然后你会在计数值上加 1。

希望这是有帮助的,并且至少带来了一些关于如何构建它的其他想法!

祝你好运,记住 MONGO 很棒。

于 2011-11-30T18:28:13.617 回答
1

要维护每个兴趣的评分的全局计数,您将需要一个单独且独立的集合,当用户执行兴趣的喜欢/不喜欢操作时,您将使用原子更新运算符更新(添加或减去)评分。

您可以将每个用户的兴趣存储为用户集合本身中的子文档数组。

此数据的 JSON 结构类似于:

db.User
{
    name: 'joe',
    ....,
    interests : [{ name: 'swimming', rating: 10},
              { name: 'cooking', rating: 22 }
              ]
}

现在您可以使用以下方法查询内部键:

> db.User.find( { "interests.name" : "cooking" } )

这将返回有特别兴趣的用户。

于 2011-11-30T18:26:59.480 回答