开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共2710人左右 1 + 2 + 3 + 4 +5 + 6 + 7 + 8 + 9)(1 2 3 4 5 6群均已爆满,7群400+,开8群9群)
今天我们继续讨论
4 基于基本操作的复杂更新
5 如何利用传统数据库经常谈到的,两阶段提交协议在MongoDB中应用乐观更新的模式
在说这个部分前我们先说说 数组
MongoDB 中在在进行文档设计的时候,必须要提到一点,数组。在传统数据库中基本上很少提到数组,但是在MongoDB的设计中数组是必须要会的一个属性或者说一个“文档”设计当中的要点。
这里我们先总结,然后再举例
1 数组在MongoDB 的主要作用可以理解为解决一对多的关系描述,利用数组来模拟出高效的多个事务归属于一个事务的关系。
2 数组灵活,数组中可以包含不同数据类型的元素,或其他的文档或数组,可以表达的一对多的关系可以更加的复杂。
3 数组的更新和删除元素都比较的简单,通过 PUSH ,PULL,SET 进行元素的增删设置等
这里我们举几个例子
1 产品说明
{ "_id": ObjectId("..."), "title": "沃尔沃S60", "介绍内容": "北欧奢华的安全座驾B级车标杆", "特性": ["无甲醛", "自动避让", "坚固车身", "环保"] }
上面的特性部分就是数组,如果这放到了传统数据库这将无法处理,比如问,有多少车有环保的特性,此时你只能通过 select * from table where 特性 like '%环保%' or '环保%' or '%环保'; 来进行查询。
db.cars.find({ "特性": "环保" })
db.cars.find({ "特性": { $in: ["环保"] } })
db.cars.find({ "特性": { $regex: "^环保" } })
而这些查询中我们可以统一为特性建立一个索引
db.cars.createIndex({ "特性": 1 })
2 订单和订单项
{
"orderId": "order456",
"customerName": "Bob",
"orderItems": [
{ "product": "Laptop", "quantity": 1 },
{ "product": "Mouse", "quantity": 2 }
],
"orderDate": "2025-01-08"
}
这是一个典型的案例,上面的orderItems是一个数组,通过通过数组中利用嵌套本身作为数组的元素。查询的方式也比较简单,通过对元素本身的值进行查询即可。
db.orders.find({
"orderItems.product": "Laptop"
});
以上的使用方式在数组中使用平铺数据或嵌套等可以利用在持久的一对多的关系中,同时需要注意,数组的数据不是高频应该进行数据的更新或清理的,同时数组中的元素也不宜过度使用。
简单说完数组,我们继续说数据的更新,在MongoDB中的设计也可以根据具体的数据更新的部分进行设计,
1 需要原子更新的相关数据,尽量将他嵌入同一个文档中
2 经常要更新的数据,可以和不经常更新的数据进行分离,避免经常更新导致的性能问题,这里可以使用引用的方式将不经常更新的数据作为查询的主体,通过引用要更新的部分,一次通过查询获取要更新的文档,且一次性更新。
3 如果需要通过引用进行数据更新,注意是否对数据的更新和读取有一致性的要求,如果有强一致性的要求,则应该将数据放置在一个文档中,而不是通过引用的方式。
4 这点是MongoDB独有的,我们可以通过版本控制来进行,比如我们把更新数据变为插入数据,通过在文档中增加版本这个标签,来完全规避更新数据,而通过insert数据加标签的方式来进行
5 频繁更新数据的部分,应考虑减少使用数组的可能性或者控制更新数据的数组的大小,应该尽量的小。
6 通过读写分离的方案,尽量将对于数据的时效性不敏感的查询放置在从库查询。
这里补充一个特殊的方案针对大量的数据更新和提高更新的性能的方案
首先如果需要一次性更新数量较多的文档,可以将更新设置为什么 writeConcern {w:0} ,在这样的情况下,更新数据时MongoDB的性能是最高的。
在操作都更新完毕后,直接对更新的数据进行查询因为有条件的查询是较快的,在确认更新的操作都完结后,可以直接通过 findAndModify 操作来进行对预先设计的更新标志位进行查询和更新,以此作为整体数据更新的成功标记。
通过这样的方法可以快速的对数据进行更新并且提高的性能最高,这样方式
优点: 提高性能: 第一阶段不等待写入确认,可以提高更新性能。 模拟两阶段提交: 通过记录和回滚操作,可以模拟传统数据库中的两阶段提交协议,确保数据一致性。
缺点: 实现复杂: 需要额外的集合和操作来记录和回滚更新操作。 无法保证完全隔离: 在第一阶段和第二阶段之间,其他操作可能会读取到未提交的数据。
以上方式实际上是在模拟两阶段提交。
个人理解,大部分情况MongoDB的数据更新如同面条,酱汁和好吃的都挂在面条外面,但我们也可以模拟传统数据库的数据更新方式,将数据更新包装成事务的方式,进行统一的更新和确认,如同肠粉,馅料是在里面的,但重点是,都好吃。
MongoDB 相关文章
MongoDB 大俗大雅,高端的知识讲“通俗” -- 2 嵌套和引用
MongoDB 大俗大雅,高端的知识讲“低俗” -- 1 什么叫多模
MongoDB 合作考试报销活动 贴附属,MongoDB基础知识速通
MongoDB 使用网上妙招,直接DOWN机---清理表碎片导致的灾祸 (送书活动结束)
数据库 《三体》“二向箔” 思维限制 !8个公众号联合抽奖送书 建立数据库设计新思维
MongoDB 是外星人,水瓶座,怎么和不按套路出牌的他沟通?
17000多张MongoDB表的锅 自动分析删除表数据难题--从头到尾的处理过程(文尾有MongoDB开发规范)
MongoDB 插入更新数据慢,开发问哪的问题?附带解决方案和脚本
MongoDB 挑战传统数据库聚合查询,干不死他们的MongoDB 2023纽约 MongoDB 大会 -- 我们怎么做的新一代引擎 SBE Mongodb 7.0双擎力量(译)
MongoDB 2023年度纽约 MongoDB 年度大会话题 -- MongoDB 数据模式与建模
MongoDB 双机热备那篇文章是 “毒”
MongoDB 会丢数据吗?在次补刀MongoDB 双机热备
MONGODB ---- Austindatabases 历年文章合集
MySQL相关文章
"DBA 是个der" 吵出MySQL主键问题多种解决方案
MySQL 的SQL引擎很差吗?由一个同学提出问题引出的实验
用MySql不是MySQL, 不用MySQL都是MySQL 横批 哼哼哈哈啊啊
MYSQL --Austindatabases 历年文章合集
PolarDB 相关文章
POLARDB 添加字段 “卡” 住---这锅Polar不背
PolarDB 版本差异分析--外人不知道的秘密(谁是绵羊,谁是怪兽)
PolarDB 答题拿-- 飞刀总的书、同款卫衣、T恤,来自杭州的Package(活动结束了)
PolarDB for MySQL 三大核心之一POLARFS 今天扒开它--- 嘛是火星人
PolarDB-MySQL 并行技巧与内幕--(怎么薅羊毛)
PolarDB 并行黑科技--从百套MySQL撤下说起 (感谢8018个粉丝的支持)
PolarDB 杀疯了,Everywhere Everytime Everydatabase on Serverless
POLARDB 从一个使用者的角度来说说,POALRDB 怎么打败 MYSQL RDS
PolarDB 最近遇到加字段加不上的问题 与 使用PolarDB 三年感受与恳谈
PolarDB 从节点Down机后,引起的主从节点强一致的争论
PolarDB serverless 真敢搞,你出圈了你知道吗!!!!
PolarDB VS PostgreSQL "云上"性能与成本评测 -- PolarDB 比PostgreSQL 好?
临时工访谈:PolarDB Serverless 发现“大”问题了 之 灭妖记 续集
临时工访谈:庙小妖风大-PolarDB 组团镇妖 之 他们是第一
PolarDB for PostgreSQL 有意思吗?有意思呀
PolarDB Serverless POC测试中有没有坑与发现的疑问
临时工说:从人性的角度来分析为什么公司内MySQL 成为少数派,PolarDB 占领高处
POLARDB -- Ausitndatabases 历年的文章集合
PolarDB for PostgreSQL 有意思吗?有意思呀
临时工访谈系列
国内最大IT服务公司-招聘DBA “招聘广告”的变化--分析与探讨
OceanBase 相关文章
跟我学OceanBase4.0 --阅读白皮书 (OB分布式优化哪里了提高了速度)
跟我学OceanBase4.0 --阅读白皮书 (4.0优化的核心点是什么)
跟我学OceanBase4.0 --阅读白皮书 (0.5-4.0的架构与之前架构特点)
跟我学OceanBase4.0 --阅读白皮书 (旧的概念害死人呀,更新知识和理念)
OceanBase 学习记录-- 建立MySQL租户,像用MySQL一样使用OB
临时工访谈:OceanBase上海开大会,我们四个开小会 OB 国产数据库破局者
临时工说:OceanBase 到访,果然数据库的世界很卷,没边
数据库信息速递 阿里巴巴的分布式数据库OceanBase旨在进军中国以外的市场 (翻译)
PostgreSQL 相关文章
PostgreSQL 什么都能存,什么都能塞 --- 你能成熟一点吗?
全世界都在“搞” PostgreSQL ,从Oracle 得到一个“馊主意”开始PostgreSQL 加索引系统OOM 怨我了--- 不怨你怨谁
PostgreSQL “我怎么就连个数据库都不会建?” --- 你还真不会!
病毒攻击PostgreSQL暴力破解系统,防范加固系统方案(内附分析日志脚本)
PostgreSQL 远程管理越来越简单,6个自动化脚本开胃菜
PostgreSQL 稳定性平台 PG中文社区大会--杭州来去匆匆
PostgreSQL 分组查询可以不进行全表扫描吗?速度提高上千倍?
POSTGRESQL --Austindatabaes 历年文章整理
PostgreSQL 查询语句开发写不好是必然,不是PG的锅
PostgreSQL 字符集乌龙导致数据查询排序的问题,与 MySQL 稳定 "PG不稳定"
PostgreSQL Patroni 3.0 新功能规划 2023年 纽约PG 大会 (音译)
PostgreSQL 玩PG我们是认真的,vacuum 稳定性平台我们有了
PostgreSQL DBA硬扛 垃圾 “开发”,“架构师”,滥用PG 你们滚出 !(附送定期清理连接脚本)
SQL SERVER 系列
SQL SERVER 如何实现UNDO REDO 和PostgreSQL 有近亲关系吗
SQL SERVER 我没有消失,SQL SERVER下一个版本是2025 (功能领先大多数数据库)
SQL SERVER 2022 针对缓存扫描和Query Store 的进步,可以考虑进行版本升级
阿里云系列
阿里云数据库产品权限设计缺陷 ,六个场景诠释问题,你可以做的更好?
阿里云数据库--市场营销聊胜于无--3年的使用感受与反馈系列
阿里云数据库产品 对内对外一样的卷 --3年阿里云数据库的使用感受与反馈系列
阿里云数据库使用感受--客户服务问题深入剖析与什么是廉价客户 --3年的使用感受与反馈系列
阿里云数据库使用感受--操作界面有点眼花缭乱 --3年的使用感受与反馈系列
截止今天共发布 1287篇文章
