MongoDb数据库建模

时间:2013-04-01 08:13:07

标签: mongodb

我对1个对象的数据大小有疑问。我不知道我的数据模型是真的吗? 这是情况: 我有25台服务器,200台服务器计数器,以及1440分钟的数据。 我的目的是保存服务器计数器的日常数据。 但查询性能对我来说很重要。

我脑子里有3个模型,但我不知道哪个模型与我的项目更兼容。

1-服务器根目录:

我的数据模型:

{ "_id":Object(....), 
    "serverId":0
    "counters": [ 
                     { "counterId":0 , "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333} ,
                                                .
                                                .1440 times "counterId":0
                                                .
                     { "counterId":1 , "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333} ,        
                                               .
                                                .1440 times "counterId":1
                                                .
                    .
                    .  200 Counters
                    .
                     { "counterId":200 , "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333}         
                                               .
                                                .1440 times "counterId":200
                                                .
                       ] },
        .
        .
        .25 Server
        .
        .
{ "_id":Object(....), 
    "serverId":25
    "counters": [ 
                     { "counterId":0 , "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333} ,
                                                .
                                                .1440 times "counterId":0
                                                .
                     { "counterId":1 , "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333} ,        
                                               .
                                                .1440 times "counterId":1
                                                .
                    .
                    .  200 Counters
                    .
                     { "counterId":200 , "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333}         
                                               .
                                                .1440 times "counterId":200
                                                .
                       ] },

问题: ----对灌溉框架的表现 - : 当我试图在1天内找到计数器的平均值时,需要12秒 ---数据大小---- 当我尝试时,不可能像16 Mb那样建模。


2- Counter Root:

我的数据模型:

 { "_id":Object(....),
        "counterId":0  
        "servers": [ 
                         {  "serverId":0, "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333} ,
                                                    .
                                                    .1440 times "serverId":0
                                                    .
                         { "serverId":1 , "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333} ,        
                                                   .
                                                    .1440 times "serverId":1
                                                    .
                        .
                        .  25 Server
                        .
                         { "serverId":25 , "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333}         
                                                   .
                                                    .1440 times "serverId":200
                                                    .
                           ] },
            .
            .
            .200 Counter
            .
            .
    { "_id":Object(....),
        "counterId":200  
        "servers": [ 
                         {  "serverId":0, "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333} ,
                                                    .
                                                    .1440 times "serverId":0
                                                    .
                         { "serverId":1 , "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333} ,        
                                                   .
                                                    .1440 times "serverId":1
                                                    .
                        .
                        .  25 Server
                        .
                         { "serverId":25 , "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333}         
                                                   .
                                                    .1440 times "serverId":200
                                                    .
                           ] },

问题: ----对灌溉框架的表现 - : 当我试图在1天内找到计数器的平均值时,需要7秒 ---数据大小---- 当我尝试时,不可能像16 Mb那样进行建模。但是我将它分成2件作品。


3-没有根:

我的数据模型:

{ "_id" : ObjectId("515921e3bbea58d25eb07b22"), "serverId" : 0, "counterId" : 0, "inserted" : ISODate("2013-03-21T00:26:30Z"), "counterValue" : 0.03256159112788737, "min" : -29.967438408872113, "max" : 20.032561591127887 }
.
.7 billion data
.

问题: ----对灌溉框架的表现 - : 当我试图在1天内找到计数器的平均值时,需要7秒

SO: 我无法决定必须使用哪种数据模型,

谢谢..

1 个答案:

答案 0 :(得分:1)

不知道你为什么选择monogodb。 我会使用你的第三个选项,但缺乏索引。为serverid和counterid字段添加索引,你会得到更好的时间。

此外,您最终可能会有单独的读写集合,即

- 使用第三个选项中的一个集合 - 一次和每小时/每天/每周(很可能是一天)运行查询以获取聚合数据并将其放入另一个集合中,也使用索引,您将从no查询。 之后,如果您不再需要,您将删除已收集的数据。

以下是help page on indexesfaq

在你的情况下,它将是

 db.events.ensureIndex({counterId:1,serverId:2, datetime:3 })

您可以在索引中播放字段序列,因为它可能会导致不同的结果。

另外,如果你按照我说的那样每小时聚合一次,你最好将datetime作为第一个索引字段

 db.events.ensureIndex({datetime:1, counterId:2,serverId:3 })

注意:显然添加索引会提高从集合中读取数据的速度,但会减慢向其写入数据的速度。