DDIA文档型和关系型 工厂模式总结

简介: 【6月更文挑战第9天】文档型数据库在全量访问时效率高,但部分字段访问仍需加载全文档。不同数据库通过特定方式优化,如Spanner的嵌入式表,HBase和Cassandra的列族,图数据库的点边集中。关系型与文档型融合,如MySQL、PostgreSQL的JSON支持和RethinkDB的relational-link Joins。复杂对象创建可采用工厂模式,封装变化、复用代码、隔离和控制复杂度。简单场景下直接用`new`关键字即可。

查询时的数据局限性

如果你同时需要文档中所有内容,把文档顺序存储,访问效率比较高。

但是如果你只需要访问文档中的某些字段,则文档仍需要将文档全部加载出。但是运用这种局限性不局限于文档型数据库。不同的数据库,会针对不同场景,调整数据物理分布以适用常用访问模式的局限性。

  • Spanner 中允许表被声明为嵌入到父表中——常用关联内嵌(获得类似文档模型的结构)
  • HBase 和 Cassandra 使用列族来聚集数据——分析型
  • 图数据库中,将点和出边存在一个机器上——图遍历

关系型和文档型的融合

  • MySQL 和 PostgreSQL 开始支持 JSON 原生支持 JSON 可以理解为,MySQL 可以理解 JSON 类型。如 Date 这种复杂格式一样,可以让某个字段为 JSON 类型、可以修改 Join 字段的某个属性、可以在 Json 字段中某个属性建立索引。
  • RethinkDB 在查询中支持 relational-link Joins

科德(Codd):nonsimple domains,记录中的值除了简单类型(数字、字符串),还可以一个嵌套关系(表)。这很像 SQL 对 XML、JSON 的支持。

总结

当创建逻辑比较复杂,是一个大工程的时候,考虑使用工厂模式,封装对象的创建过程,将对象的创建和使用分离。

什么情况是创建逻辑比较复杂呢?

  1. 类似规则配置解析的例子,代码里存在if-else判断,动态的根据不同的类型创建不同的对象。

  2. 单个对象本身的创建过程比较复杂,比如要组合其他类对象,做各种初始化操作。

对于情况1,当每个对象的创建逻辑都比较简单,推荐使用简单工厂模式,将多个对象的创建逻辑放到一个工厂类里,当每个对象的创建逻辑都比较复杂的时候,为了避免设计一个庞大的简单工厂类,推荐使用工厂方法模式,将创建逻辑拆分的更细,每个对象的创建逻辑独立到各自的工厂类里。

对于情况2, 因为单个对象本身的创建逻辑比较复杂,推荐使用工厂方法模式。

对于其他情况,如果创建对象的逻辑并不复杂,直接通过new来创建对象就可以了,不需要使用工厂模式。

现在,我们上升一个思维层面来看工厂模式,它的作用无外乎下面这四个。这也是判断要不要使用工厂模式的最本质的参考标准。

封装变化: 创建逻辑有可能变化,封装成工厂类之后,创建逻辑的变更对调用者透明。

代码复用: 创建代码抽离到独立的工厂类之后可以复用。

隔离复杂性: 封装复杂的创建逻辑,调用者无需了解如何创建对象。

控制复杂度: 将创建代码抽离出来,让原本的函数或类职责更单一,代码更简洁。

目录
相关文章
|
数据采集 数据库 C++
python并发编程:并发编程中是选择多线程呢?还是多进程呢?还是多协程呢?
python并发编程:并发编程中是选择多线程呢?还是多进程呢?还是多协程呢?
411 0
|
11月前
|
存储 人工智能 编译器
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
720 10
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
前端开发 JavaScript 开发工具
Vite 4.0 发布,下一代的前端工具链
【10月更文挑战第21天】Vite 4.0 的发布标志着前端开发领域的又一次重要进步。它为开发者带来了更高效、更智能、更具创新性的开发体验,正逐渐成为下一代前端工具链的引领者。
374 61
|
机器学习/深度学习 人工智能 自然语言处理
医疗行业的语音识别技术解析:AI多模态能力平台的应用与架构
AI多模态能力平台通过语音识别技术,实现实时转录医患对话,自动生成结构化数据,提高医疗效率。平台具备强大的环境降噪、语音分离及自然语言处理能力,支持与医院系统无缝集成,广泛应用于门诊记录、多学科会诊和急诊场景,显著提升工作效率和数据准确性。
934 4
|
存储 搜索推荐 Java
使用Java构建高效的搜索引擎索引
使用Java构建高效的搜索引擎索引
|
网络协议 NoSQL API
深入理解 RDMA 的软硬件交互机制
本文深入分析了RDMA技术在数据中心高性能网络环境下的工作原理及软硬件交互机制,通过对比传统Kernel TCP,突出了RDMA在减少延迟、提高系统性能方面的优势,同时讨论了其在内存管理、软硬交互方面的关键技术和挑战,为读者提供了全面理解RDMA技术及其应用场景的视角。
|
运维 监控 Linux
提升系统稳定性:Linux内核参数调优实战
【5月更文挑战第1天】 在运维领域,保障服务器的高效稳定运行是核心任务之一。Linux操作系统因其开源、可靠和灵活的特点被广泛应用于服务器中。本文将深入探讨通过调整Linux内核参数来优化系统性能,提升服务器的稳定性和响应能力。文章首先介绍了内核参数调优的必要性和基本原则,然后详细阐述了调优过程中的关键步骤,包括如何监控当前系统状态,确定性能瓶颈,选择合适的参数进行调优,以及调优后的测试与验证。最后,文中提供了一些常见问题的解决策略和调优的最佳实践。
896 5
|
Java Maven 微服务
【工程】-一文带你使用Gradle构建SpringBoot微服务项目
【工程】-一文带你使用Gradle构建SpringBoot微服务项目
2366 0
【工程】-一文带你使用Gradle构建SpringBoot微服务项目
|
NoSQL Redis
【Redis源码】Redis命令INCR、DECR、INCRBY、DECRBY学习(二)
【Redis源码】Redis命令INCR、DECR、INCRBY、DECRBY学习(二)
669 0
|
JSON JavaScript API
vue3+TypeScript使用二次封装的axiosAPI
vue3+TypeScript使用二次封装的axiosAPI