MongoDB 的设计模式策略
译者:CSDN - 仲培艺
www.iteye.com/news/31667
MongoDB是一项通用工具,但它也并非完美。针对某些MongoDB不适用的场合,有时可选用设计模式来加以应对。
MongoDB是一个NoSQL文档数据库,在大多数情况下是一个相对理想的选择,即使是在其不适用的情况下,也仍然可以依靠下面所列举的这些设计模式来克服其局限性。
本文将针对我的另一篇文章《MongoDB的好坏恶》( MongoDB : The Good, The Bad, and the Ugly)中所提及的一些局限性,提供一个相对应的解决方案。
1. 查询命令分离模式
在副本集中职责被分离到不同的节点。最基本的第一类节点可能也同时占据着首要地位,它只需要储存那些写入和更新所需的数据。而查询工作则交由第二类节点来执行。这一模式将提升首要节点服务器的写吞吐量,因为当写入一组对象时,需要更新及插入的数据量也随之减少,除此之外,二类节点也得益于较少的待更新数据和其自身所具有的为其工作量而优化的内存工作集。
2. 应用程序级事务模式
MongoDB不支持事务和文件内部锁定。然而,依据应用逻辑,应当保留queue用法。
db.queue.insert( { _id : 123,
message : { },
locked : false,
tlocked : ISODate(),
try : 0 });
var timerange = date.Now() - TIMECONSTANT;
var doc = db.queue.findAndModify( { $or : [ { locked : false }, { locked : true, tlocked : {
$lt : timerange } } ], { $set : { locked : true, tlocked : date.Now(), $inc : { try : 1 } } }
);
//do some processing
db.queue.update( { _id : 123, try : doc.try }, { } );
3. Bucketing模式
当文本含有一个不断增长的数组时,则使用Bucketing模式,例如指令。而指令线可能会扩展到超过文档大小的合理值。该模式经由编程方式处理,并通过公差计算触发。
var TOLERANCE = 100;
for( recipient in msg.to) {
db.inbox.update( {
owner: msg.to[recipient], count: { $lt : TOLERANCE }, time : { $lt : Date.now() } },
{ $setOnInsert : { owner: msg.to[recipient], time : Date.now() },
{ $push: { "messages": msg }, $inc : { count : 1 } },
{ upsert: true } );
4. 关系模式
有时,会有不能插入整个文档的情况,例如人体建模时,我们就可以使用该模式来建立关系。
确定数据是否属于该文档,即二者间是否有关系。
如果可能的话,特别是面对有用的独有(专属)数据时,插入文档。
尽可能不参考id值。
对关系中的有用部分进行反规范化处理。好的候选不会经常甚至从不更改值,并且颇为有用。
关注反规范数据的更新和关系修复。
{
_id : 1,
name : ‘Sam Smith’,
bio : ‘Sam Smith is a nice guy’,
best_friend : { id : 2, name : ‘Mary Reynolds’ },
hobbies : [ { id : 100, n :’Computers’ }, { id : 101, n : ‘Music’ } ]
}
{
_id : 2,
name : ‘Mary Reynolds’
bio : ‘Mary has composed documents in MongoDB’,
best_friend : { id : 1, name : ‘Sam Smith’ },
hobbies : [ { id : 101, n : ‘Music’ } ]
}
5. 物化路径模式
在一个数据模型的树模式中,同一对象类型是该对象的子对象,这种情况下可以使用物化路径模型来以获取更高效的检索、查询。示例如下:
{ _id: "Books", path: null }
{ _id: "Programming", path: ",Books," }
{ _id: "Databases", path: ",Books,Programming," }
{ _id: "Languages", path: ",Books,Programming," }
{ _id: "MongoDB", path: ",Books,Programming,Databases," }
{ _id: "dbm", path: ",Books,Programming,Databases," }
按字段路径查询树模式:
db.collection.find().sort( { path: 1 } )
使用路径字段的常规表达来找出Programming的后代集:
db.collection.find( { path: /,Programming,/ } )
在Books是top parent的情况下查询Books的后代集:
db.collection.find( { path: /^,Books,/ } )
MongoDB 的设计模式策略相关推荐
- MongoDB的设计模式策略
原文:MongoDB Design Patterns 作者: Darel Lasrado 译者:仲培艺,关注数据库领域,纠错.寻求报道或者投稿请致邮:zhongpy@csdn.net. MongoDB ...
- Python设计模式-策略模式
Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...
- 关于设计模式——策略模式-Strategy Pattern
文章目录 1 策略模式 1.1 模拟鸭子 1.2 设计原则 1.3 整合行为 1.4 模拟鸭子代码的代码 1.5 动态设定行为 1.6 重新查看整体 1.7 继承和组合 1.8 总结 1.9 优劣期间 ...
- [设计模式] ------ 策略模式
策略模式 它定义了算法家族,分别封装起来,让他们直接可以互相替换,此模式让算法的变化,不会影响到使用算法的客户 其实很简单,可能很多人都用到了,只不过还不知道这就是策略模式而已. 比如定义一个接口A, ...
- java 策略模式 促销_java设计模式——策略模式
一. 定义与类型 定义:针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换.策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能.当代码中 ...
- 行为设计模式 - 策略设计模式
行为设计模式 - 策略设计模式 策略设计模式是行为设计模式之一.当我们为特定任务使用多个算法时,使用策略模式,客户端决定在运行时使用的实际实现. 策略设计模式 策略模式也称为战略模式.我们定义了多个算 ...
- Springboot 使用设计模式- 策略模式
前言 直白点,什么场景我们需要使用到设计模式- 策略模式. 在平常的springboot项目里面做CRUD,我们的习惯性基本是 一个mapper,一个service,一个serviceImpl. 但是 ...
- 李建忠设计模式——策略模式Strategy
目录 1.策略模式定义 1.动机 2.模式定义 3.结构 2.实现例子 1.问题描述 2.代码实现 3.要点总结 4.参考 1.策略模式定义 1.动机 软件构建过程中,某些对象使用的算法可能多种多样, ...
- 15. 星际争霸之php设计模式--策略模式
题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...
- Java设计模式-策略模式作业
Java设计模式-策略模式作业,所有类和接口均在一个package内 文章目录 前言 一.作业内容 二.具体实现 1.类图 2.Strategy接口 3.PreCopyStrategy类 4.Post ...
最新文章
- oracle存储过程备份,利用ORACLE存储过程与JOB结合实现对数据表自动备份
- dockerfile构建mysql_Dockerfile在linux上构建mysql8镜像并创建数据库-Go语言中文社区
- COCO 数据集格式及mmdetection中的转换方法
- php成品代码,PHP代码
- 内核并发控制---自旋锁(来自网易)
- UE4官方文档UI学习:2.UMG 创建主菜单
- 全外显子测序助力疾病诊疗
- CMMI 项目计划实战
- IDEA配置JPBC
- VPS云主机是什么?有什么优势?
- [转]MOSS 2007 整合運用 - Office System 2007 整合應用秘訣
- 计算机在地理科学中的作用,中学地理教学中工具的重要性—胡阳新推荐
- 基于微信小程序的学院通知与文件分享系统app设计与实现-计算机毕业设计源码+LW文档
- 解决网易服务器延迟大,网易WOW服务器延迟
- 黑苹果驱动神器Hackintool 3.4.4中文版
- 新手小白搭建服务器环境如何选择呢?lnmp还是lamp?
- alin42490怎样解除_最新版农药通用名称与CIPAC编号对照表
- change在c语言中的用法,change的过去式和用法例句意思及阅读
- 主码,候选码,外码,全码,主属性,非主属性的区别
- Linux系统简介分区基础命令(ADMIN01-2)
热门文章
- Oracle将Java EE移交Eclipse基金会
- IPv4与IPv6数据报格式详解
- rsync+inotify文件变动后自动同步程序
- hdu 3853 LOOPS 概率dp入门题
- 如何在macOS Monterey 中开启对焦模式?
- iOS开发之审核时间
- Dash for mac(代码文档浏览器)v6.0.8
- Mac上“照片”的终极工具箱​​​​ PowerPhotos
- 10x程序员是如何思考的?
- 在 tornado 中异步无阻塞的执行耗时任务