数据密集型应用系统设计--第2章 数据模型与查询语言
一、引言
数据模型可能是开发软件最重要的部分,而且还对如何思考待解决的问题都有深远的影响。
大多数应用程序是通过一层一层叠加数据模型来构建的。每一层都面临的关键问题是:如何将其用下一层来表示?
1.作为一名应用程序开发人员,观测现实世界(其中包括人员、组织、货物、行为、资金流动、传感器等),通过对象或数据结构,以及操作这些数据结构的API来对其建模。这些数据结构往往特定于该应用。
2.当需要存储这些数据结构时,可以采用通用数据模型(例如JSON或XML文档、关系数据库中的表或图模型)来表示。
3.数据库工程师接着决定用何种内存、磁盘或网络的字节格式来表示上述JSON/XML/关系/图形数据。数据表示需要支持多种方式的查询、搜索、操作和处理数据。
4.在更下一层,硬件工程师则需要考虑用电流、光脉冲、磁场等来表示字节。
复杂的应用程序可能会有更多的中间层,例如基于API来构建上层 API ,但是基本思想相同:每层都通过提供一个简洁的数据模型来隐藏下层的复杂性。这些抽象机制使得不同的人群可以高效协作
精通一种数据模型都需要很大功夫(试想有多少关于关系数据建模的书籍)。即使只使用一种数据模型且不用担心内部机制,构建软件也很有挑战.本章将介绍一系列用于数据存储和查询的通用数据模型.将比较关系模型、文档模型和一些基于图的数据模型
现在最著名的数据模型可能是SQL ,它基于Edgar Codd于 1970年提出的关系模型[ I]:数据被组织成关系( relations ),在SQL中称为表( table ),其中每个关系者J)是元组(tuples )的无序集合(在SQL 中称为行)。
关系数据库的核心在于商业数据处理, 20世纪60年代和70年代主要运行在大型计算机之上。从今天的角度来看,用例看起来很常见,主要是事务处理(包括输入销售和银行交易、航空公司订票、仓库库存)和批处理(例如客户发票、工资单、报告)。
二、关系模型与文档模型
如何在关系模式中表示简历,整个简历可以通过唯一的标识符 userid来标识。像first name和 lastname这样的字段在每个用户中只出现一次,所以可以将其建模为U sers表中的列。然而,大多数人在他们的职业(职位)中有一个以上的工作,并且可能有多个教育阶段和任意数量的联系信息。用户与这些项目之间存在一对多的关系,可以用多种方式来表示.
在传统的SQL模型( SQL : 1999之前)中, 最常见的规范化表示是将职位、教育和联系信息放在单独的表中 , 并二使用外键引用 users表.
之后的SQL标准增加了对结构化数据类型和XML数据的支持。这允许将多值数据存储在单行 内 ,井支持在这些文档中查询和索引。
第三个选项是将工作、教育和联系信息编码为JSON或XML文档,将其存储在数据库的文本列中,并由应用程序解释其结构和内容。对于此方峙,通常不能使用数据库查询该编码列中的值。
对于像简历这样的数据结构,它主要是一个自包含的文档( document ),因此用JSON表示非常合适, 参见示 17tl2- l 。与 XML相比, JSON的吸引力在于它更简单。 面向文档的数据库(女口MongoDB [9J 、 RethinkDB [ I OJ 、 CouchDB [IIJ和Espresso l121 )都支持该数据模型.JSON作为数据编码格式也存在问题。缺乏模式常常被认为是一个优势.
如果要在关系模式中读取一份简历,那么要么执行多个查询(通过user id查询每个表),要么在users表及其从属表之间执行混乱的多路联结。而对于ISON表示方毡,所有的相关信息都在一个地方,一次查询就够了。
如果用户界面是可以输入地区或行业的自由文本字段,则将其存储为纯文本字符串更有意义。但是,拥有地理区域和行业的标准化列表,并让用户从下拉列表或自动填充器中进行选择会更有优势.
无论是存储ID还是文本字符串,都涉及内容重复的问题。当使用 ID时,对人类有意义的信息(例如慈善这个词)只存储在一个地方,引用它的所有内容都使用ID (ID只在数据库中有意义)。当直接存储文本时,则使用它的每条记录中都保存了一份这样可读信息。
使用ID的好处是,因为它对人类没有任何直接意义,所以永远不需要直接改变:即使ID标识的信息发生了变化,它也可以保持不变。任何对人类有意义的东西都可能在将来某个时刻发生变更。如果这些信息被复制,那么所有的冗余副本也都需要更新。这会导致更多写入开销,并且存在数据不-致的风险.
数据规范化需要表达多对一的关系(许多人生活在同一地区,许多人在同一行业工作),这并不是很适合文档模型。对于关系数据库,由于支持联结操作,可以很方便地通过ID来引用其他表中的行。
如果数据库本身不支持联结,贝lj必须在应用程序代码中,通过对数据库进行多次查询来模拟联结(对于上述例子,地区和行业的列表很小且一段时间内不太可能发生变化,应用程序可以简单地将它们缓存在内存中。但无论如何,联结的工作其实从数据库转移到了应用层).
即使应用程序的初始版本非常适合采用无联结的文档模型,但随着应用支持越来越多的功能,数据也变得更加互联一体化。例如,考虑以下我们可能对简历进行的修改或扩充:
组织和学校作为实体,公司名称不是-个字符事,而星一个指向公司实体的链撞;
相比之下,关系模型所做的则是定义了所有数据的格式:关系(表)只是元组(行)的集合,仅此而已。。
数据查询语言
命令式编程语言、关系代数(其中 σ (希腊字母 σ )是选择操作构,只返回符合条件的那些动物)、sql
对于声明式查询语言(如SQL或关系代数),只需指定所需的数据模式,结果需满足什么条件,以及如何转换数据(例如,排序、分组和聚合),而不需指明如何实现这一目标。数据库系统的查询优化器会决定采用哪些索引和联结,以及用何种顺序来执行查询的各个语句。
声明式查询语言很有吸引力,它比命令式API更加简洁和容易使用。但更重要的是,它对外隐藏了数据库引擎的很多实现细节,这样数据库系统能够在不改变查询语句的情况下提高性能。
声明式语言通常适合于并行执行。现在CPU主要通过增加核,而不是通过比之前更高的时钟频率(31 ]来提升速度。而命令式代码由于指定了特定的执行顺序,很难在多核和多台机器上并行化。声明式语言则对于并行执行更为友好,它们仅指定了结果所满足的模式,而不指定如何得到结果的具体算住。所以如果可以的话,数据库都倾向于采用井行方式实现查询语言。
介绍js操作样式部分--忽略
MapReduce查询(第10章批处理系统--详细介绍)
MapR 巳 duce既不是声明式查询语言,也不是一个完全命令式的查询A凹,而是介于两者之间:查询的逻辑用代码片段来表示,这些代码片段可以被处理框架重复地调用。它主要基于许多函数式编程语言中的map(也称为collect )和reduce(也称为fold或inject)函数
图状数据模型--不深入
相关文章:
数据密集型应用系统设计--第2章 数据模型与查询语言
一、引言 数据模型可能是开发软件最重要的部分,而且还对如何思考待解决的问题都有深远的影响。 大多数应用程序是通过一层一层叠加数据模型来构建的。每一层都面临的关键问题是:如何将其用下一层来表示? 1.作为一名应用程序开发人员,观测现实…...

yolo 分割label格式标注信息图片显示可视化查看
参考: https://github.com/ultralytics/ultralytics/issues/3137 https://blog.csdn.net/weixin_42357472/article/details/135218349?spm=1001.2014.3001.5501 需要把坐标信息在图片上显示 代码 1)只画出了坐标边缘 import cv2 import numpy as np from random impor…...

霍兰德职业兴趣测试 60题(免费版)
霍兰德职业兴趣理论从兴趣的角度出发探索职业指导的问题,明确了职业兴趣的人格观念,使得人们对于职业兴趣的认识有了质的变化。在霍兰德职业兴趣理论提出来之前,职业兴趣和职业环境二者分别独立存在,正是霍兰德的总结,…...

MySQL之视图内连接、外连接、子查询
目录 一、视图 1.1 含义 2.1 视图的基本语法 二、案例 三、思维导图 一、视图 1.1 含义 虚拟表,和普通表一样使用 视图(view)是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据…...

以报时机器人为例详细介绍tracker_store和event_broker
报时机器人源码参考[1][2],本文重点介绍当 tracker_store 类型为 SQL 时,events 表的表结构以及数据是如何生成的。以及当 event_broker 类型为 SQL 时,events 表的表结构以及数据是如何生成的。 一.报时机器人启动 [3] Rasa 对话系统启动方…...
理解JavaScript事件循环机制
JavaScript作为前端开发的核心语言之一,其事件循环机制是实现异步编程的关键。本文将深入探讨JavaScript事件循环机制,帮助您更好地理解它是如何工作的,以及如何在前端开发中充分利用这一机制。 1. 什么是事件循环? JavaScript是…...

自定义View之重写onMeasure
一、重写onMeasure()来修改已有的View的尺寸 步骤: 重写 onMeasure(),并调用 super.onMeasure() 触发原先的测量用 getMeasuredWidth() 和 getMeasuredHeight() 取到之前测得的尺寸,利用这两个尺寸来计算出最终尺寸使用 setMeasuredDimensio…...

专为Mac用户设计的思维导图软件MindNode 2023 for Mac助您激发创意!
在现代快节奏的生活中,我们经常需要整理思绪、规划项目、记录灵感。而思维导图作为一种高效的思维工具,能够帮助我们更好地整理和展现思维。现在,我们介绍一款强大而直观的思维导图软件——MindNode 2023 for Mac,助您拓展思维边界…...
Linux命令——用户和权限相关
文章目录 1 用户管理1.1 用户标识符1.2 用户添加1.3 用户删除1.4 用户配置文件1.4.1 passwd文件1.4.2 shadow文件1.4.3 group文件 2 密码管理3 权限管理 1 用户管理 1.1 用户标识符 用户标识符主要是UID和GID,UID表示用户id,GID表示用户组id。在登录的…...

linux反汇编工具: ida pro、rizinorg/cutter; ubuntu 22 flameshot延迟截图 以应对下拉菜单
rizinorg/cutter rizinorg/cutter 是 命令行反汇编工具 rizinorg/rizin 的图形化界面, 这比 ida pro跑在kvm虚拟机中方便多了, ubuntu22.04下直接下载Cutter-v2.3.2-Linux-x86_64.AppImage后即可运行,如下图: 注意 有个同名的报废品: radare2/Cutter 即 radare2的图形化界…...
【INTEL(ALTERA)】使用NiosV/m 处理器,niosv-download 为什么会失败?
说明 在英特尔 Quartus Prime Pro Edition 软件 23.3 版及更高版本中将 Nios V 处理器软件下载到非流水线Nios V/m 处理器时,可能会出现此问题。 这是由于处理器限制,仅影响非流水线Nios V/m 处理器。 以下其他处理器不受此限制的影响: 管道…...

【无线通信专题】NFC通信模式及可能的应用方式
在文章【无线通信专题】NFC基本原理中我们讲到了NFC工作模式。其中NFC工作模式主要有三种,读写模式、卡模拟模式、点对点模式。 NFC通信模式丰富,NFC Forum定义了三种NFC设备:通用NFCForum设备、读写器设备和标签设备。这些NFC设备可以在三种通信模式下运行,并对应用案例进…...

pyinstaller生成的exe文件启动时间漫长的原因
加-F慢的原因是,pyinstaller把所有资源文件包括python解释器的依赖文件和库都打包到exe一个文件中,用户打开时,pyinstaller需要先执行一边解压操作,把依赖文件全部解压出来。慢就慢在这里。 如果不加-F,你会发现那些文…...
C语言基本语句介绍
c程序的执行部分是由语句组成的。程序的功能也是由执行语句来实现的,c语句分为6类 1表达式语句 表达式语句由表达式加上分号“;”组成 一般形式:表达式; 2函数调用语句 由函数名,实际参数加上分号“;”…...
【QT】QString类型中,Empty和NULL有什么区别在qt里,对比C#
在 Qt 中,QString 类型的字符串使用 isEmpty() 方法来检查字符串是否为空,而不是使用 null。这与 C# 中的 string.IsNullOrEmpty 方法略有不同。 QString::isEmpty(): 用于检查字符串是否为空。一个 QString 对象可能是空字符串,即…...

破壳而出:运维工程师在新科技热潮下的崛起与转型
运维工程师的出路到底在哪里? 在这个飞速发展的数字世界里,运维工程师无疑是IT界冲在最前线的勇士。他们曾是服务器的守护者,他们曾是故障的消灭者,他们曾是性能的推手。然而,随着科技的发展和市场需求的变化…...

静态网页设计——贵州美食(HTML+CSS+JavaScript)
前言 声明:该文章只是做技术分享,若侵权请联系我删除。!! 感谢大佬的视频: https://www.bilibili.com/video/BV1vC4y1K7de/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术:HTMLCSSJS(…...

imgaug库指南(六):从入门到精通的【图像增强】之旅
引言 在深度学习和计算机视觉的世界里,数据是模型训练的基石,其质量与数量直接影响着模型的性能。然而,获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此,数据增强技术应运而生,成为了解决这一问题的…...

stable diffusion 人物高级提示词(五)场景、特效、拍摄手法、风格
一、场景 场景Promptindoor室内outdoor室外cityscape城市景色countryside乡村beach海滩forest森林mountain山脉snowfield雪原skyscraper摩天大楼ancient monument古代遗迹cathedral大教堂library图书馆museum博物馆office building办公大楼restaurant餐厅street market街头市场…...

智能分析网关V4智慧港口码头可视化视频智能监管方案
一、需求背景 近年来,水利港口码头正在进行智能化建设,现场管理已经是重中之重。港口作为货物、集装箱堆放及中转机构,具有昼夜不歇、天气多变、环境恶劣等特性,安全保卫工作显得更加重要。港口码头的巡检现场如何高效、快捷地对…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...