MongoDB对象之间的关系

Posted

技术标签:

【中文标题】MongoDB对象之间的关系【英文标题】:Mongo DB relations between objects 【发布时间】:2011-03-08 21:03:48 【问题描述】:

我正在尝试使用 mongo db 实现博客文章存储。

我有两个域实体:

“博文”和“作者”

目前我已将 AuthorId 属性添加到博客文章实体。这是存储对象之间关系的正确方法吗?

【问题讨论】:

【参考方案1】:

我认为这篇文章适合你http://www.mongodb.org/display/DOCS/Schema+Design

用例

客户/订单/订单行项目

订单应该是一个集合。客户收藏。 line-items 应该是嵌入在 order 对象中的 line-items 数组。

博客系统。

帖子应该是一个集合。帖子作者可能是一个单独的集合,或者只是帖子中的一个字段,如果只是一个电子邮件地址。 cmets 应嵌入在帖子中以提高性能。

架构设计基础

Kyle Banker,10 代

http://www.10gen.com/presentation/mongosf2011/schemabasics

索引和查询优化 Alvin Richards,企业工程高级总监

http://www.10gen.com/presentation/mongosf-2011/mongodb-indexing-query-optimization

**这两个视频是 mongoddb 上见过的最好的 imho*

【讨论】:

感谢视频链接!从关系型数据库过渡到 noSQL 真的很有帮助。【参考方案2】:

目前我已将 AuthorId 属性添加到博客文章实体。这是存储对象之间关系的正确方法吗?

我会说不。您“应该”以 非规范化 方式将所需的所有内容存储在博客文档中(例如博客文章、cmets、标签等)。所以如果你想显示作者的名字,你应该把它添加到博客文档中。这将允许通过单个查询获取整个页面的数据,这有点像面向文档的数据库。

【讨论】:

重命名用户成为一个非常昂贵的电话! @Blankman:是的。尽管如此,我认为面向文档的数据库的理念是在一个查询中获取整个文档。顺便问一下,[重命名用户]/[显示博文]的比例是多少?我认为它非常低。 帕斯卡,是的,在这种情况下它很低,但是说你必须显示用户的当前点。你必须再次调用它,因为它可能会很快变得陈旧。 @Blankman,的确如此,就像用户的声誉点经常变化,但陈旧通常是可以接受的。 TTT 陈旧是可以接受的,但不是积分!假设您正在阅读 John Skeet 发表的 1 个月大的帖子,他的分数将大大降低。积分必须接近实时,可能是 1 小时过时(如果这是你的意思,我同意的话)。

以上是关于MongoDB对象之间的关系的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data MongoDB:如何实现“实体关系”?

MongoDB入门

1116mongodb

MongoDB基础

mongodb的简介

MongoDB查询