文档架构 - 性能与修改异常 - 权衡

时间:2017-08-20 05:13:47

标签: mongodb database-design database-schema normalization rdbms

  

为以下应用程序设计文档架构。

     

enter image description here

一种方法是,在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。增强性能但容易出现修改异常。架构设计有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

在方法1中进行评论,您使用的是一个在MongoDB中有限制的数组。 https://docs.mongodb.com/manual/reference/limits

从汇总管道中的Mongodb 3.2开始,您可以使用$lookup进行加入。