一文教你MongoDB设计方法及技巧,看不懂还不来学?

MongoDB表的设计 1、Collection Sharding是否靠谱 Sharding key的一些烦恼; 单一key可能导致分布不均匀;使用符合Sharding KEY复合sharding key也不是万能的; Count计算性不准确;Balancer不够智能,时间不确定;禁用Auto-Sharding功能不可靠(尤其是2.X版本);线上禁用Auto-Sharding开启库级Sharding;固 阅读详情

#前言

MongoDB是一种流行的数据库,可以在不受任何表格schema模式的约束下工作。数据以类似JSON的格式存储,并且可以包含不同类型的数据结构。例如,在同一集合collection 中,我们可以拥有以下两个文档document:

{
    id: '4',
    name: 'Mark',
    age: '21',
    addresses : [
        { street: '123 Church St', city: 'Miami', cc: 'USA' },
        { street: '123 Mary Av', city: 'Los Angeles', cc: 'USA' }
    ]
}

{
    id: '15',
    name: 'Robin',
    department: 'New Business',
    example: 'robin@example.com'
}

为了能够充分利用MongoDB的优势,您必须了解并遵循一些基本的数据库设计原则。在讲解设计方法之前,我们必须首先了解MongoDB存储数据的结构。

一、 数据如何存储在MongoDB中

与传统的RDBMS关系型数据库不同,MongoDB并没有表Table,行row和列column的概念。它将数据存储在集合collections,文档documents和字段fields中。下图说明了与RDBMS类比的结构之间的关系:

二、数据库设计技巧和窍门

2.1.规范化存储与非规范化存储

因为MongoDB使用文档来存储数据,所以理解“规范化存储“”和“非规范化存储”的概念非常重要。

规范化存储:-规范化意味着将数据存储到多个集合collections中,并在它们之间设计关联关系。数据保存之后,更新数据比较容易。但是在读取数据的时候,规范化存储的缺点就显现出来。如果要从多个集合collections查找数据,则必须执行多个查询,从而使读取数据的速度变慢。 (比如:将网页标题、作者、内容分别存储到不同的collections中)

非规范化存储:-这种方式将若干对象数据,以嵌套的方式存储到单个文档中。它在读取数据的时候表现更好,但在写入时会变慢。这种存储数据的方式还将占用更多空间。 (比如:将网页标题、作者、内容分别存储到同一个collection中)

所以在两种存储数据方式之间进行选择之前,先评估一下你的应用数据库的使用方式。

  • 如果您有一个不需要频繁更新的数据,更新的即时一致性不是很重要,但是在读取时需要良好的性能,那么非规范化可能是明智的选择。(比如:我们博客的博文,作者一旦保存之后,几乎就不在进行频繁的修改,但是面临着读者频繁的读取阅读操作)

  • 如果数据库中的文档数据需要不断的更新,并且您希望在写入时具有良好的性能,那么您可能需要考虑规范化存储。(比如:需要频繁修改数据的业务类系统)

2.2. 一对多关系

与RDBMS相比,在MongoDB中对“一对多”关系建模需要进行更细粒度的设计。许多初学者陷入将文档数组嵌入父文档中的陷阱。正如我们在上文中介绍的,知道何时进行规范化存储或非规范化存储是非常重要的。因此设计者需要考虑关系的基数是“一个对少数几个”还是“一个对多个”?每种关系将具有不同的建模方法。

例如:下面“一个对少数几个”的建模示例。最好的建模方法是在父文档(persopn)中嵌入几个(address):

> db.person.findOne()
{
  name: 'Mark Kornfield',
  ssn: '1223-234-75554',
  addresses : [
     { street: '123 Church St', city: 'Miami', cc: 'USA' },
     { street: '123 Mary Av', city: 'Los Angeles', cc: 'USA' }
  ]
}

在“一个对多个”示例中,我们将考虑设计两个集合,即产品products集合和零件parts集合。每个零件都有一个“ ObjectID”,该“ ObjectID”将出现在产品集合的引用中。这样的设计可以让读写性能更高效。

> db.parts.findOne()
{
    _id : ObjectID('AAAA'),
    partno : '1224-dsdf-2215',
    name : 'bearing',
    price: 2.63

> db.products.findOne()
{
    name : 'car',
    manufacturer : 'Ford',
    catalog_number: 2234,
    parts : [     // array of references to Part documents
        ObjectID('AAAA'),    // reference to the bearing above
        ObjectID('F17C'),    // reference to a different Part
        ObjectID('D2AA'),
        // etc
]

2.3.设计模式可视化

尽管MongoDB是schemaless“无模式的”,但仍然存在将集合collections可视化为图表的方法。能够查看设计图,将对您理解和设计MongoDB的方式上产生重大影响。

DbSchema是可以很好地完成可视化设计工作的一个工具。如下图所示,它将通过读取集合和文档来推导架构。此外,您只需单击就可以修改图中的对象。在DbSchema中,您还可以为MongoDB创建外键,当然仅在本地创建,只用于设计目的。

2.4.智能索引

为了保持数据库的良好性能,有必要建立智能索引,这将简化写入和读取操作。知道MongoDB的索引优势和局限性非常重要,MongoDB保留用于排序操作的内存限制为32MB。如果你不使用索引,则排序时数据库将被迫将所有排序文档hold在内存里面,如果达到32M的限制,则数据库将返回错误或空集。

结论

对MongoDB的透彻理解与对数据库想要实现的目标的清晰了解是良好数据库设计的秘诀。

国外java源码网站-mongodb-jdbc-driver:MongoDBJDBC驱动程序|DbSchemaMongoDB设计器 国外java源码网站 MongoDb JDBC 驱动程序 | DbSchema MongoDB 设计器 驱动是为大家编写的,需要一个MongoDb JDBC驱动。 驱动程序功能 能够执行本机 MongoDb 查询的 JDBC 驱动程序,类似于 Mongo Shell。 驱动程序使用本机来连接和执行查询。 因此 JDBC URL 与 . 默认情况下,驱动程序返回一个带有单个对象的 ResultSet。 使用resultSet.getObject(1)来获取这个对象。 在 URL 中添加参数expand=true将为结果文档中的每个键在结果集中创建一列。 如果设置了 expand,驱动程序将提前读取许多行以创建正确的 ResultSetMetaData。 这对用户来说是透明的。 这是因为结果中的第一个文档可能具有较少的键作为下一个记录。 为了能够执行原生 MongoDb 查询,我们在驱动程序中嵌入了一个 Rhino JavaScript 引擎。 每次您执行查询时,我们都会使用 Rhino 作为 JavaScript 解析并运行它。 从DatabaseMetaData.getTables() 立即下载

相关推荐

解密TMS320F28377D双核工程中的内存分配艺术:从CMD文件到实战优化

本文深入解析TMS320F28377D双核DSP的内存管理艺术,从CMD文件配置到实战优化技巧。详细介绍了SARAM、GSRAM等内存类型的特性与配置方法,提供双核协同、性能优化及高级调试的实用方案,帮助开发者提升系统实时性和稳定性。

weixin_29190651的博客 663

MongoDB学习02(mongodb基本语法)

目录 1、查询 1.1、全部查询 1.2、查询单个条件 需要有索引 1.3、多个条件查询(and) 1.4、or查询(带符号操作) 1.5、大于小于等情况查询(带符号操作) 1.6、左右模糊查询 1.7、以某字开头 1.8、分页 1.9、查询单个列的列表 1.10、排序 2、更新 2.1、update 2.2、save 2.3、一些简单的加减法(...

baosheng0717的博客 860

STM32CubeMX最新版下载安装全攻略(附官网访问问题解决方案)

本文提供了STM32CubeMX最新版的详细下载与安装指南,并针对国内开发者常见的官网访问缓慢、注册验证邮件延迟等问题,给出了实用的解决方案和备选策略。通过清晰的步骤解析,帮助用户快速部署这一强大的STM32图形化配置工具,从而高效启动嵌入式开发项目。

weixin_28256233的博客 194

MongoDB基本使用技巧

1、日志分割方法db.runCommand("logRotate","1")分割日志时必须保证是以 –logpath启动的MongoDB,否则不能进行分割2、查看MongoDB的基本运行状态./mongostat --host localhost:port -u username -p password --authenticationDatabase database./mongotop --ho

奋斗吧_-小青年 631

Verilator+VSCode实战:5分钟搞定Verilog语法检查与波形调试

本文详细介绍了如何将Verilator仿真器与VSCode编辑器高效集成,打造极速的Verilog开发工作流。通过环境配置、实时语法检查、一键仿真与波形生成等实战技巧,帮助IC设计工程师在几分钟内完成从代码编写到波形调试的全过程,大幅提升中小规模模块的验证效率。

weixin_28454475的博客 469

秦时明月6.2魔改版_从零到一部署指南_含安卓客户端配置与GM后台直通

本文提供《秦时明月》6.2魔改版从零开始的完整部署指南。详细讲解CentOS服务器环境准备、服务端文件部署与安装、关键端口开放及进程验证。重点涵盖安卓客户端APK的IP修改与重签名方法,并介绍了GM后台工具的访问与使用,助你快速搭建并管理专属游戏服务器。

garlic的博客 310

mysql 关系图 工具_ER图绘制软件-DbSchema数据库关系图设计器下载v8.1.7-领航下载站...

DbSchema数据库关系图设计器是一款专门用于绘制ER图的工具。通常数据库之间存在一定的关系,想要将这些关系展现出来就得靠ER图。它非常易于使用,可快速完成布局和设计。DbSchema是什么如果你想设计数据库,探索和编辑数据,编写和执行查询,从文件创建报表,加载数据,生成随机数据,打印模式图表或生成文档比的dbschema是您正在寻找的工具。 随着的dbschema你并不需要成为一个数据库主:该...

weixin_33678821的博客 3082

硬全桥副边钳位管Vds电压凸台揭秘——寄生参数引发的导通异常

本文深入分析了硬全桥副边钳位管Vds电压凸台现象,揭示了寄生参数如何引发导通异常。通过波形分析和工程实践,详细解析了走线电感的蓄能效应和体二极管的接力作用,并提供了PCB布局优化、元件选型和驱动电路调整等解决方案,帮助工程师有效应对这一常见问题。

weixin_30825581的博客 429

MongoDB超详细教程(保姆级)

MongoDB 一、简介 1. 简单介绍 MongoDB是一个基于分布式文件存储的数据库 由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。 Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数

efew212efe的博客 16万+

分享一个完整的KANO问卷(包含正反问题和选项设置)

本文介绍了KANO模型问卷的设计与应用,用于评估功能需求优先级。问卷包含基本信息、功能评估(正反问题设计)、界面评估及开放问题,选项定义明确(如"非常喜欢"到"很不喜欢")。数据清洗规则包括剔除矛盾回答和注意力检验。通过量化编码和矩阵分析,将需求分为魅力型、期望型、必备型等类别。示例数据显示健康监测为必备型(72%),电子围栏为期望型(45%),适老化改造为无差异型(38%)。该模型为产品决策提供客观量化依据。

从技术实践立足,从项目管理方法论延伸思考 1795

产品包装质检实战:基于YOLOv5的智能包装合格检测系统全流程指南

摘要: 针对产品包装质检效率低、漏检率高的问题,本文提出基于YOLOv5的智能检测系统。系统通过采集包装缺陷数据(破损、缺标、封装不良等),利用YOLOv5实现多类别缺陷识别(准确率≥95%),并开发Flask Web界面实现检测可视化与报告生成。实验表明,该系统在30帧/秒的产线速度下可稳定运行,显著提升质检效率。项目涵盖数据标注、模型训练、系统开发全流程,具有工业落地价值,适用于智能制造场景的自动化质检需求。(149字)

LXY_LOVE36的博客 93

一文掌握MongoDB使用技巧

MongoDB 使用BSON 格式的文档来存储数据,而不是传统的关系型数据库中的行和列,文档可以包含复杂的数据结构,如嵌套的数组和子文档文档被组织在集合中,类似于关系型数据库中的表,集合中的文档可以具有不同的结构MongoDB 允许在同一实例上创建多个数据库,每个数据库中可以包含多个集合。

weixin_42333247的博客 2158

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

一文教你掌握MongoDB索引

MongoDB索引管理摘要 MongoDB索引是提高查询效率的关键数据结构,可避免全集合扫描。文章介绍了索引的基本概念、分类及不同类型索引的特点: 索引分类:按字段数量分为单键和复合索引;按特性分为唯一、稀疏、文本、地理空间索引等。 主要索引类型: 单字段索引:支持升序/降序查询 复合索引:多字段组合,顺序影响排序结果 多键索引:适用于数组字段 Hash索引:精确匹配但不支持范围查询 全文索引:简易分词检索 TTL索引:自动过期删除数据 基本操作:包括索引创建、查看和管理方法。 合理使用索引可显著提升Mon

热爱技术、喜欢学习、乐于分享 1737

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

从青铜到黄金,对着mysql学,一文搞定mongoDB

从青铜到黄金,对着mysql学,一文搞定mongoDB

我是香菜 1458

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【MongoDB】一文带你快速掌握MongoDB文档插入和查询

一、单个文档插入 1. 语法格式 2. 参数 3. 示例 5. 提示 二、批量文档插入 1. 语法格式 2. 参数 3. 示例 4. 提示 三、文档的基本查询 1. 语法格式 2. 参数 3. 示例 4. 提示 4. 投影查询

HHX_01的博客 3329

Mongodb 模式设计案例一例

Mongodb 于其他的数据库不同的地方在于灵活,而恰恰是因为灵活导致设计的重要性,不好的设计对于MONGODB 的性能伤害是十分大的,在设计中MONGODB 需要注意以下几点1 避免JOIN :虽然MYSQL 在设计中也尽量避免JOIN,但Mongodb 不同,MOGNODB 本身如果要采用JOIN 是要通过聚合框架来进行的,而聚合操作本身在MONGODB 中的支持并...

sql server的专栏 1517

『MongoDB』MongoDB模型设计的成神之路

📣读完这篇文章里你能收获到:为什么很多人认为MongoDB是无模式,文档模型跟传统的关系模型有什么区别,关于MongoDB的模型设计模式,你知道几个? 4. MongoDB如何进行表关联? 5. 文档模型的设计规范及设计原则 6. 文档建模模型设计三部曲 7. 1-1关系建模,1-N关系建模,N-N关系建模的建议 8. 针对不同的场景提供丰富的设计案例分享......

老陈聊架构 2027

MongoDB 表设计

12月12日上午,TJ在开源中国的年终盛典会上分享了文档模型设计的进阶技巧,就让我们来回顾一下吧: —————————————————————————————————————————————————————————- 从很久以前,我就开始接触开源产品:从最开始的使用、受益者到后来的贡献者,到现在的热情推广者。现在,我是MongoDB的技术顾问。我的职责是为MongoDB的客户和用户提供Mongo...

谷神通 2万+

一文教你如何使用 MongoDB 和 HATEOAS 创建 REST Web 服务

作者 |Ion Pascari译者 |天道酬勤责编 | 徐威龙封图|优快云 下载于视觉中国最近,作者在把HATEOAS实现到REST Web服...

优快云云计算 1045

已经有MySQL了,干嘛还要学MongoDB?

MongoDB是一种基于文档的NoSQL数据库,具有高性能、高可用性、可扩展性等优点。它使用BSON格式存储数据,支持复杂的查询和聚合操作,同时还提供了分布式锁、事务等功能。MongoDB的数据模型非常灵活,可以根据应用程序的需要进行自由设计。在Spring Boot中,可以通过引入MongoDB的依赖和配置连接信息来使用MongoDB,同时使用Spring Data MongoDB来操作MongoDB数据库。

java小白翻身 2732

一文搞懂NoSQL 数据库 MongoDB

MongoDB是一种开源的、面向文档的非关系型数据库管理系统,于2009年首次发布。它使用BSON 类似JSON 风格的文档来存储数据,而不是传统的行和列的表格形式。MongoDB的设计目标是在处理大量数据时提供高性能和可扩展性。它旨在满足现代应用程序对灵活性、可伸缩性和数据复杂性的要求。

qq_66627105的博客 1629

一文入手MongoDB

MongoDB快速上手——从0到1入门目录MongoDB简介NoSQL与SQL区别和联系MangoDB安装和配置第一步:下载安装包第二步:解压安装启动Shell连接Linux中的安装启动和连接基本命令集合(Collection)CRUD操作增(Create)删(Delete)改(Update)查((Retrieve))文档(Document)CRUD操作基本命令基本查询统计查询分页查询排序查询正则复杂条件查询比较查询包含查询条件连接查询索引单字段索引复合索引其他索引结语 目录 MongoDB简介   Mon

qq_45967311的博客 1532

MongoDB数据模型设计

MongoDB数据模型设计

SongD1114的博客 3358

mongodb 在centos7里用systemctl起不来

两个问题造成 1、/var/run/mongodb/mongod.pid 文件已存在 2、logpath和dbpath下的文件的权限问题:都得用 sudo chown mongod:mongod /mongo/data /mongo/journal /mongo/log systemctl status mongod.service ● mongod.service - SYSV:

zhao4471437的博客 1万+

一文教你Go语言如何轻松使用MongoDB

本文档详细介绍了如何使用Go语言对MongoDB进行基础操作。我们将学习如何使用Go连接MongoDB、插入文档、查询文档、更新文档和删除文档。

weixin_59801183的博客 2530
上一篇: 你说啥?十分钟带我了解Spring Data 教程 - Redis篇
下一篇: 程序员,IntelliJ IDEA的这些调试技巧,你用过多少?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值