Mongodb模式设计

海量订单系统微服务开发:使用MongoDB支持海量数据 海量订单系统微服务开发 订单系统是电商平台中一个非常重要的组成部分,而且它还是一个具有巨大流量和高并发访问的系统,与订单相关的服务涉及库存、支付、物流等。在设计订单系统时,我们选择使用支持海量数据的NoSQL 数据库MongoDB,配合使用反应式的Spring Data MongoDB,实现高并发设计。 本章实例项目代码可从本书源代码中下载,在IDEA 中检出,或通过页面直接下载使用。检出后请获取分支版本V2.1。在这个分支中包含以下几个模块: order-object:订单公共对象设计。 orde 阅读详情

中文社区

MongoDB 进阶模式设计

12月12日上午,TJ在开源中国的年终盛典会上分享了文档模型设计的进阶技巧,就让我们来回顾一下吧: —————————————————————————————————————————————————————————-

从很久以前,我就开始接触开源产品:从最开始的使用、受益者到后来的贡献者,到现在的热情推广者。现在,我是MongoDB的技术顾问。我的职责是为MongoDB的客户和用户提供MongoDB使用的一些最佳实践,包括模式设计、性能优化和集群部署方案等方面。

MongoDB 模式设计进阶案例_页面_01

今天的话题是进阶模式,所以我假设在坐各位至少是已经对MongoDB有了一些基本的了解。 不过每次总有一些同学以为这里有水果吃才坐进来的,所以在这里我简单介绍一下:MongoDB 不是芒果(mango),它在拉丁文中的原意是巨大的意思。如果用一句话来概括的话,mongo是一个高可用、分布式、无模式的文档数据库。等一下,这里我故意用错了一个词: 不是无模式,而是“灵活模式”。 如果真的是无模式,今天我就不用站在这里了。没有模式何来模式设计之说。在你开始用mongo做一些 prototype的时候,确实不用考虑太多的模式。MongoDB内存数据库的一些特性,让你在前期不会遇到什么问题。但是一旦涉及到几千万几十亿的数据量,或者是数千数万的并发量,模式设计就是个你必须提前面对的问题。

MongoDB 模式设计进阶案例_页面_02

在我们谈mongo的模式设计之前,我们很有必要来了解一下MongoDB的数据模型。大家都知道,无论你从哪个角度来看,MongoDB都是目前NoSQL,或者说非关系型的数据库中的领头羊。那么,mongo和传统关系数据库的最本质的区别在那里呢?我们说是它的文档模型。

MongoDB 模式设计进阶案例_页面_03

关系模型和文档模型的区别在哪里?

  • 关系模型需要你把一个数据对象,拆分成零部件,然后存到各个相应的表里,需要的是最后把它拼起来。举例子来说,假设我们要做一个CRM应用,那么要管理客户的基本信息,包括客户名字、地址、电话等。由于每个客户可能有多个电话,那么按照第三范式,我们会把电话号码用单独的一个表来存储,并在显示客户信息的时候通过关联把需要的信息取回来。
  • 而MongoDB的文档模式,与这个模式大不相同。由于我们的存储单位是一个文档,可以支持数组和嵌套文档,所以很多时候你直接用一个这样的文档就可以涵盖这个客户相关的所有个人信息。关系型数据库的关联功能不一定就是它的优势,而是它能够工作的必要条件。 而在MongoDB里面,利用富文档的性质,很多时候,关联是个伪需求,可以通过合理建模来避免做关联。

虽然MongoDB的模型和关系型截然不同,但是关系型数据库的一些必不可少的功能如动态查询、二级索引、聚合等在MongoDB中也有非常完善的支持。

MongoDB 模式设计进阶案例_页面_04

这里我介绍一下文档模型的优点:

  • 读写效率高-由于文档模型把相关数据集中在一块,在普通机械盘上读数据的时候不用花太多时间去定位磁头,因此在IO性能上有先天独厚的优势;
  • 可扩展能力强-关系型数据库很难做分布式的原因就是多节点海量数据关联有巨大的性能问题。如果不考虑关联,数据分区分库,水平扩展就比较简单;
  • 动态模式-文档模型支持可变的数据模式,不要求每个文档都具有完全相同的结构。对很多异构数据场景支持非常好;
  • 模型自然-文档模型最接近于我们熟悉的对象模型。从内存到存储,无需经过ORM的双向转换,性能上和理解上都很自然易懂。

MongoDB 模式设计进阶案例_页面_05

那么我们如何考虑MongoDB 文档模式设计的基本策略呢?

  • 其实很简单,我们一般建议的是先考虑内嵌, 直接按照你的对象模型来设计你的数据模型。如果你的对象模型数量不多,关系不是很复杂,那么恭喜你,可能直接一种对象对应一个集合就可以了。
  • 内嵌是文档模型的特色,可以充分利用MongoDB的富文档功能来享受我们刚才谈到的一些文档模型的性能和扩展性等特性。一般的一对一、一对多关系,比如说一个人多个地址多个电话等等都可以放在一个文档里用内嵌来完成。
  • 但是有一些时候,使用引用则难以避免。比如说, 一个明星的博客可能有几十万或者几百万的回复,这个时候如果把comments放到一个数组里,可能会超出16M的限制。这个时候你可以考虑使用引用的方式,在主表里存储一个id值,指向另一个表中的 id 值。使用引用要注意的就是:从性能上讲,一般我们可能需要两次以上才能把需要的数据取回来。更加重要的是:需要把数据存放到两个集合里,但是目前为止MongoDB并不支持跨表的事务性,所以对于强事务的应用场景要谨慎使用。

MongoDB 模式设计进阶案例_页面_06

很多时候我们并不能很好地回答自己的问题,包括刚才的内嵌还是引用的问题。那么这个时候有必要了解一下,MongoDB模式设计的终极原则。MongoDB的模式设计和关系型大不相同,我们说MongoDB是为应用程序设计的,而不是为了存储优化的。如果可以达到最高性能的话,我们甚至可以做一些反范式的东西。 接下来我们来看几个比较具体的设计案例,了解一下MongoDB的模式设计思路:

MongoDB 模式设计进阶案例_页面_07

我这里准备了4个比较经典的MongoDB案例,从CMS 内容管理到电商,社交到物联网。 由于时间原因我就从第二个开始。

MongoDB 模式设计进阶案例_页面_08

在电商方面MongoDB的应用场景其实蛮多,比如说,大名鼎鼎的京东用mongo来存储过亿的商品信息,另外有一家著名的境外电商从头到尾用的都是MongoDB,包括订单管理等。这里我们就来看一下购物车这个场景。购物车的特点就是单个购物车数据项不会太大,一般来说不会超过100项目。双十一的时候淘宝的购物车里最多就只能放99件商品。在这里我要谢谢我的太太,是她让我知道了这个限制。另外一点就是购物车的数据可能需要过期删除。

MongoDB 模式设计进阶案例_页面_09

我们说文档模型在这种场景会是个很好的选择:

MongoDB 模式设计进阶案例_页面_10

大家看一下下面的参考数据模型,第一点注意我们可以使用MongoDB的TTL 索引来自动清理过期数据。TTL索引可以建立在任意一个时间字段上,在建立索引的时候可以指定文档在过多少时间后会被自动清理掉。第二个大家注意的是什么呢?在这里我们把商品的一些主要信息放到购物车里了,比如说 name,price, quantity,为什么? 读一次所有信息都拿到了:价格、数量等等,不需要再去查另一张表。这是一种比较常见的优化手段,用冗余的方式来提供读取性能。

MongoDB 模式设计进阶案例_页面_11

接下来我们看一下使用这种模式的时候如何进行一些购物车的操作。比如说,如果我们想要往购物车里增加一个价值2元的面包,我们可以用下面的update语句。注意$push的用法。$push 类似于javascript的操作符,意思是往数组尾部增加一个元素。

MongoDB 模式设计进阶案例_页面_12

如果需要更新购物车中某个产品的数量,你可以用update语句直接操作数组的某一个元素。在这里我们需要做的是更新item 4567的数量为5。 注意 items.$.quanity的使用,这里的$ 表示在查询条件里匹配上的数组元素的序数。

MongoDB 模式设计进阶案例_页面_13

如果需要统计一下在购物车内某个商品的总数,可以使用MongoDB的聚合功能。聚合运算在MongoDB里面是对数据输入源进行一系列的运算。在这里我们做的就是几个步骤是:

  1. $match: 在所有购物车中过滤掉其他商品,只选出id是8910的商品
  2. $unwind: 把items 数组展开,每个数组元素变成一个文档
  3. $group: 用聚合运算 $sum 把每一件商品的数量相加获得总和

MongoDB 模式设计进阶案例_页面_14

下面我们来看一个社交网络的例子。社交app最关键的一些场景就是维护朋友关系以及朋友圈或微博墙等。

MongoDB 模式设计进阶案例_页面_15

对于关系描述,使用文档模型的内嵌数组特性,我们可以很容易地把我关注的用户(following)和关注我的用户表示出来。下例表示TJ我的关注的用户是mandy和bert,而oscar和mandy则在关注我。这种模式是文档模型中最经典的。但是有一个潜在问题就是如果TJ我是一个明星,他们关注我的人可能有千万。一个千万级的数组会有两个问题:1) 有可能超出一个文档最大16M的硬性限制; 2) MongoDB数组太大会严重影响性能。

MongoDB 模式设计进阶案例_页面_16

怎么办?我们可以建立一个专门的集合来描述关注关系。这里就是一个内嵌和引用的经典选择。我们希望用内嵌,但是如果数组维度太大,就需要考虑用另外一个集合的方式来表示一对多的关系(用户 1–N 关注者)

MongoDB 模式设计进阶案例_页面_17

另外一个要注意的是关注数,我们在显示关注和粉丝数量的时候,不希望去跑一次count 查询再显示。因为count操作一般来说会比较占资源。通常的做法可以再用户对象里面加两个字段,一个是关注数一个是粉丝数。每次有人关注或者关注别人时候就更新一下。

MongoDB 模式设计进阶案例_页面_18

下面我们来看看比较有趣的微博墙,或者微信朋友圈的实现有什么考量。

MongoDB 模式设计进阶案例_页面_19

在实现微博墙的时候,有两种方式可以考虑:扇出读 或者是扇出写。

MongoDB 模式设计进阶案例_页面_20

扇出读、扇出写的说法是基于社交网络的海量用户、海量数据的应用特征。这些大量的数据往往分布在各个分片服务器上。扇出读是一种比较常规的做法,就是当你需要去获得所有你关注用户的最新更新的时候,你就去到每一个你关注用户的数据区,把最新的一些数据取回来。因为需要去到不同的分片服务器去取,所以叫做扇出读。大家可以想象,这种扇出读的效率不会太高,基本上是最慢的那个服务器的响应时间决定了总体的响应时间。 当然,这种方式是比较简单的,不需要特殊处理。

MongoDB 模式设计进阶案例_页面_21

扇出写,我称之为土豪玩法。具体来说就是当发布的时候,一条数据会写多次,直接写到每一个关注你的粉丝的墙上。这样做的好处是当你的粉丝读他自己的微博墙的时候,他只需要去一个地方就可以把所有最新的更新连续取回来。由于一个用户的数据可一般可以存储在同一台服务器上的同一个区域,通过这种方式可以实现快速的读取微博墙数据。 代价当然也是很明显: 你的写入需求会被放大几十几百倍,存储也是相应的扩大几十几百倍。这个绝对不是关系型数据库的玩法,但是在MongoD 模式设计,这个很正常。只要保证性能,什么事情都做得出来。

MongoDB 模式设计进阶案例_页面_22

MongoDB 模式设计进阶案例_页面_23

下面这个例子,首先是mandy在发消息的时候会写(push)到我的墙上(timeline)来。如果mandy有50个关注者,那么这个写就会有50次,每个关注者一次。

第二条语句就是我打开微博的时候,一条语句,一个地方就可以找到所有我朋友发的状态更新。注意:这里还使用了bucket,这是另外一个控制文档内数组元素个数的有效方法。比如说我们定义bucket 大小是1000的话,超过1000 就把新的数据插入到下一个文档并对bucket 序数递增。

MongoDB 模式设计进阶案例_页面_24

好了,最后我们来看一下物联网的应用场景:

MongoDB 模式设计进阶案例_页面_25

各位还有多少人仍然记得MH370,去年在印度洋消失的客机?在该事故之后,许多人都在疑惑:在当今的技术水平下,为什么我们不能跟踪如此庞大的一个东西?

MongoDB 模式设计进阶案例_页面_26

让我们来看看如果要监控飞机数据有什么样的挑战。飞机上面的数据源众多,光收集位置信息,就需要多个系统协作完成, 如ADS-C, EUROCONTROL等等。此外,收集的数据也是各种各样:位置是2D、速度是数值、引擎参数则是多维度的。

MongoDB 模式设计进阶案例_页面_27

另一个挑战就是海量数据。一个三小时的航班,每分钟采集一次,少说点,每次100条数据,那就是每秒1万8千个数据点。按每天100,000航班,一天的数据算下来有18亿条,1.8TB 左右的数据, 21,000 的QPS。 从哪个角度来看,这都是个经典的大数据问题。

MongoDB 模式设计进阶案例_页面_28

这个问题在关系型数据库解决的话,比较幼稚的方法就是设计一个超宽的表。所有需要采集的每一个值就是一个列。这种设计的问题比较明显:

  1. 容易造成空白浪费,不是每一条记录都包含所有字段值
  2. 可能会经常需要改数据库模式。对于海量数据,改一次模式代价巨大。

MongoDB 模式设计进阶案例_页面_29

另一种改良方案是用EAV 设计模式。就是采用一个主表和一个属性值表。在属性值表里存放所有的参数键值对。这样做的好处自然是灵活性:增加新的参数时无需修改模式。但是问题同样存在:用来存储值的那列METRIC_VALUE的字节大小必须定义成所有值的最大值 才可以放下所有的参数值。这个可能带来空间浪费,但是更严重的问题是:将不太可能在此字段上建索引,进而影响一些场景的使用。

MongoDB 模式设计进阶案例_页面_30

下面我们来看看文档模型怎么做: 这里对于location 、speed 等不同数据类型的字段,在文档模型下可以直接支持。下面的两个文档,第一个文档和第二个文档可以同属一个集合,但是可以有完全不同的字段。 MongoDB对异构数据的支持在这样的场景下有得天独厚的优势。如果我们希望对某一个metric如location建立索引,我们也可以使用mongoDB的稀疏索引 (Sparse Index)仅对有location字段的文档建索引,在不造成索引空间浪费的前提下提高检索效率。当需要增加新的字段的时候,也不需要对模式做任何修改,可以直接就在应用中的JSON模型里添加需要的字段(elevation)。

MongoDB 模式设计进阶案例_页面_31

在IOT这个场景里,我们可以使用一个叫做分桶的设计方式来进行几十倍的性能增长。具体来说就是把采集的数据按小时为一个桶,把每小时的数据聚合到一个文档里。如下面所示,每分钟的值用子文档的一个字段来表示。这样做的好处就是大量减少文档的数量,相应的索引数量也会减少,总体写入IO将会大幅度降低并得到性能提升。

MongoDB 模式设计进阶案例_页面_32

 

使用这种方式我们还可以把一些统计需要的数值,如每小时的平均值预先就作为一个字段存进去,需要的时候不用现场计算,只要从文档里读出来即可。

MongoDB 模式设计进阶案例_页面_33

MongoDB 模式设计进阶案例_页面_34

小结一下,冗余、扇出写、分桶,这些都是mongodb 的一些常用优化手段。 大家可以看到,通过减少额外查询或者关联的需求,通过使用冗余、额外存储的非常规方式,我们希望做到的是性能上的最高提升。

MongoDB 模式设计进阶案例_页面_35

MongoDB 中国团队正在扩张中。希望和一流的、创新的数据库团队一起工作吗?加入我们吧,我们在寻找有开发架构或者数据库相关经验的大牛们加入我们的技术顾问阵营。有兴趣?加微信 tjtang826 私聊吧!


MongoDB表的设计 Shardingkey的一些烦恼; 单一key可能导致分布不均匀; 使用符合ShardingKEY 复合shardingkey也不是万能的; Count计算性不准确; Balancer不够智能,时间不确定; 立即下载

相关推荐

QGIS|如何将WGS84转换为CGCS 2000坐标系?

QGIS 3中如何将WGS84转换为国家2000大地坐标系? 今天来回答一位朋友在后台留言提出的问题:怎么将WGS84坐标转换为国家2000大地坐标系。 01工程坐标系 从地图窗口右下角的状态栏可以看到当前地图窗口的坐标系,即工程坐标系(Project CRS)。当前地图可以由多个图层组成,各种来源数据的坐标参照系(Layer CRS)并不一定相同,QGIS在绘制图层之前将根据工程坐标系进行动态坐标转换,然后显示在地图画布中。 因此,在处理空间数据的过程中,一定要特别注意...

QGISClass的博客 1万+

MongoDB 进阶模式设计

http://www.mongoing.com/mongodb-advanced-pattern-design 今天的话题是进阶模式,所以我假设在坐各位至少是已经对MongoDB有了一些基本的了解。 不过每次总有一些同学以为这里有水果吃才坐进来的,所以在这里我简单介绍一下:MongoDB 不是芒果(mango),它在拉丁文中的原意是巨大的意思。如果用一句话来概括的话,mongo是一个高可

1896

值得苦练的100道Python经典练手题(全网最全,附详细答案,建议收藏)

这100道Python练习题涵盖了从基础语法到高级算法、从数据库操作到Web开发的各个方面,是备考数据库系统工程师的绝佳素材。建议按照章节顺序逐一练习,遇到难点可反复钻研,真正掌握每一道题背后的知识点。通过这些练习,不仅能提升Python编程能力,还能加深对数据库系统原理的理解,为考试和实际工作打下坚实基础。

yue_yun_的博客 9396

MongoDB数据库设计法则

By William Zola, Lead Technical Support Engineer at MongoDB “我有丰富的sql使用经验,但是我是个MongoDB的初学者。我应该如何在MongoDB中针对一对多关系进行建模?”这是我被问及最多的问题之一。 我没法简单的给出答案,因为这有很多方案去实现。接下来我会教导你如何针对一对多进行建模。 这个话题有很多内容需要讨论,

温水青蛙 4501

LAMMPS ReaxFF模拟后处理:如何用Python精准追踪C-N键的断裂与形成?

本文详细介绍了如何利用Python对LAMMPS ReaxFF模拟结果进行后处理,精准追踪C-N键的断裂与形成过程。通过解析键级输出文件、构建原子类型映射字典,并实现C-N键的统计与可视化,为材料科学和催化反应研究提供了高效的数据分析解决方案。文章特别强调了ReaxFF力场在断键分析中的关键作用,并提供了完整的Python代码实现。

weixin_28706923的博客 356

Hive数据迁移

【迁移背景】 本次需要将老集群的hive数据(共30多张表)迁移至新集群中。 老集群版本为CDH5.13,未启用kerberos; 新集群版本为CDH5.14,启用了kerberos。 由于cloudera官方文档说明,在5.x的版本不支持从未启用kerberos的集群与启用了kerberos的集群之间的数据复制。因此无法通过bdr方式进行数据同步。于是采用手工方式进行测试验证。 第一步...

wangkuangood3200的专栏 470

MongoDB中您可以这么设计商品表

在 MongoDB 中设计商品的模型,可以使用嵌入式文档或引用关系,具体取决于你的业务需求和数据访问模式。:如果你的网站或应用程序支持用户对商品进行评价和评论,可以设计一个评价表,并在商品表中引用评价ID。使用引用关系,将商品的分类和属性分别存储为独立的文档,并在商品文档中引用它们的 ObjectId。需要注意的是,以上只是一个基本的商品表设计示例,具体的设计要根据你的业务需求和应用场景来确定。:如果你的商品需要进行分类管理,可以设计一个分类表,并在商品表中引用分类ID。

BradenHan的专栏 1594

[CTFSHOW]JWT

文章目录前言JWT简介CTFSHOW Web345CTFSHOW Web346前置知识开始做题CTFSHOW Web347CTFSHOW Web348CTFSHOW Web349CTFSHOW Web350前置知识利用WP如何防御 前言 有些师傅向我咨询WP,索性就发了吧,其实早就写好了,只是懒,在github仓库里囤着 JWT简介 可以看看我的Github总结给自己看的,Y4tacker CTFSHOW Web345 首先打开题目,查看源码,接下来访问/admin被跳转回主页啥也没有发生 where is

Y4tacker的博客 6045

MongoDB - 模式设计

同一个应用程序连接的数据库可以根据业务进行划分,也许可以将高价值的业务数据存储在 SSD 上,或者是使用 RAID10 进行存储,而低价值的数据可以存储在 RAID0 上。但是在更改时仅需修改一处地方,不需要担心破坏数据的完整性。同样的一致性问题在 MongoDB 拥有副本集时也会出现,副本节点的数据与主节点的数据总是会有时间差,高并发的请求同样存在读取到旧数据的风险。设计模式时最需要关注的就是数据库的读操作,在数据库运行过程中,应尽量减少查询的数量,这就需要在设计时确保一起查询的数据存储在同一个文档中。

dz45693的专栏 1117

【SigmaStar SSC335系列】空片用Flash_Tool烧写

简介 本文主要讲新拿到的PCBA,板上spi nand flash还是空的,如何在这种情况下烧录固件,这里讲解用官方Flash_Tool烧写的方式。 但只讲一些注意的地方和坑,其它的官方文档里说的比较清楚,不多说。 准备 Flash_Tool烧写软件 编译打包好烧写镜像 串口烧录小板 ----- 这个是个坑,在官方文档里并没有提及,刚开始用的平时调试的USB转串口,怎么都没反应,一度不知烧写软件不对还是硬件有问题,最后通过厂家技术支持才得知,除了专门的Flash_Tool外,还要专门的串口烧录器

老K 4700

【Power Compiler手册】4.saif文件

功耗计算的准确性取决于切换活动数据的准确性。这些数据是通过使用RTL仿真或门级仿真生成的,并存储在SAIF文件中。在执行功耗优化和分析之前,应该使用SAIF文件来反标设计对象上的切换活动信息。SAIF是由Synopsys支持的ASCII格式,用于促进不同Synopsys工具之间的信息交换(参见IEEE 1801标准,附录J)。使用`read_saif`命令读取SAIF文件,使用`write_saif`命令写出SAIF文件。有关更多信息,请参见`read_saif`和`write_saif`命令的手册页。

QRBQ 2188

MongoDB更需要好的模式设计 及 案例赏析

从中可以看出,publisher信息描述比较多,并且都相同,每个文档中都存放,浪费太多的存储空间,显得无用臃肿,还有个明显的缺点就是 当publisher数据更新时,需要对所有的书籍文档进行刷新。例如,这里采用引用模式将员工信息存储在了3个文档中,基本信息一个文档,联系方式一个文档,登录权限放在了一个文档中。上面的文档可以查询出子文档,但是会显示出多个文档,例如上面的查询语句,会返回出MongoDB 文档和 dbm文档 ,我们还需要还特殊处理,那么可不可以在一个文档中显示出所以的子节点呢?

hongjian006的博客 1226

Android一个APP里面最少有几个线程

Android应用启动时,默认会创建一个进程,该进程中最少包含负责处理用户交互、UI更新等核心操作,所有与界面相关的逻辑必须在此线程执行。若在此线程执行耗时操作(如网络请求),会导致界面卡顿甚至触发ANR(应用无响应)。当对象重写了finalize()方法时,该线程负责将这些对象放入队列并调用其finalize()方法,完成资源释放后再由GC回收。监控的执行效率。如果finalize()方法执行超时(默认10秒),此线程会触发虚拟机退出以防止应用长时间阻塞。

编程进化论 613

MongoDB模式设计

1. 开篇 今天的话题是进阶模式,所以我假设在坐各位至少是已经对MongoDB有了一些基本的了解。 不过每次总有一些同学以为这里有水果吃才坐进来的,所以在这里我简单介绍一下:MongoDB 不是芒果(mango),它在拉丁文中的原意是巨大的意思。如果用一句话来概括的话,mongo是一个高可用、分布式、无模式的文档数据库。等一下,这里我故意用错了一个词: 不是无模式,而是“灵活模式”。 如果真的是...

傅红雪的专栏 817

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

OV9734 DATASHEET,完整规格书

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

MongoDB的设计模式策略

原文:MongoDB Design Patterns 作者: Darel Lasrado 译者:仲培艺,关注数据库领域,纠错、寻求报道或者投稿请致邮:zhongpy@youkuaiyun.com。 MongoDB是一项通用工具,但它也并非完美。针对某些MongoDB不适用的场合,有时可选用设计模式来加以应对。 MongoDB是一个NoSQL文档数据库,在大多数情况下是一个相对理想的选择,即使

凌风探梅的专栏 1403

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

MongoDB模式设计注意事项

模式设计,即在文档中表示数据的方式,对于数据表示来说是非常关键的。最好的方式是按照应用程序希望看到的形式来表示数据。因此,与关系数据库不同,在为模式进行建模之前,首先需要了解查询和数据访问的方式。以下是在设计模式时需要考虑的几个关键方面。有一些数据库或硬件的限制是你需要了解的。你还需要考虑 MongoDB 的一些特殊之处,比如最大文档大小为 16MB、从磁盘读写完整文档、更新会重写整个文档,以及在文档级别进行原子更新。你需要确定并量化应用程序和更大系统的工作负载。...

ntzzzsj的博客 537

MongoDB十二种最有效的模式设计【转】

持续关注MongoDB博客(https://www.mongodb.com/blog)的同学一定会留意到,技术大牛Daniel Coupal 和 Ken W. Alger ,从 今年 2月17 号开始,在博客上持续发表了 如何在MongoDB中设计数据库模式的方法。截止到今日(4月20号),12种模式设计的方法已全部与读者见面。本人认为,此系列文章,总结的非常全面,很多地方有首创性,涵盖的场景也很多,并且有理论总结,也有案例分析。文中分享的很多知识使人"如听仙乐耳暂明",开卷受益,常读常新。

hongjian006的博客 2589

对MongoDB设计模式的理解和常用查询总结

欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I

Public Static Void Main 917
下一篇: MongoDB五种树形结构
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值