一文教你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() 立即下载

相关推荐

一文读懂 MAVLink、PPM、SBUS:无人机通信协议的工作原理与适用场景

本文系统对比无人机领域三大核心通信协议:MAVLink作为全链路数据协议,支持飞控与地面站的双向通信,适合航拍测绘等专业场景;SBUS是数字化的高效控制协议,具备16通道、抗干扰特性,成为中高端设备标配;PPM作为传统模拟协议,成本低廉但性能有限,适合入门级应用。文章深入解析各协议的工作原理、帧结构、适用场景及调试技巧,指出MAVLink侧重状态监控、SBUS/PPM专注控制指令的互补关系,并给出新手选型建议:入门选PPM,进阶用SBUS,开发必备M

bother3000的博客 7125

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

html python mysql交互_干货!Python与MySQL数据库的交互实战

安装PyMySQL库如果你想要使用python操作MySQL数据库,就必须先要安装pymysql库,这个库的安装很简单,直接使用pip install pymysql;假如这种方式还是安装不上,就用如下链接找一个合适的安装包,进行安装,这个就不细说了。https://www.lfd.uci.edu/~gohlke/pythonlibs/使用Python连接MySQL数据库1)六个常用的连接参数参数...

weixin_31043555的博客 1561

MongoDB基本使用技巧

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

奋斗吧_-小青年 631

STM32+OpenCV云台PID调参实战:从震荡到丝滑跟踪的进阶之路

本文详细介绍了基于STM32和OpenCV的跟踪云台PID调参实战经验。从硬件搭建、PID控制原理到调参技巧,系统讲解了如何通过调整比例、积分和微分参数解决系统震荡问题,实现从震荡到丝滑跟踪的进阶过程,特别适合电赛和嵌入式视觉控制开发者参考。

tgb3456789的博客 715

使用ChIPSeeker进行ChIP-seq, ATAC-seq,cut&tag等富集峰的基因组注释

常规的下一代高通量测序(next generation sequencing, NGS)实验通常产生大量短片段(reads),通常我们需要将这些reads比对到参考基因组/转录组上,即将它们置于生物学上有意义的基因背景下,才能获得有意义的结果。一般我们认为会产生两种类型的数据(当然两者并无严格意义上的区分)

微生信 3318

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

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

weixin_33678821的博客 3082

SAP:QUERY中SQ02增加选择屏幕权限控制

【代码】SAP:QUERY中SQ02增加选择屏幕权限控制。

weixin_43734184的博客 2326

MongoDB超详细教程(保姆级)

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

efew212efe的博客 16万+

智能体异常行为检测-基于行为序列的异常模式识别技术【附代码】

在多智能体系统(Multi-Agent Systems, MAS)中,智能体之间的行为协调与自主决策是系统稳定运行的关键。然而,当某个智能体因策略偏移、环境变化或潜在攻击而出现**异常行为(Abnormal Behavior)**时,整个系统可能陷入混乱或崩溃。

一键难忘的博客 1144

基于深度学习的电力系统暂态稳定评估与预防控制复现

本文复现了基于深度学习的电力系统暂态稳定评估与预防控制方法。主要内容包括:(1)数据预处理环节,对IEEE 39节点系统的电压幅值、相角等特征数据进行归一化处理;(2)ACNGAT模型实现,该模型结合时间卷积网络(TCN)和图注意力网络(GAT)提取时空特征;(3)采用改进的帝企鹅优化算法进行预防控制。关键技术点包括:融合时空信息的特征提取、改进的邻接矩阵构建方法(λ_ij = E_i * E_j * B_ij)以及时空注意力机制。代码实现采用Python和PyTorch框架。

huanghm88的专栏 335

一文掌握MongoDB使用技巧

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

weixin_42333247的博客 2158

YOLO26改进策略【YOLO和Mamba】| MLLA:Mamba-Like Linear Attention,融合Mamba设计优势的注意力机制

本文记录的是利用模块优化的目标检测网络模型。模块具有独特优势。它不同于传统模块,能同时兼顾局部特征高效建模与长距离交互学习。常见模块要么在局部特征处理上有优势但长距离交互能力弱,要么反之,而模块克服了此问题。它融合了Mamba模型和线性注意力机制的优势,通过独特的结构设计,能够在保持计算效率的同时,精准地建模局部特征并学习长距离交互信息。本文将其用于的模型改进和二次创新,能够更加关注图像中的重要特征区域,抑制背景等无关信息的干扰,从而突出目标物体的关键特征。Demystify Mamba in Vision

Limiiiing的博客 213

一文教你掌握MongoDB索引

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

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

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

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

我是香菜 1458

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

HHX_01的博客 3329

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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、付费专栏及课程。

余额充值