为以下应用程序设计文档架构。
一种方法是,在MongoDB文档下设计主要,基于应用程序的数据访问模式的匹配(上图)。
> db.posts.find().pretty()
{
"_id": ObjectId("5099f5eabcf1bf2d90ea41ad"), // post 1
"author": "xyz",
"body" : "This is a test body",
"comments": [
{
"body": "this is a comment",
"email": "alan@tech.com",
"author": "Alan Donald"
},
{
"body": "this is another comment\r\n",
"email": "alan@tech.com",
"author": "Alan Donald"
}
],
"date" : ISODate("2012-11-07T05:47:22,9412"),
"permalink": "This_is_a_test_Post",
"tags":[
"cycling",
"mongodb",
"swimming"
],
"title": "This is a test post"
}
上面的模式允许应用程序数据访问模式,to,
1)收集博客主页的最新博客条目
2)收集所有信息以显示单个帖子
3)收集单个作者的所有评论
但不是,
按标签提供目录
另一种方法是,文档模式,关系方法倾向看起来像,
> db.posts.find().pretty()
{
"_id": "Post1", // use ObjectId BSON type
"title": "This is a test post",
"body": "This is a test body",
"date": ISODate("2012-11-07T05:47:22,9412")
}
> db.comments.find().pretty()
{
"_id": 3, // use ObjectId BSON type
"post_id": "Post1",
"author": "Alan Donald",
"author_email": "alan@tech.com",
"nth": 0
"body": "this is a comment"
},
{
"_id": 4, // use ObjectId BSON type
"post_id": "Post1",
"author": "Alan Donald",
"author_email": "alan@tech.com",
"nth": 1,
"body": "this is another comment\r\n"
},
> db.tags.find().pretty()
{
"_id": 5, // use ObjectId BSON type
"tag": "cycling"
"post_id": "Post1"
},
{
"_id": 6, // use ObjectId BSON type
"tag": "mongodb"
"post_id": "Post1"
},
{
"_id": 7, // use ObjectId BSON type
"tag": "swimming"
"post_id": "Post1"
}
比较
1)MongoDB本身并不支持集合之间的连接操作。因此,approach1看起来更好。因为approach2需要多个查询并加入那些多个查询的结果。
2)即使MongoDB缺少外键约束,在文档中嵌入(预连接)comments
的方法1看起来更好,这使得数据保持一致。
3)MongoDB不支持事务,但支持单文档级别的原子操作。所以,approach1看起来更好
发布和评论具有一对多关系。 许多会很大或很少。
问题:
使用approach1,db.posts
集合中的每个文档(帖子)都包含多个带有冗余数据的comments
。增强性能但容易出现修改异常。架构设计有更好的方法吗?
答案 0 :(得分:1)
在方法1中进行评论,您使用的是一个在MongoDB中有限制的数组。 https://docs.mongodb.com/manual/reference/limits
从汇总管道中的Mongodb 3.2
开始,您可以使用$lookup
进行加入。