mongoDB中的平面或嵌套数据模型

时间:2013-05-06 06:19:32

标签: mongodb

让我以一种非常简单的方式提出我的问题。 这样:

{
    "name": {
        "first": "Joe",
        "last": "Coconut"
    }
}

或者这个:

{
    "first_name": "Joe",
    "last_name": "Coconut"
}

但是以一种非常基本的形式。如果我可以有5个嵌套对象而2个嵌套有更多列,该怎么办?!

- 原创 - 我理解mongoDB中的数据建模与应用程序的使用有关,但作为一般规则哪个模型更好?

{
    "company": "Amc",
    "clients": [
        {
            "name": "10Gen",
            "contact": "01002033",
            "contracts": {
                "id": 123,
                "price": 1200
            }
        },
        {
            "name": "Sun",
            "contact": "677689",
            "contracts": {
                "id": 23,
                "price": 34000
            }
        }
    ]
}

VS

{
    "company": "Amc",
    "10Gen": {
        "123": 1200,
        "contact": "01002033"
    },
    "Sun": {
        "23": 34000,
        "contact": "677689"
    }
}

由于应用层负责大多数操作不是第二种方法更合适吗?

更好地构建数据是否是嵌套数据的不良做法?说5个嵌套文档?

我错过了一个非常明显的事实吗?

2 个答案:

答案 0 :(得分:1)

仅供参考:

考虑一个非常大的文件。请考虑下面的示例(我已经为文档添加了少量密钥)。并考虑以下两个更新。

db.mytest.update({b_e : 1}, {$set : { b_e : 2}})
db.mytest.update({'b.e' : 1}, {$set : { 'b.e' : 2}})

在第二种情况下的MongoDB更新中,相对容易,因为不需要密钥迭代。第二次更新中的cpu活动相对较少。当文档包含大量密钥时,您将注意到此问题。在您的情况下,它无关紧要,因为文档非常小。

Mongo > db.mytest.find().pretty()
{
    "_id" : ObjectId("5188aae4eadc531d7386f524"),
    "a_b" : 1,
    "a_c" : 1,
    "b_c" : 1,
    "b_d" : 1,
    "b_e" : 1
}
{
    "_id" : ObjectId("5188ab14eadc531d7386f525"),
    "a" : {
        "b" : 1,
        "c" : 1
    },
    "b" : {
        "c" : 1,
        "d" : 1,
        "e" : 1
    }
}

答案 1 :(得分:0)

所以对于名字的情况,我更喜欢并推荐第一个带嵌套的表格。

除了第二个更复杂的例子,第一个版本与我更喜欢的数组。在那种情况下,几个查询是可能的,否则就不会。考虑查询“找到所有存在客户联系的文件”677689“。第一种形式很简单:

db.collection_name.find({“clients.contact”:“677689”})

如果这是一个热门查询,你甚至可以索引:

db.collection_name.ensureIndex({“clients.contact”:1})

(mongo shell脚本语法上面的代码;当然可以用任何语言做同样的事情,当然是正确的语法)