【问题标题】:Modeling many-to-many :through with Mongoid/MongoDB多对多建模:通过 Mongoid/MongoDB
【发布时间】:2011-03-06 06:20:16
【问题描述】:

我对 Mongoid/MongoDB 比较陌生,我有一个关于如何为特定的多对多关系建模的问题。

我有一个User 模型和一个Project 模型。用户可以属于多个项目,每个项目成员包括一个角色(例如“管理员”、“编辑”或“查看者”)。如果我使用的是 ActiveRecord,那么我会使用has_many :throughUserProject 之间建立多对多关联,然后我会在连接表中放置一个角色字段。

在 MongoDB 中对此场景进行建模的好方法是什么?如何使用 Mongoid 声明该模型?下面的示例似乎是对此进行建模的好方法,但我不知道如何优雅地声明 User 和嵌入的 ProjectMembership 与 Mongoid 之间的关系关联。

提前致谢!

db.projects.insert(
  { 
    "name" : "Test project",
    "memberships" : [
      {
        "user_id" : ObjectId("4d730fcfcedc351d67000002"),
        "role" : "administrator"
      },
      {
        "role" : "editor",
        "user_id" : ObjectId("4d731fe3cedc351fa7000002")
      }
    ]
  }
)

db.projects.ensureIndex({"memberships.user_id": 1})

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 mongodb mongoid


    【解决方案1】:

    建模一个好的 Mongodb 模式实际上取决于您如何访问您的数据。在您描述的情况下,您将索引您的 members.user_id 键,这似乎没问题。但是您的文档大小会随着您添加查看者、编辑者和管理员而增加。此外,您的架构将难以进行如下查询:

    查询项目,其中user_id xxx为编辑器:

    同样,您可能不需要像这样查询项目,因此您的架构看起来不错。但如果您需要通过 user_id AND 角色查询您的项目,我建议您创建一个“project_membership”集合:

    db.project_memberships.insert(
      { 
        "project_id" : ObjectId("4d730fcfcedc351d67000032"),
        "editors" : [
          ObjectId("4d730fcfcedc351d67000002"),
          ObjectId("4d730fcfcedc351d67000004")
        ],
        "viewers" : [
          ObjectId("4d730fcfcedc351d67000002"),
          ObjectId("4d730fcfcedc351d67000004"),
          ObjectId("4d730fcfcedc351d67000001"),
          ObjectId("4d730fcfcedc351d67000005")
        ],
        "administrator" : [
          ObjectId("4d730fcfcedc351d67000011"),
          ObjectId("4d730fcfcedc351d67000012")
        ]
      }
    )
    
    db.project_memberships.ensureIndex({"editors": 1})
    db.project_memberships.ensureIndex({"viewers": 1})
    db.project_memberships.ensureIndex({"administrator": 1})
    

    或者更简单...在您的项目架构上添加索引:

    db.projects.ensureIndex({"memberships.role": 1})
    

    【讨论】:

      猜你喜欢
      • 2013-08-12
      • 2017-01-02
      • 2016-04-25
      • 2016-12-20
      • 2021-04-09
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多