在MongoDB University

学习更多关于MongoDB的知识和技能

到目前为止,我们讨论的许多设计模式都强调省去JOIN操作的时间是有好处的。那些会被一起访问的数据也应该存储在一起,即便导致了一些数据重复也是可以的。像扩展引用(Extended Reference)这样的设计模式就是一个很好的例子。但是,如果要联接的数据是分层的呢?例如,你想找出从某个员工到CEO的汇报路径?MongoDB提供了$graphlookup运算符,以图的方式去浏览数据,这可能是一种解决方案。但如果需要对这种分层数据结构进行大量查询,你可能还是需要应用相同的规则,将那些会被一起访问的数据存储在一起。这里我们就可以使用树形模式。

树形模式

在以前的表格式数据库中,有许多方法可以表示一个树。最常见的是,让图中的每个节点列出其父节点,还有一种是让每个节点列出其子节点。这两种表示方式可能都需要多次访问来构建出节点链。

由父节点构建的公司架构

由子节点构建的公司架构

还有一种做法,我们可以将一个节点到层级顶部的完整路径储存起来。在本例中,我们将存储每个节点的“父节点”。这在一个表格式数据库中很可能是通过对一个父节点的列表进行编码来完成的。而在MongoDB中,可以简单地将其表示为一个数组。

如图所示,在这种表示中会有一些重复数据。如果信息是相对静态的,比如在家谱中你的父母和祖先是不变的,从而使这个数组易于管理。然而,在我们的公司架构示例中,当变化发生并且架构进行重组时,你需要根据需要更新层次结构。与不用每次计算树所带来的好处相比,这仍然是一个很小的成本。

应用场景示例

产品目录是另一个使用树形模式的好例子。产品通常属于某个类别,而这个类别是其它类别的一部分。例如,一个固态硬盘(Solid State Drive)可能位于硬盘驱动器(Hard Drives)下,而硬盘驱动器又属于存储(Storage)类别,存储又在计算机配件(Computer Parts)下。这些类别的组织方式可能偶尔会改变,但不会太频繁。

注意在上面这个文档中的ancestor_categories字段跟踪了整个层次结构。我们还使用了一个字段parent_category。在这两个字段中重复储存直接父级节点是我们与许多客户合作后发现的使用树形模式的一种最佳实践。包含“parent”字段通常很方便,特别是当你需要保留在文档上使用$graphLookup的能力时。

将祖先节点保存在数组中可以提供对这些值创建多键索引(multi-key index)的能力。这允许轻松找到给定类别的所有子代。至于直接子代,可以通过查看将给定类别作为其直接“父母”的文档来访问。我们刚刚说过有这个字段会很方便。

结论

在使用对于许多模式时,通常需要在易用性和性能之间进行权衡。对于树形模式来说,它通过避免多次连接操作可以获得更好的性能,但是你需要自己管理图的更新。

本系列的下一篇文章将介绍预分配模式(Pre-Allocation Pattern)。

往期回顾

利用模式进行构建第一讲——多态模式

利用模式进行构建第二讲——属性模式

利用模式进行构建第三讲——桶模式

利用模式进行构建第四讲——异常值模式

利用模式进行构建第五讲——计算模式

利用模式进行构建第六讲——子集模式

利用模式进行构建第七讲——扩展引用模式

利用模式进行构建第八讲——近似值模式

译者:牟天垒

MongoDB数据库

MongoDB官方微信公众号

扫描关注,获取更多精彩内容

长按二维码关注我们

如果您有任何问题,欢迎留言!

转载于:https://my.oschina.net/mongodbchina/blog/3083250

利用模式进行构建第九讲——树形模式相关推荐

  1. 【设计模式】组合模式?建议改名叫树形模式!

    什么是组合模式(Composite) 概念 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及 ...

  2. 利用模式进行构建第八讲——近似值模式

    在MongoDB University 学习更多关于MongoDB的知识和技能 假设现在有一个相当规模的城市,大约有3.9万人.人口的确切数字是相当不稳定的,人们会搬入搬出.有婴儿会出生.有人会死亡. ...

  3. json api_JSON模式在构建和部署API中的作用

    json api 什么是JSON模式 ? 它提供了一种描述任何JSON值的结构和属性的彻底方法. 在记录对任何JSON API的请求和响应时,它非常有用. 本文将探讨其在API的软件开发周期中的作用. ...

  4. JSON模式在构建和部署API中的作用

    什么是JSON模式 ? 它提供了描述任何JSON值的结构和属性的详尽方法. 在记录对任何JSON API的请求和响应时,它非常有用. 本文将探讨其在API的软件开发周期中的作用. 记录JSON响应格式 ...

  5. 设计模式心得1(工厂模式+单例模式+构建器模式+原型模式+适配器模式)

    设计模式分类 大致按照模式的应用目标分类,设计模式可以分为创建型模式.结构型模式和行为型模式. 创建型模式,是对对象创建过程的各种问题和解决方案的总结,包括各种工厂模式(Factory.Abstrac ...

  6. 利用 GPU 加速人工智能:新型计算模式

    纽约大学本周有一场探讨 "人工智能的未来" 的年度座谈会,Yann LeCun 邀请NVIDIA 联合创始人兼首席执行官黄仁勋 (Jen-Hsun Huang)先生在座谈会上发言. ...

  7. 字符模式下构建、使用KVM虚拟化平台

    字符模式下构建.使用KVM虚拟化平台 环境准备: KVM虚拟化服务器(真机或高配虚拟机(内存>4G) 操作系统:CentOS 6.5   ==> 关闭 iptables 防火墙.关闭SEL ...

  8. 设计模式----创建型设计模式(单例模式、工厂方法模式、构建者模式)

    创建型设计模式 单例模式(Singleton Pattern) 单例模式介绍 代码演示 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全, ...

  9. QT 在release 模式下构建项目使用断点调试

    pro文件内 # release断点测试 QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO QMAKE_LFLAGS_REL ...

  10. 设计模式-Builder模式(构建者模式)

    目录 构建者模式是什么? 为什么要用构建者模式? 构建者模式是什么? 简单来说,就是用于组装具有复杂结构的实例的模式. 什么意思呢?先来看个例子,比如现在有一个类TextBuilder用来创建一个文本 ...

最新文章

  1. UVA - 10048 Audiophobia(Floyd求路径上最大值的最小)
  2. Form 中FND_Message的用法总结
  3. 【控制】能量函数Graph Laplacian Potential and Lyapunov Functions for Multi-Agent Systems
  4. Spring入门介绍:
  5. php限制一个函数在几分钟内不被调用_在PHP一句话木马使用过程中的种种坑点分析...
  6. php代码审计步骤,php代码审计(一)-----调试函数
  7. 渗透测试之Nmap命令(一)
  8. 操作集合的工具类Collections
  9. 以色列政府网站遭史上规模最大的DDoS 攻击
  10. (转)Scala中的Some和Option
  11. 大地测量学基础 (复习)
  12. ai的布尔运算在哪_在AI中如何进行布尔运算
  13. php博客视频教程,ThinkPHP5 博客项目实战视频教程
  14. 某电商App 返回数据加密解密分析(四)
  15. 计算机office二级app,计算机二级office
  16. 手机音视频应用开发前景
  17. Linux 2.6内核配置说明(7----Bus options (PCI, PCMCIA, EISA, MCA, ISA)总线选项)
  18. Linux PM_QoS介绍
  19. 电脑初学者所需软件及网站
  20. Codeforces Roun d #621 (Div. 1 + Div. 2) D. Cow and Fields 最短路+贪心 图上特殊点加边使最短路最大

热门文章

  1. Anaconda 踩过的一些坑
  2. labview 编程样式_LabVIEW编程样式规则
  3. 9.Makefile隐含规则
  4. docker push received unexpected HTTP status: 503 Service Unavailable
  5. com.thoughtworks.xstream.security.ForbiddenClassException com.thoughtworks.xstream 1.4.18
  6. 蚂蚁金服入职考试_我是如何拿到蚂蚁金服实习 offer 的
  7. SAD算法的OpenCV实现
  8. Let's encrypt 通配域名(二级, 三级)
  9. 带你深入了解 DNS 解析原理-递归与迭代
  10. WinRAR下载官方免费版