2013-03-14 106 views
2

我正在为日志管理系统设计我的第一个MongoDB数据库模式,并且我想将日志文件中的信息存储到mongoDB,我无法决定我应该使用哪种模式文件(嵌入与参考)。MongoDB嵌入与大型数据文档的参考模式

注:项目有许多来源和来源(超过1个000 000日志在某些情况下),有许多日志

{  
     "_id" : ObjectId("5141e051e2f56cbb680b77f9"), 
     "name" : "projectName", 
     "source" : [{ 
      "name" : "sourceName", 
      "log" : [{ 
       "time" : ISODate("2012-07-20T13:15:37Z"), 
       "host" : "127.0.0.1", 
       "status" : 200.0, 
       "level" : "INFO", 
       "message" : "test" 
      }, { 
       "time" : ISODate("2012-07-20T13:15:37Z"), 
       "host" : "127.0.0.1", 
       "status" : 200.0, 
       "level" : "ERROR", 
       "message" : "test" 
      }] 
     }] 
    } 

我focuse是表现在从数据库(不写),例如读取数据过滤,搜索,分页等用户可以按日期,状态等过滤源日志(所以我想专注于读取性能,当用户搜索或过滤数据)

我知道,MongoDB有一个16M字节的文档大小限制,所以我担心如果我要为一个源提供1 000 000个日志,这将如何工作(因为我可以有一个项目的许多来源和来源可以有多个日志)。我应该使用嵌入式还是参考模式时,如何处理大型文档并希望具有良好的阅读性能,哪种解决方案更好?谢谢

回答

3

你的问题的答案既不是。除了嵌入或使用引用之外,您应该将架构展平为每个日志条目的一个文档,以便扩展超出16MB文档限制的范围,以便您可以访问MongoDB查询功能的全部功能和性能。

因此摆脱阵列领域,并使用类似的方法移动一切都交给顶级域:

{  
    "_id" : ObjectId("5141e051e2f56cbb680b77f9"), 
    "name" : "projectName", 
    "sourcename" : "sourceName", 
    "time" : ISODate("2012-07-20T13:15:37Z"), 
    "host" : "127.0.0.1", 
    "status" : 200.0, 
    "level" : "INFO", 
    "message" : "test" 
    }, { 
    "_id" : ObjectId("5141e051e2f56cbb680b77fa"), 
    "name" : "projectName", 
    "sourcename" : "sourceName", 
    "time" : ISODate("2012-07-20T13:15:37Z"), 
    "host" : "127.0.0.1", 
    "status" : 200.0, 
    "level" : "ERROR", 
    "message" : "test" 
} 
1

我认为,在一个阵列,具有日志可能会messy..If项目和源实体唐“T比名字以外的其他任何属性(键)和日志不会被长期保存,可以使用具有capped collection一个日志文件每:

{_id: ObjectId("5141e051e2f56cbb680b77f9"), p: "project_name", s: "source_name", "time" : ISODate("2012-07-20T13:15:37Z"), "host" : "127.0.0.1", "status" : 200.0, "level" : "INFO", "message" : "test"}

请参阅本以及:http://docs.mongodb.org/manual/use-cases/storing-log-data/

封顶收藏保持自然秩序。所以你不需要时间戳索引来按照自然顺序返回日志。就你而言,你可能想从特定的源/项目中检索所有日志。您可以创建索引{p:1,s:1}以加快此查询。

但我建议你做一些'基准测试'来检查性能。尝试上面的封顶收集方法。还可以尝试使用您建议的完全嵌入架构的文档分段。这种技术被用在经典的blog-comments问题中。因此,只有在单个文档中存储了每个源的很多日志,并且每当自定义大小超过时,就会溢出到新文档。