Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >MONGODB 可以在应用系统中作为核心数据库?

MONGODB 可以在应用系统中作为核心数据库?

作者头像
AustinDatabases
发布于 2021-06-10 06:51:11
发布于 2021-06-10 06:51:11
1.4K0
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

知道最近也会听到一个声音,MONGODB 不能在核心的系统使用, 哎, 2021年了,现在有些系统都没有传统数据库的身影,而代替的是通过ES,REDIS ,Aerospike 这样的数据库来成功上位到这个系统的核心数据库, 那么MONGODB 为什么不可以成为项目的核心数据库?

在传统的数据库表的设计中会提到范式,一般应用程序的设计理念中会用到传统数据库,都会提到三范式,三范式中的要求主要是每一列都和主键直接相关,不能间接相关. 或者可以理解为一个项目中的数据库中的表和表之间的关系是通过主外键关系来连接的,不会有两张表包含相同内容的列超过1个.

这也就是传统数据库表中查询会通过JOIN 来进行多个表的数据关系连接并将多个表的数据在一个SELECT语句中被查询出的原因.

其中通过MONGODB 来作为核心库的好处

1 提高读取的性能,通过嵌套的方式的设计方式,将传统数据表中的JOIN 转换为一次读取获得数据的方式,提高数据的查询性能. 并且这样的操作方式将事务原子化.

2 查询数据的多源化,由于反范式,则在设计中可能存在同样的数据存在不同的collection中的情况, 那这样的设计可以在查询的逻辑层面分散某些查询的数据来源.

当然有好处必然有缺点

1 在多个表(colllection) ,存在类似或同样的数据,数据的一致性就成为一个问题,应用程序设计中就需要保证这方面的数据写入的原子性和事务性(目前高版本的已经支持跨collection事务)

2 数据更新在这样的设计下, 数据完全被更新的难度提高了.

在进行MONGODB 应用的承载的设计之初要把握

1 实体:实体可以理解为数据本身表达的意思

2 属性:标明实体中数据本身的分类,属性

3 关系:实体和实体之间的关系

掌握这三者的关系,与后面设计数据存储和查询是有关联的。

掌握这三者的和之间的关系之前是需要详细的了解业务,每种数据库都有他适合的业务的场景,在选择MONGODB来做核心的数据库时,你先要弄清楚你到底要接触的业务是什么。如果是财务之类的数据处理,对关系处理要求比较多的,包含数据汇聚和计算的比较多的,自然选择MONGODB 是不大合适。

第一步,确定业务,什么样的业务合适使用MONGODB 来做核心的数据库

1 日志类型的业务,日志类的数据包含,类似交易流水,业务逻辑处理流程中的记录,这类数据有一个明显的特征,基本在写入后,很少被改变。并且数据变化,扩展可能性大。

2 数据传递的媒介,如机构之间的报文的传递,回执,确认信息,外部数据的承接,这类的信息也有数据的格式不确定性,以及信息量大,并且在传入后也不在改变的特性。

3 信息传入量大,例如物联网,传入的信息量大,并且信息的格式可能会根据传入设备的变化,格式有变化的情况,其实这类信息还是具有数据格式不确定,变化,信息量大,传入信息后不进行改变的特性。

当然还有一些其他常见的场景,例如监控,社交,等。

终上所述,MONGODB 承接的业务有如下特点

并发高,信息量大,格式不固定,格式变动的可能性大,信息传入后变化不大,或基本不改变。基于这样的特点可以在几个方面进行合并MONGODB 本身的特点加以利用可以进行如下设计

架构设计中的读写分离

如果说在传统数据库上进行读写分离问题多,难点多,在MONGODB 上如果你说我还做不了读写分离,那只能说 你的加把劲了。

特性1 例如MONGODB 特有的多点写入确认的特点,在你认为这条信息是需要读写分离的,那完全可以将信息写入的时候,通过W 属性将信息在多个节点同时写入,保证原子性,那读写分离中是能保证你数据的写入和读取是可以保证一致性的。而控制的方法在你写入语句的时候加入 。具体方法参见

https://cloud.tencent.com/developer/article/1793778

在保证了数据的各个节点的一致性后,那么直需要在读取数据的时候,倾向性的去从库读取就可以了。这样在高并发的情况下,大大减少了主库的压力。

应用架构设计中的关系模型设计:

传统数据库中的关系

1 一对多

2 一对一

3 多对多

一对多的案例:

{_id: <objectId>,

人名:张三,

贷款记录:[

{贷款日期:”2018-12-12”,

贷款金额:100000RMB,

还款合同到期日:“2022-12-12”

每月还款额:5000

},

{贷款日期:”2020-03-02”,

贷款金额:50000RMB,

还款合同到期日:“2026-12-12”

每月还款额:2000

}]

}

通过数组+嵌套的方式来完成一对多的信息存储

多对多, 图书与作者的关系,一本书可能有多个作者,而一个作者也可以有多本书

书的记录

{

_id:<objectId>,

书名:XXX,

出版商:xxx,

出版日期:xxxx,

作者:[xxxx,xxxx]}

}

作者的记录

{_id:<objectId>,

作者名:xxx,

作者出生年月:'xxxx-xxxx',

图书:["xxx","xxx","xxx"]

}

多对多的情况下,看查询的所面对的对象,如果查询的是一本书的作者,则从书的角度查询,反之从作者的角度来查询,他写过几本书。都只需要从一个collection中查出,相关的结果,而只从一个collection中查出数据就可以。

这也就与之前传统数据库中的范式冲突,因为数据存在冗余。

但这并不是问题,数据的冗余换来的是查询的性能的优化,高并发的大批量的查询都是可以被支持的。

总结一下, MONGODB设计

1先通过业务来判定,是否应该通过MONGODB来解决问题是否是MONGODB 擅长的领域

2通过技术架构,以及应用中的数据存储设计,将一对一,一对多,多对多的问题解决。

3MONGODB 在频繁更新数据中不适用,但可以换一个想法,不少数据库中UPDATE 被转换为插入的模式,所以MONGODB 的UPDATE操作可以变更为数据版本的更新,在每个document 中增加一个版本的标识,在查询的时候,版本标识最后的信息为有效的,同时在业务低峰期,通过各种方式来清理过期的数据,也可能是一个不错的方法。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
听 唐建法 从ORACLE 到 MONGODB 数据迁移 数据库还可以这么玩 ?
这几年一直是MONGODB使用者,从3.2 到4.0 ,在使用中也一直充分的感受到MONGODB 这几年的飞速的发展以及功能的扩展,偶然在极客时间里面看到有MONGODB 的 终极玩家 唐建法 老师的关于MONGODB的课,其中有一段内容以前是不大敢想的, 就是ORACLE TO MONGODB。
AustinDatabases
2022/01/11
9630
听   唐建法  从ORACLE 到 MONGODB 数据迁移  数据库还可以这么玩 ?
MongoDB 存储引擎和数据模型设计
标签: MongoDB NoSQL 1. 存储引擎 1.1 存储引擎是什么 存储引擎是位于持久化数据(通常是放在磁盘或者内存中)和数据库之间的一个操作接口,它负责数据的存储和读取方式。MongoDB数据库通过存储引擎在磁盘中读取数据,而假设我们的应用是ASP.NET MVC,我们可以使用官方的Mongo.Driver驱动,通过通信协议(如TCP)向MongoDB数据库发送各种请求。以下是一个简单的运行图示 1.2 MongoDB中的默认存储引擎 自MongoDB 3.2 Release版本起,MongoDB
潘成涛
2018/01/18
1.6K0
MongoDB 学习建模与设计思路--统计数据更新案例
最近在读萧少聪老师翻译的书,MongoDB DATA MODELING AND SCHEMA DESIGN,主要是关于如何对数据建模的部分,当然这里建模是有倾向性的,是对于NOSQL的部分进行数据建模的一些理论和案例。
AustinDatabases
2025/01/15
810
MongoDB 学习建模与设计思路--统计数据更新案例
我的NodeJS学习之路6(数据库设计及开发)
早已久仰NoSQL的大名,知道它相对有关系型数据库,有很多的优点,只是一直没有时间来研究这个东西。所以借这个项目,对Mongodb进行了一次深入了解。
飞奔去旅行
2019/06/13
2.8K0
我的NodeJS学习之路6(数据库设计及开发)
一文读懂,DDD落地数据库设计实战
作者范钢,曾任航天信息首席架构师,《大话重构》一书的作者。本文根据具体实例详细描述了DDD 落实到数据库设计的整个过程
用户7927337
2021/01/21
1.9K0
MongoDB 大俗大雅,高端知识讲“庸俗” --3 奇葩数据更新方法
5 如何利用传统数据库经常谈到的,两阶段提交协议在MongoDB中应用乐观更新的模式
AustinDatabases
2025/01/16
820
MongoDB 大俗大雅,高端知识讲“庸俗” --3 奇葩数据更新方法
MongoDB在58同城的应用实践
58同城作为中国最大的生活服务平台,涵盖了房产、招聘、二手、二手车、黄页等核心业务。58同城发展之初,大规模使用关系型数据库(SQL Server、MySQL等),随着业务扩展速度增加,数据量和并发量演变的越来越有挑战,此阶段58的数据存储架构也需要相应的调整以更好的满足业务快速发展的需求。MongoDB经过几个版本的迭代,到2.0.0以后,变的越来越稳定,它具备的高性能、高扩展性、Auto-Sharding、Free-Schema、类SQL的丰富查询和索引等特性,非常诱惑,同时58同城在一些典型业务场景下
玄姐谈AGI
2018/07/03
2.3K1
第11章_数据库的设计规范
🧑个人简介:大家好,我是 shark-Gao,一个想要与大家共同进步的男人😉😉
程序员Leo
2023/08/02
5300
第11章_数据库的设计规范
关系型数据和文档型数据库有什么区别?
关系数据库(Relational Database)是建立在关系模型基础上的数据库,借助于几何代数等数学概念和方法来处理数据库中的数据。所谓关系模型是一对一、一对多或者多对多等关系,常见的关系型数据库有 Oracle、SQL Server、DB2、MySQL 等。
码农架构
2021/02/23
5.3K0
关系型数据和文档型数据库有什么区别?
关系型数据库设计小结
前段时间因为项目需要搭建一个web服务器,后端Web框架我调研了几个,比如Python的Flask,Django, NodeJs的Express,JavaEE的Spring,以及C++的CppCMS, 经过权衡拓展性开发效率,最后选择了Django。 也许Python不是最好的选择,但至少目前来看工作的还挺顺利。
evilpan
2023/02/12
2.4K0
关系型数据库设计小结
MongoDB设计方法及技巧
MongoDB是一种流行的数据库,可以在不受任何表格schema模式的约束下工作。数据以类似JSON的格式存储,并且可以包含不同类型的数据结构。例如,在同一集合collection 中,我们可以拥有以下两个文档document:
字母哥博客
2020/09/23
1.1K0
MongoDB设计方法及技巧
MongoDB数据结构设计中6条重要的经验法则
很多初学者认为在MongoDB中针对一对多建模唯一的方案就是在父文档中内嵌一个数组子文档,但是这是不准确的。因为你可以在MongoDB内嵌一个文档不代表你就必须这么做。 当你设计一个MongoDB数据库结构,你需要先问自己一个在使用sql时不会考虑的问题:这个关系中集合的大小是什么样的规模?你需要意识到一对很少,一对许多,一对非常多,这些细微的区别。不同的情况下你的建模也将不同。 一对很少 一个人的地址为例,这时候使用内嵌文档是很合适,可以在person文档中嵌入数组地址文档: < db.person.fi
wangxl
2018/03/08
2K0
数据库设计实战(一):数据库设计规范「建议收藏」
将现实世界的概念数据模型设计成数据库的一种逻辑模式,即适应于某种特定数据库管理系统所支持的逻辑数据模式
全栈程序员站长
2022/09/14
3.9K0
MongoDB 大俗大雅,高端的知识讲“通俗” -- 2 嵌套和引用
如果从字面的意思理解,是一个文档中嵌套了或包含了另一个文档,这是一种关联数据的方式,利用这样的方式我们就直接避免了JOIN,对传统数据库的表的JOIN。这也是MongoDB 化解性能问题的第一个方案,因为JOIN的操作在传统数据库就是一个消耗性能的操作。
AustinDatabases
2025/01/15
570
MongoDB  大俗大雅,高端的知识讲“通俗” -- 2 嵌套和引用
关于如何更好管理好数据库的一点思考
本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。
锅总
2024/06/26
1500
关于如何更好管理好数据库的一点思考
数据库概述
持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的实现过程大多通过各种关系数据库来完成。
timerring
2023/02/03
7400
干货教程 | MongoDB 熟练到精通(一):模型设计基础知识详解
导读:本文为《MongoDB 熟练到精通》系列文章第一弹。该系列内容主要面向开发者,介绍在系统上线之前需要关注的事项,包括如何进行最关键的文档模型设计、读写事务操作,介绍数据安全和事务性等诸多高级参数和特性的含义及使用方式,以及开发者最佳实践。在最基本的数据库增删改查之余,我们更希望通过这部分的学习,让大家有足够的底气把简历上的“熟练使用 MongoDB 进行开发”,改为“精通使用 MongoDB 开发”。下面就让我们一起开启今日份的学习吧。
MongoDB中文社区
2023/01/04
6290
干货教程 | MongoDB 熟练到精通(一):模型设计基础知识详解
python数据库-数据库的介绍及安装(47)
  数据库(Database)是存储与管理数据的软件系统,就像一个存入数据的物流仓库。每个数据库都有一个或多个不同的API接口用于创建,访问,管理,搜索和复制所保存的数据。我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢,所以我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量。
Se7eN_HOU
2019/07/10
6910
python数据库-数据库的介绍及安装(47)
服务器 数据库设计技巧--1
1. 原始单据与实体之间的关系 可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体。这里的实体可以理解为基本表。明确这种对应关系后,对我们设计录入界面大有好处。 〖例〗:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表、社会关系表、工作简历表。这就是“一张原始单证对应多个实体”的典型例子。 ·2. 主键与外键 一般而言,一个实体不
李海彬
2018/03/23
1.9K0
数据库专题(一) ——数据库优化
数据库专题(一) ——数据库优化 (原创内容,转载请注明来源,谢谢) 一、概述 数据库的优化通常分为三个方面:数据库DML、DQL的优化(即增删改查等SQL语句优化);数据库设计优化(如索引设置、索引类型、表引擎、冗余字段、主键外键等);数据库服务器和配置优化(如主从分离、读写分离等)。 根据不同的业务场景,需要进行不同的优化措施。 二、数据库语句优化 程序对数据库的操作,绝大部分来自查询,因此查询的优化至关重要,而大部分情况下,查询的优化在于索引命中率。网络上有很多查询优化的例子,在此主要说几点。
用户1327360
2018/03/07
1.8K0
推荐阅读
相关推荐
听 唐建法 从ORACLE 到 MONGODB 数据迁移 数据库还可以这么玩 ?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文