MongoDB,Grails和关系

时间:2011-03-05 21:31:39

标签: grails mongodb gorm relationship

我很好奇Grails的MongoDB插件如何处理关系。为了测试这个,我用两个域类创建了一个非常简单的应用程序:

Author有两个字段:String firstNameString lastName

Book有两个字段:String titleAuthor author

在设置了MongoDB和Grails后,我制作了一些AuthorBook s并使用MongoDB交互式shell进行了查看。我发现关系的处理方式与在关系数据库中处理的方式相同:对其他对象的id字段的引用。

现在问题是:

  1. 为了让GORM解决此问题,是否需要单独的连接来检索每个文档?
  2. 如果是,在诸如PostgreSQL或MySQL之类的关系数据库中这不会更好吗?
  3. 如果对上述两个问题的回答确实是“是”,那么有没有更好的方法来管理MongoDB等文档数据库中的关系?我意识到MongoDB不应该是关系型的,但有些事情我不知道如何在不重复数据的情况下解决关系(从而使更新成为噩梦)。
  4. 编辑:我还注意到grails没有在我的作者的'id'属性上正确排序。这与使用MongoDB有关吗?在shell中,我可以看到Grails生成的所有文档的_id属性都是数据类型NumberLong

2 个答案:

答案 0 :(得分:3)

  

我意识到MongoDB不应该是关系型的,但有些事情我不知道如何在不重复数据的情况下绕过关系

然后不要出汗。 MongoDB不是反关系的,它是面向文档的。

在这种情况下,书籍和作者是两个顶级对象。嵌套其中任何一个都是不合理的,它们本身就是核心实体。

如果每本书只有一个作者(N:1),那么本书包含作者的“参考”是完全合理的。当然你必须做两个查询。但这与进行连接查询有很大不同吗?连接查询仍然需要进行两次索引查找和两次数据查找。所以你在这里没有任何成本。

如果每本书都支持多位作者(M:N),那么您可以根据自己的需要several options

我不认为MongoDB是“not relational”,我认为将MongoDB视为查询优化更为清晰。

  

我也注意到grails没有在我的作者的'id'属性上正确排序......

我会直接与Grails作者联系。听起来他们可能正在存储“字符串”而不是实际的ObjectIds(或MongoID)。虽然不重要,但这可能是一个错误。

答案 1 :(得分:1)

关于id属性,文档现在显示您可以在域类中声明ObjectId idString id,以便不使用使用迭代long的默认GORM实现。只需在您的课程中声明该字段,插件就可以完成剩下的工作。