数据密集型应用系统设计(2)

2023-11-20

数据模型与查询语言

大多数应用程序是通过一层层叠加数据模型来构建的。例如:

  1. 应用程序开发人员观测现实世界,通过对象或者数据结构,以及操作这些数据结构的API对其建模。这些数据结构往往特定于该应用。
  2. 当需要存储这些数据结构时,可以采用通用数据模型(例如JSON或者XML文档、关系数据库中的表或者图)来表示。
  3. 数据库工程师接着决定用何种内存、磁盘或者网络的字节格式来表示上述JSON/XML/关系/图形数据。数据表示需要支持多种方式的查询、搜索、操作和处理数据。
  4. 在更下一层,硬件工程师需要考虑电流、光脉冲、磁场等表示字节。

NoSQL

直到现在,关系数据库依然支撑这互联网上的大多数内容,例如在线发布、论坛、社交网络、电子商务、游戏、SaaS等。

NoSQL数据库的驱动因素有:

  1. 比关系数据库更好的扩展性需求,例如支持超大数据集或者超高写入吞吐量
  2. 支持免费和开源软件
  3. 关系模型不能很好地支持一些特定的查询操作
  4. 对关系模型一些限制性感到沮丧,渴望更具有动态和表达力的数据模型

所谓混合持久化指的是将关系数据库和各类非关系数据库一起使用。

数据库历史

一些开发人员认为JSON模型减少了应用程序代码和存储层的阻抗失配,具有更好的局部性。

即使应用程序的初始版本非常适合采用无联结的文档模型,比如简历,随着应用支持越来越多的功能,数据也变得更加互联一体化。

最早的数据库采用的是层次模型,类似于文档数据库中的JSON模型,将所有的数据表示为嵌套的树,可以很好地支持一对多关系,但是支持多对多关系困难,而且不支持联结。

网络模型是层次模型的推广。在网络模型中,一个记录可能有多个父结点。记录之间的链接类似于指针,访问记录的唯一方式是选择一条始于根记录的路径,沿着相关链接依次访问。带来的问题是查询和更新数据库变得非常复杂且不灵活,修改访问路径非常困难且麻烦。

关系模型的一个核心要点是只需要构建一次查询优化器,然后所有使用该数据库的应用程序都可以从中获益。查询优化器自动决定了以何种顺序执行查询,以及使用哪些索引,实际上等价访问路径。

关系数据库与文档数据库现状

文档数据库具有模式灵活性,由于局部性带来较好的性能,对于某些应用来说,更接近应用程序所使用的数据结构。关系模型抢在联结操作,多对一和多对多关系表达简洁。

文档数据库的模式灵活性
模式灵活性有时被称作无模式,但是具有误导性,因为读数据的代码通常采用某种结构所以存在某种隐形模式,而不是由数据库强制执行。更准确的术语是读时模式(数据的结构是隐式的,只有在读取时才解释),与写时模式(关系数据库的传统方法之一,模式是显示的,数据库确保写入时必须遵守)对应。

查询的数据局部性
局部性优势适用需要同时访问文档大部份内容的场景。因此建议文档尽量小且避免写入时增加文档的大小。

融合
随着时间推移,关系数据库和文档数据库变得越来越接近或许代表数据模型可以互相补充。例如MySQL支持JSON,大多数关系数据库(除了MySQL)支持XML。

数据查询语言

SQL查询、Web查询:略

MapReduce查询
MapReduce是一种编程模型,用于在许多机器上批量处理海量数据。一些NoSQL存储系统支持有限的MapReduce方式在大量文档上执行只读查询。
MapReduce是一个介于声明式查询语言和命令式查询API之间的查询方式。它主要基于许多函数编程语言中的map和reduce函数。

例子 你每看到一个海洋动物都会在数据库中添加记录,现在你想生成一份报告,来说明每个月看到多少鲨鱼。

步骤

  1. 过滤器声明式指定鲨鱼种类
  2. 对于每一个匹配查询的文档,都会调用一次JavaScript的map函数,并将其设置为文档对象
  3. map函数发射一个键值对,键是由年份月份组成的字符串,值代表观察的动物数量
  4. map函数发射的键值按键分组,对于相同键的所有键值对,调用reduce函数
  5. reduce函数将特定月份内所有观察到的动物数量相加
  6. 最终的输入写入到集合中

图状数据模型

适合多对多数据的建模。

小结

文档数据库的目标用例是数据来自于自包含文档,且一个文档与其他文档关联很少。
图数据库的目标用例是所有数据都有可能互相关联。

文档数据库和图数据库的共同点是它们通常不会对存储的数据强加某个模式,这可以使应用程序更容易适应不断变化的需求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据密集型应用系统设计(2) 的相关文章

随机推荐

  • 自己写的PLC编程软件,和FANUC PMC功能基本保持一致

    自己写的PLC编程软件 和FANUC PMC功能基本保持一致 下载地址 免积分 链接 pan baidu com s 162 GcF7wh SNT3McATPPmg 提取码 1234 https download csdn net down
  • 基于ShuffleNetv2-YOLOv4模型的目标检测

    目录 1 引言 摘要 1 1 说明 1 2替换完成的工程请参考gitee 2 网络结构基础 2 1YOLOv3 2 1 YOLOv4算法 2 3 ShuffleNetv2 2 4 替换后的网络结构 3 实验结果 3 1实验环境配置及数据集介
  • 时间复杂度+常见复杂度解释

    前言 算法的效率 虽然计算机能快速的完成运算处理 但实际上 它也需要根据输入数据的大小和算法效率来消耗一定的处理器资源 要想编写出能高效运行的程序 我们就需要考虑到算法的效率 算法的效率主要由以下两个复杂度来评估 时间复杂度 评估执行程序所
  • Vue long精度丢失问题

    原因 vue前端对long类型的精度无法接收 javascript 的 Number 类型最大长度是17位 mysql 使用bigint 类型长度是20位 前端解决方法 在全局的网络请求 用了一个处理数据的插件 来转换 后端解决的方法 Co
  • 网络安全不可忽视!企业如何做好网络安全。

    随着互联网的高速发展 其面临的安全隐患也暴露无疑 比如网络攻击 黑客入侵等 都会严重影响到网络业务的运行 为此很多企业都绞尽脑汁寻找抵御各类网络安全隐患 国家也出台了相关的等保方案让企业能够免于后顾之忧 下面我们来说说目前网络安全的具体内容
  • android音视频!BAT大厂面试基础题集合,不吃透都对不起自己

    前言 现在已经进入招聘季节 本篇文章旨在分享知名互联网企业面试官面试方法和心得 希望通过本文的阅读能给程序员带来不一样的面试体验和感受 放松面试心态 积极备战 找到正确的学习路线 一 架构师专题 想要掌握复杂的技术 必须要理解其原理和架构
  • ROS学习笔记(二)文件系统

    ROS学习笔记 二 文件系统 开篇 ROS的文件系统结构 要学会建立一个ROS工程 首先要认识一个ROS工程 了解它们的组织架构 从根本上熟悉ROS项目的组织形式 了解各个文件的功能和作用 才能正确的进行开发和编程 本章的主要内容有 介绍c
  • 就现在!为元宇宙和Web3对互联网的改造做准备!

    欢迎来到Hubbleverse 关注我们 关注宇宙新鲜事 预计阅读时长 8分钟 本文仅代表作者个人观点 不代表平台意见 不构成投资建议 如今 互联网是各种不同的网站 应用程序和平台的集合 由于彼此分离 它们缺乏互操作性和数据可移植性 因此
  • ant design vue中menu组件递归渲染报错解决

    ant design vue中menu组件递归渲染报错 开始递归组件后打开页面后报错如下 解决如下 使 单 件 式递归 成菜单 Before v2 0 因组件内部会动态更改a sub menu的属性 如果拆分单文件 无法将属性挂载到a su
  • BI的需求调研的方法分类

    今天看到一篇文章 里面提到需求调研的几种思路 觉得分类有些道理 结合项目写一下 这种方法论在指导实践和体现专业两个方面都很实用 1 现有报表 这个是最常用的 使用这种方法注意区别报表目的 紧急度 和数据是否适合在BI实现 细节度 为什么以前
  • Oracle统计多张表的Count数的和

    需求描述 Table1 job1 job1 id name status other column 1 file1 process 2 file2 failed 3 file3 success Table2 job2 job2 id nam
  • 03:MYSQL----DQL,聚合函数

    目录 1 介绍 2 语法 3 聚合函数 4 DOL 语句练习 5 SQL执行顺序 1 介绍 数据查询语言 用来查询数据库中表的记录 2 语法 select 字段列表 from 表名列表 where 条件列表 group by 分组字段列表
  • 手写 git hooks 脚本

    我们的 Git 仓库中包含了编译后的代码 所以每次修改了源码 都需要运行一下编译命令 然后把源码和编译后的代码一起提交到 Git 仓库 这个流程没什么问题 但是 人脑不是电脑 总会有疏忽的时候 经常会出现这样一种情况 修改了源码 却忘记了运
  • sql判断字段是否为null,是否为空串

    问题现象 今天在项目中思考了一个问题 如何在sql中判断一个字段是否为 null值 是否为 空串 呢 问题分析 需要注意的是 null值 和 空串 并不是同一个概念 null值 就是这个字段没有赋值 也就是java中常说的 null 而 空
  • 权重实现随机抽奖

    一般抽奖是怎么实现的 在实习期间学会了一种通用的写法 在这里记录一下 最近在学Golang语法基础 这里就用Golang来写 package main import fmt time math rand func main r rand N
  • 模态对话框与非模态对话的几种销毁方法与区别

    前几天发现自己的程序中使用非模态对话框 Debug版本有警告提示如下 Warning calling DestroyWindow in CWnd CWnd OnDestroy or PostNcDestroy in derived clas
  • 关于高并发与多线程中的线程池

    关于高并发与多线程中的线程池 定义 线程是稀缺资源 它的创建与销毁是一个相对偏重且耗资源的操作 而Java线程依赖于内核线程 创建线程需要进行操作系统状态切换 为避免资源过度消耗需要设法重用线程执行多个任务 线程池就是一个线程缓存 负责对线
  • Qt webengine 显示web页面、前后端通信以及下载详解

    概述 官方文档 https doc qt io archives qt 5 11 qtwebengine overview html 翻译文档 Qt5 9 WebEngine 概述 一花一世界 一叶一乾坤 博客园 从Qt5 5开始 Qt W
  • libuv 原理_[Nodejs原理] 核心库Libuv入门(Hello World篇)

    Libuv是什么 1 简介Libuv是一个高性能的 事件驱动的异步I O库 它本身是由C语言编写的 具有很高的可移植性 libuv封装了不同平台底层对于异步IO模型的实现 所以它还本身具备着Windows Linux都可使用的跨平台能力 L
  • 数据密集型应用系统设计(2)

    文章目录 数据模型与查询语言 NoSQL 数据库历史 关系数据库与文档数据库现状 数据查询语言 图状数据模型 小结 数据模型与查询语言 大多数应用程序是通过一层层叠加数据模型来构建的 例如 应用程序开发人员观测现实世界 通过对象或者数据结构