`
风雪涟漪
  • 浏览: 506866 次
  • 性别: Icon_minigender_1
  • 来自: 大连->北京
博客专栏
952ab666-b589-3ca9-8be6-3772bb8d36d4
搜索引擎基础(Search...
浏览量:9003
Ae468720-c1b2-3218-bad0-65e2f3d5477e
SEO策略
浏览量:18380
社区版块
存档分类
最新评论

MongoDB Schema Design 数据库设计

阅读更多


介绍

使用MongoDB设计数据库,就不要按照关系型数据库的思维来做,如范式化数据。因为MongoDB不支持服务端的join查询。一般来说,在对于顶端的对象都要用单独的collection进行存储。

当然不需要望每个对象都要创建一个collection。可替代的策略是使用嵌入对象(embed object)。

例子,在下面的图,有两个collection。

分别是student和courses。

student document嵌入了address对象并和score document。并且有个引用到courses。

相比较关系模型,一般会把score单独存储到一张表中并且有个外键关联到student。

Embed vs. Reference(内嵌VS引用)

MongoDB模型设计关键问题在于是单独创建collection,还是作为内嵌对象?

在关系型数据库中,每个子元素都要单独创建一张表。 在MongoDB中,这并不推荐。

内嵌对象性能要更为高效。 数据分配在了硬盘上; 客户端和服务器通信的消耗基本不存在。

因此 "为什么我不需要内嵌对象?"

为什么引用非常慢?让我们考虑这个student的例子。如果我们有个student对象并执行

print( student.address.city );

这个操作用内嵌对象的话会非常快速并且如果student在RAM中,这个内嵌对象同样也在RAM中。

print( student.scores[0].for_course.name );

如果是第一次访问course。shell或者驱动必须执行下列查询。

// 伪代码!
student.scores[0].for_course = db.courses.findOne({_id:_course_id_to_find_});

每个引用遍历都对于数据库是一个查询。 这个collection在_id上有个索引。 

这个查询还是非常快的。然而, 即使所有的数据在RAM中,从应用服务器到数据库之间的通信也会有延迟。

一般来说,期望在RAM中1ms命中缓存。如果我们循环1000个student,查询每个student应用就会很慢了。

超过1分钟。 然而, 如果我们紧紧需要查询一个单独的元素,时间就是1ms 并且页面读取是完全可以接受的。

(注意如果在db缓存中, 返回1000student实际时间要小于1分钟)

下面是一些使用内嵌对象和引用的规则:

  • 上层的对象。一般都是独立的collection。
  • 对象详细的线性元素一般用于内嵌。
  • 如果对象和对象的关系是包含关系,应该用内嵌。
  • 多对多关系用引用。
  • Collection存入的对象较少比较适合做独立的collection。
  • 这样整个collection可以快速缓存应用服务器的内存中。
  • 内嵌对象更难关联它上层的对象。还不能使用DBRef用在内嵌对象上。
  • 要获取内嵌对象系统级别的视图更为困难。例子, 如果score不是内嵌,
  • 就更容易查询所有学生中中,100个高分数。
  • 如果内嵌对象很大(许多M), 你可能会遇到单个document容量的限制。
  • 如果性能是个问题,那么就用内嵌。

示例

让我们看看一些示例

  • Customer / Order / Order Line-Item
    • orders 应该是一个collection。 customers 是一个 collection.
    •  line-items 应该是order的一个内嵌数组对象。
  • Blogging system.
    • posts 应该是一个  collection. post author 可以是一个 独立的 collection, 
    • 或者如果仅仅是一个email地址,可以作为posts的字段。comments 应该是posts中的内嵌对象。

索引的选择

第二个比较重要的是索引的选择. 作为通用规则,如果在关系型数据库需要添加索引,那么MongoDB也一样。

  • _id 字段自动索引。
  • 查询的字段应该索引。
  • 排序字段需要索引。

 MongoDB profiling facility 提供了你应该添加索引的信息。

注意的是,添加索引会降低写入速度,对于读取频率高的collection可以创建多点的索引。

写频率较高的话,索引开销就很昂贵。


分享到:
评论

相关推荐

    The.Little.Mongo.DB.Schema.Design.Book151739402

    The Little MongoDB Schema Design Book, covers the fundamentals off Schema design with MongoDB, as well as several useful Schema design patters for your applications. I wrote this book to be a helpful...

    MongoDB应用设计模式:MongoDB Applied Design Patterns

    通过阅读《MongoDB应用设计模式:MongoDB Applied Design Patterns》,开发者可以深入了解MongoDB的设计原则、最佳实践以及在实际项目中的应用,从而更好地利用这一强大的数据库系统。书中的案例和经验分享将帮助...

    MongoDB数据库设计规范.docx

    "MongoDB 数据库设计规范" MongoDB 数据库设计规范是 MongoDB 数据库的设计和实现的重要指南。该规范旨在提供一个全面的 MongoDB 数据库设计指南,涵盖了 MongoDB 的核心优势、BSON 的优化、架构设计、适用场景、...

    mysql、redis和MongoDB三大数据库的优点和区别

    mysql、redis和MongoDB三大数据库的优点和区别

    MongoDB Applied Design Patterns

    MongoDB是一种流行的NoSQL数据库,它提供了一种灵活的数据模型,支持多种设计模式,非常适合处理大规模数据集,并能够应对高并发读写需求。这本书名为《MongoDB Applied Design Patterns》,由Rick Copeland撰写,...

    [奥莱理] MongoDB Applied Design Patterns

    《MongoDB Applied Design Patterns》是一本专为MongoDB设计模式应用而编写的经典教程,适合对数据库技术感兴趣的初学者及有经验的开发者。MongoDB是一款流行的NoSQL数据库系统,以其高性能、灵活性和易于扩展性而受...

    mongodb集群数据库设计方案v1.0

    mongodb集群数据库设计方案

    掌握MongoDB:NoSQL数据库基础与高级特性教程.rar

    什么是 MongoDB MongoDB 简介 MongoDB 特点 安装与配置 安装 MongoDB 启动与配置 MongoDB 基本操作 数据库和集合 文档操作 查询操作 基本查询 高级查询 索引与性能优化 创建索引 索引类型 索引优化 聚合操作 聚合...

    基于MongoDB实现云数据库服务的设计与实现

    MongoDB是NoSQL数据库的典型代表之一,它是一个面向文档的数据库,提供了高性能、高可用性和易扩展性。MongoDB支持丰富的查询语言,具有动态模式的特点,可以在文档中存储任意的数据类型,非常适合处理大规模的结构...

    mongodb和redis数据库文档

    MongoDB和Redis是两种非常流行的...通过这些文档,你将掌握如何安装配置数据库,如何进行数据操作,如何设计合适的数据库架构,以及如何优化性能等关键技能。这对于提升你的IT专业素养和解决实际问题的能力大有裨益。

    mongodb- NOSQL数据库

    MongoDB 的设计目标是提供高性能、高可用性和可扩展性,使其成为大数据处理和分布式应用程序的理想选择。 在NoSQL数据库中,MongoDB以其灵活性和强大的功能脱颖而出。与传统的SQL数据库不同,MongoDB不依赖于固定的...

    mongodb64芒果数据库

    6. 动态Schema:与传统关系型数据库不同,MongoDB允许文档有不同的Schema,灵活适应变化的数据模型。 7. 高性能:MongoDB采用内存映射技术,使得读写速度非常快。同时,其BSON(Binary JSON)数据格式比纯文本JSON...

    mongodb数据库管理工具

    MongoDB是一款流行且功能强大的NoSQL数据库系统,以其灵活性、高性能和易扩展性而闻名。在处理非结构化或半结构化数据时,MongoDB是一个非常理想的选择。然而,对于那些不太熟悉命令行操作或者想要更直观管理数据库...

    NOSQL数据库入门到实战: 结合实践案例,以任务为驱动,对Mongodb、Redis数据库技术进行梳理

    NOSQL数据库入门到实战: 结合实践案例,以任务为驱动,对Mongodb、Redis数据库技术进行梳理,让开发者快速掌握Mongodb和Redis数据库。Mongodb主要由文档(Document)、集合(Collection)、数据库(Database)三部分...

    MongoDB数据库介绍及安装

    MongoDB是一种分布式文档型数据库,它属于NoSQL数据库的一种,以JSON格式的文档作为数据存储方式,具有高性能、高可用性和可扩展性。MongoDB以其灵活性、易用性以及对大数据处理的良好支持,在现代Web应用和云计算...

    mongodb_架构设计基础schemadesign-cn

    从给定的文件信息中,我们可以提炼出关于MongoDB架构设计基础的重要知识点,涉及数据建模的历史、目的、以及在MongoDB中实现这些设计的具体方法。 ### 数据建模简史 数据建模的历史源远流长,从最早的ISAM...

    mongodb数据库设计

    ### MongoDB数据库设计与NoSQL概念解析 #### 一、引言 MongoDB作为一种流行的NoSQL数据库,因其灵活性、可扩展性和高性能等特点,在处理大规模数据存储和检索方面表现出色。本文将以一个假想的Web应用程序...

    mongoDB非关系型数据库安装以及使用指南

    MongoDB是一款流行且功能强大的非关系型数据库系统,它以其灵活的数据模型、高可用性和可扩展性而受到广泛赞誉。本教程将引导你完成MongoDB的安装过程,并介绍其基本使用方法,适合在线教育初学者。 一、MongoDB...

    MongoDB数据库

    MongoDB是一种流行的开源、分布式文档型数据库,以其灵活性、高性能和可扩展性而备受开发者青睐。作为NoSQL数据库的一种,MongoDB不采用传统...在实际应用中,合理的设计和优化策略对于充分利用MongoDB的优势至关重要。

Global site tag (gtag.js) - Google Analytics