当前位置: 首页 > ops >正文

利用模式进行构建第九讲——树形模式

在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官方微信公众号


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

长按二维码关注我们


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




http://www.xdnf.cn/news/11496.html

相关文章:

  • 在html中include一个文件内容的几种方法
  • 计算机网络 day14 DNS域名劫持、DNS域名污染 - CDN的工作流程 - DNS的记录类型 - 搭建DNS缓存/主域名服务器 - DNAT-SNAT实验项目
  • Python爬取熊猫TV 英雄联盟游戏分类下面所有主播的人气排行
  • 如何用MATLAB实现静态反馈控制
  • PKIX path building failed的问题分析
  • 各种软件版本号扫盲——Beta RC Preview release等
  • 倒计时 7 天 | 立即加入 GDE 成长计划,飞跃成为谷歌开发者专家
  • 机器学习-各分类模型优缺点(持续更新)
  • DVD转RMVB及DVD转AVI相关教程
  • Objective-C 编程语言官网文档(一)-简介
  • 看程序员如何给女朋友解释什么是锟斤拷?
  • 同一个局域网下访问电脑本地的localhost网址
  • 什么是网口温湿度传感器?什么是以太网温湿度传感器?
  • KVM+GFS分布式存储系统构建KVM高可用
  • python基础,黑马最新配套视频笔记
  • 气体管道管径及流量对照表_De、DN、D、d怎么搞懂他们?附管径与阀门通径对照表...
  • Android4.0 SDK新功能详解
  • MyEclipse 7.0下载 + 汉化 + doc汉化
  • 手机游戏无障碍设计——猜地鼠之Android篇
  • 从0到1手把手教你搭建个人博客
  • 油动无人机的优点有哪些?油动多旋翼无人机的优缺点及前景分析
  • 实践是检验真理的唯一标准!!交换机VLAN相关配置案例!
  • 腾讯应用宝Android 应用加固(乐固)操作说明(转)
  • 光盘如何重装系统教程
  • 个人怎么申请支付接口平台(教程)
  • 基于微信小程序的智能停车场管理系统的设计与实现
  • 推荐几款2024年最新开源API测试工具!
  • HTTP代理神器Fiddler
  • 三种经典“返回顶部”效果的代码
  • Web安全 EmpireCMS漏洞常见漏洞分析及复现(1)