`
songgz
  • 浏览: 40862 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Mongo架构设计

阅读更多
原文:http://www.mongodb.org/display/DOCS/Schema+Design
架构设计
  • 介绍
  • 比较嵌入和引用
  • 用例
  • 选择索引
  • 多少集合?


介绍

相对于设计一个关系型架构,使用Mongo不需做“规范化”,因为没有服务器边的“joins”。一般来说,希望每一个顶级对像对应一个数据库集合。
不必每个类一个集合,代之以嵌入对像。例如,在下面的图中,有两个集合,students和courses。

Student文档嵌入address文档和其中有courses引用的score文档。
对比关系型架构,几乎总是放置scores到一个单独表,并且此表有一个外键关联到students表。

比较嵌入和引用

在Mongo 架构设计里的关键问题是“这个对像是否值得作为一个集合,更确切地说,它应该嵌入到其它集合吗?”在关系型数据库中,每一个重要的子项通常作为一个单独的表(除非出于性能考虑)。在Mongo中,这是不推荐使用的--嵌入对像是更有效率的。然后同位数据在磁盘上,客户机--服务器周转到数据库被淘汰。因此,通常的疑问是,“为什么不想嵌入这个对像?”
为什么引用是慢的?考虑students的例子。如果有一个student对像,并执行:
print( student.address.city );
这个操作将无疑是快的,因为address是一个嵌入对像并且一直在内存中,如果student在内存中。然而,对于:
print( student.scores[0].for_course.name );
如果这是首次访问scores[0],shell或你的驱动必须执行查询
/ /伪代码的驱动程序或框架,而不是用户代码
student.scores[0].for_course = db.courses.findOne({_id:_course_id_to_find_});
因此,每个引用遍历一次数据库的查询。通常的考虑是在这个集合上建一个_id索引。如此,该查询将是很快的。然而,即使全部数据都在内存中,也存在隐式的从应用服务器到数据库服务器的数据通信。在一般情况下,期望一个在内存缓存中的查询时间为1毫秒。因此,如果我们遍历1000名学生,通过引用查找每个学生将非常缓慢 - 执行时间超过1秒,即使从缓存中。然而,如果我们只需要查找单个项目,时间为1ms的秩序,为网页完全加载可以接受的。(注意,如果已经在数据库缓存中,取出1000名学生可能实际花销远低于1秒,因为结果集从数据库成批返回。)

关于何时嵌入和何时引用的一般规则:
  • 处于顶级的“首类”对像一般有自己的集合。
  • 用于明细的条目对像一般使用嵌入。
  • 对像跟对像建模为“包含”关系通常将被嵌入。
  • 多对多关系通常使用引用。
  • 只有少数集合可能单独固定存在,因为整个集合很快被缓存到应用服务器内存。
  • 在集合里,与“顶级”对像相比嵌入对像是无法引用,因为不能有一个DBRef对于一个嵌入对像(至少没有)。
  • 在系统层次展现嵌入对象是困难的。
  • 例如,如果Scores不是嵌入的,查询全部students的前100个scores。
  • 如果嵌入大量数据(许多兆字节),就会达到单个对像的大小限制。
  • 如果考虑性能则嵌入。


用例

现在考虑几个用例。
Customer / Order / Order Line-Item
Orders将是一个集合。Customers也是一个集合。Line-items 将是一个line-items数组被嵌入到order对像。
博客系统。
Posts将是一个集合。在Post里作者可以是一个单独的集合或是一个简单的字段,如同只是一个email地址。为了性能,在post内comments对像将是嵌入的。

选择索引

架构设计的第二个方面是选择索引。一般来说,在关系数据库中怎么选,在Mongo中同样怎么选。
  • _id字段自动被索引。
  • 用于关键字查找的字段应设为索引。
  • 通常排序字段应设为索引。

MongoDB压测器(profiler)提供详细的信息,给出已添加的那个索引是错误的。
注意,加入索引会使写入集合变慢,但是读除外。大多数索引用于读写比率高的集合(假设不介意耗费存储空间)。对使用索引的集合做写操作比做读操的开销要多。

多少集合?

Mongo集合是多态的,它可以放入任何对像!对像数据库采取这种方式。因为性能的原因,我们不推荐这种方式。在Mongo集合中,数据趋向顺序的存储在磁盘上。因此,集合的表扫描是会发生的效率问题。集合的高吞吐批处理是非常重要的。
分享到:
评论

相关推荐

    构建BaaS云数据(CloudData)服务—mongo集群架构设计

    作者:赵静,多年互联网领域从业经验,现服务于Maxleap基础服务及架构组,主要负责云数据(CloudData)架构设计及研发,关注分布式计算、云存储。

    《毕业设计&代码复用》--基于Vue+Nodejs+MongoDB校园二手信息发布平台设计毕业源码案例设计.zip

    本人十余年JAVA架构设计经验,擅长JAVA高可用、分布式、高并发系统架构设计。有志于做JAVA系统性的技术提升的同学可与我联系,交个朋友哦~ 本人十余年JAVA架构设计经验,擅长JAVA高可用、分布式、高并发系统架构...

    bugu-mongo

    3. 微服务架构:在微服务架构中,每个服务可能需要自己的数据存储,Bugu-Mongo的轻量级和易于集成特性使得它成为理想的选择。 四、最佳实践 1. 数据模型设计:充分利用MongoDB的灵活性,设计适合业务需求的数据模型...

    mongo-3.6.3-aarch64.tar.gz

    MongoDB 3.6.3是该数据库系统的一个稳定版本,专为aarch64(ARM架构64位)平台设计,这使得它能够在基于ARM处理器的Linux系统上运行,如树莓派等嵌入式设备或某些服务器平台。 MongoDB的核心特性包括文档型数据模型...

    mongoDB mongoVUE

    MongoVUE则是一款专为MongoDB设计的图形化管理工具,它提供了直观的用户界面,使得数据库的管理和操作变得更加便捷。 MongoVUE的主要功能包括: 1. **连接管理**:MongoVUE允许用户轻松地创建、保存和管理多个...

    30分钟学MongoDB系列——Mongo分布式架构篇(简介)

    总结来说,MongoDB的分布式架构设计使其成为处理大数据的利器,尤其是对于需要快速访问和分析非结构化数据的应用场景。通过理解MongoDB的这些分布式特性和能力,开发者可以更好地构建高性能、可扩展的应用程序。

    php_mongo-1.6.0-5.3-ts-vc9-x86

    标题 "php_mongo-1.6.0-5.3-ts-vc9-x86" 指的是一个特定版本的 PHP MongoDB 扩展,这个扩展是为 PHP 5.3 版本设计的,特别适用于线程安全(TS)且使用 Visual C++ 9 编译器编译的 32 位(x86)系统。在 PHP 开发中,...

    mongo-shake-v2.2.1.tar.gz

    MongoDB是一种流行的开源、分布式文档数据库,被设计为高性能、高可用性和可扩展性。"mongo-shake"是针对MongoDB的数据迁移工具,主要用于在不同的MongoDB实例或集群之间进行数据同步。在这个场景中,我们关注的是...

    IoT系统中的MongoDB架构设计.pptx

    MongoDB 在 IoT(物联网)系统中的架构设计是一个关键的议题,因为它涉及到如何有效地存储、管理和分析海量的设备数据。MongoDB 作为一种分布式文档数据库,其灵活性和可扩展性使其成为处理 IoT 数据的理想选择。 ...

    mongo-指南第2版高清完整版

    在架构方面,它采用了分布式设计,支持横向扩展,能够处理大规模的数据存储和高并发访问。 接着,你将学习如何安装和配置MongoDB,包括在各种操作系统上安装、启动和停止数据库服务。此外,还会讲解数据的导入导出...

    SpingMVC+MongoDB+Redis 初步架构设计

    在构建一个基于SpringMVC、MongoDB和Redis的初步架构设计时,我们需要深入了解这三大技术以及它们如何协同工作。SpringMVC是Spring框架的一部分,主要用于处理Web应用的模型-视图-控制器(MVC)结构。MongoDB是一个...

    mongodb数据库帮助文档

    - **数据存储**(Storing Data):介绍了MongoDB如何高效地存储数据,以及如何设计数据结构来满足特定的应用需求。 - **索引创建与删除**(Creating and Deleting Indexes):讲解了如何利用索引来提高查询效率,并...

    mongo三本书 视觉中国ppt.实践中文.学习手册

    在“mongo三本书 视觉中国ppt.实践中文.学习手册”这个资源包中,包含了三本关于MongoDB的重要学习资料,分别是《MongoDB实践中文》、《视觉中国的MongoDB应用实践》以及《mongodb学习手册》。这些资料将帮助我们...

    MongoVUE 1.5.3

    MongoVUE 1.5.3 是一个专为MongoDB数据库设计的图形用户界面(GUI)工具,旨在简化数据库的管理和操作。MongoDB是一种流行的开源、文档型的NoSQL数据库系统,广泛应用于大数据处理和现代应用程序开发。MongoVUE ...

    开源项目-mongodb-mongo-go-driver.zip

    2. **驱动的架构** MongoDB Go驱动器采用模块化设计,包括连接管理、命令执行、数据序列化与反序列化等组件。这使得驱动具有高度可扩展性和灵活性,可以根据应用需求进行定制。 3. **连接管理** 驱动提供了连接池...

    基于Go语言的mongo-go-driver驱动程序设计源码分析

    该项目深入分析了基于Go语言的mongo-go-driver驱动程序的源码设计,涵盖总计2995个文件,其中包括1152个Go源文件、764个JSON配置文件、727个YAML配置文件,以及其他多种语言和格式的文件,如Shell脚本、C语言代码、...

Global site tag (gtag.js) - Google Analytics