MongoDB,Grails和关系

knp*_*wrs 5 grails grails-orm relationship mongodb

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

Author有两个字段:String firstNameString lastName

Book有两个字段:String titleAuthor author

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

所以现在问题:

  1. 为了让GORM解决这个问题,是否需要单独的连接来检索每个文档?
  2. 如果是的话,在PostgreSQL或MySQL这样的关系数据库中这不会更好吗?
  3. 如果上述两个问题的答案确实是"是",那么有没有更好的方法来管理MongoDB等文档数据库中的关系?我意识到MongoDB不应该是关系型的,但有些事情我不知道如何在不重复数据的情况下绕过关系(从而制造更新噩梦).

编辑:我也注意到grails没有在我的作者的'id'属性上正确排序.这与使用MongoDB有关吗?在shell中我可以看到Grails生成的所有文档的_id属性都是数据类型NumberLong.

Gat*_* VP 3

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

那就别出汗了。MongoDB 不是反关系的,它是面向文档的。

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

在每本书只有一位作者 (N:1) 的情况下,书中包含对作者的“参考”是完全合理的。当然你必须做两个查询。但这与执行连接查询有很大不同吗?连接查询仍然需要进行两次索引查找和两次数据查找。所以你在这里并没有真正付出任何代价。

如果每本书支持多个作者 (M:N),那么您可以根据自己的需求有多种选择。

我不喜欢将 MongoDB 视为“非关系型”,我认为将 MongoDB 视为查询优化的更清晰。

我还注意到 grails 没有对我的作者的 'id' 属性进行正确排序......

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