数据库系统之NoSQL数据库系统

2023-10-27

什么是NoSQL数据库系统?

NoSQL数据库系统是在21世纪初开发出来的,以应对日益增长的互联网使用和移动地理定位技术产生的大量数据处理需求.

传统的解决方案要么太昂贵、不容易扩充,要么需要太多时间来处理数据。

现代NoSQL数据库系统“借用”了早期系统的一些解决方案,并在可伸缩性和不同类型数据(如文本、音频、视频、图像和地理位置)的高效处理方面取得了重大进展。

NoSQL数据库系统包括以下类型的数据库系统,按提供的数据的逻辑视图分类:键值存储、文档存储、图存储和列存储。

NoSQL全程有两种说法:
一种说法是NoSQL“数据库系统不使用SQL(Do not use SQL),在计算机集群上运行,并提供不同的一致性和分布选项。
另一种说法是"Not Only SQL“。
目前人们普遍接受第一种说法。

为什么使用NoSQL?

数据模型:数据的表格视图对于分层和网络数据库领域使用起来不方便。

阻抗不匹配问题:在面向对象的编程语言中,持久数据的(表格视图)与临时数据视图不一致。

数据库系统的应用程序和集成:集成许多应用程序的结构比单个应用程序所需的要复杂得多,例如,一个应用程序所需的索引可能会导致另一个应用程序的性能问题。

小型计算机集群:在共享磁盘子系统上操作的关联数据库在小型计算机集群上不能很好地工作。

分布式和一致性:基于ACID的事务协议对于分布式事务来说过于严格。

NoSQL数据库系统的属性

半结构化的、无模式的数据模型

半结构化数据是一种结构化数据的形式,它不符合与关系数据库或其他形式的数据表相关联的数据模型的正式结构。
半结构化数据包含tags或其他标记,以分离语义元素并强制数据中的记录和字段的层次结构。
无模式数据模型意味着没有特定的数据结构用于在数据库中存储数据。
无模式数据库不需要与严格的模式保持一致。
无模式数据库不会对单个值实施数据类型限制。
无模式数据库可以存储结构化和非结构化数据。

专业分布模型

单服务器:意味着根本没有分发

切分 Sharding:
为了支持水平可伸缩性,我们将数据的不同部分放到不同的服务器(切分)。

主从复制 Mater-slave replication:
数据跨多个节点复制,其中一个节点指定为主节点,其他节点指定为从节点;所有更新都对主节点进行,然后传播到从节点。

对等复制 Peer-to-peer replication:
跨多个节点复制的数据;所有副本具有相同的权重,没有主模式;节点通信其写入;所有节点读取和写入所有数据。

结合分片和复制 Combining sharding and replication:
同时使用主从 replication和sharding。

弱一致性

一个典型的读一致性原则是,对两个或多个数据项执行更新,从而阻止对受更新影响的所有数据项的访问,例如: 2PL协议。
NoSQL数据库系统在一定程度上放宽了事务一致性。

数据项可以在一段时间内保持不一致,这称为不一致窗口(inconsistency window)。

最终一致性的概念用于在分布式和复制的数据项上强制复制一致性。
最终一致性意味着数据项的副本可以在“不一致”窗口中不一致,并且以后所有副本将具有相同的值。
在执行读写一致性的条件下,可以容忍较长的不一致窗口。

这就引出了会话一致性的概念,这意味着在用户会话中,必须实现读写一致性( read-your-write consistency )。

会话一致性可以通过粘性会话( sticky session)来实现,即只连接到集群中一个节点的会话;它也称为(会话亲和性 session affinity)。

实现会话一致性的另一个解决方案是基于版本时间戳,其中与数据项的每次交互都是在具有最高时间戳的数据项上执行的。

设计一个避免不一致的系统总是可能的,但有时我们不得不用一致性来换取系统的其他一些特性。

不同的领域对不一致有不同的容忍度,我们在做决定时必须考虑到这种容忍度。

即使在传统的关系数据库系统中,也可以将一致性从最高隔离级别(serializable)放宽到最低级别(read-committed),以获得更好的性能。

CAP定理:在Consistency, Availability, 和Partition tolerance这三个属性中,您只能得到两个:

一致性:数据库的状态在任何时刻都满足给定的一致性约束。

可用性:如果您可以与群集中的节点通信,那么它就可以读写数据。

分区:集群可以在通信中断的情况下生存,通信中断将集群分成多个无法相互通信的分区(分裂的大脑)

单服务器系统之所以称为CA,是因为它具有一致性和可用性,而不是分区tolerance

如果集群必须tolerance网络分区,那么我们必须用一致性换取可用性。

Relaxing durability

如果SQL系统遵循ACID属性,那么NoSQL系统遵循基本属性为:
Basically Available, Soft state和Eventually consistent。

放松的持久性意味着我们用持久性来换取更高的性能,例如,对数据库的内存表示进行更新,并定期将更改推送到磁盘。

另一类durability tradeoffs伴随着复制的数据,例如。
当一个节点在更新复制到其他节点之前进行处理和更新但失败时。

Versioning

版本是某事物的一种特殊形式,在某些方面不同于同类事物的早期形式或其他形式。

数据库系统中的Versioning 意味着数据项的所有修改都存储在一个数据库中,并在这些修改发生时加上时间戳。

在实践中,Versioning 是按预定义的深度执行的,即在创建数据项时确定数据项的总版本数。

Versioning 允许表示历史信息。

通过时间戳对数据版本进行编号,可以跟踪数据项何时发生更改,如果有新版本,则可以确定哪个版本是最新版本。

References

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

数据库系统之NoSQL数据库系统 的相关文章

  • 如何在 Elasticsearch 中或在 Lucene 级别进行联接

    在 Elasticsearch 中执行相当于 SQL 连接的最佳方法是什么 我有一个包含两个大表的 SQL 设置 Persons 和 Items 一个人可以拥有many项目 人员和项目行都可以更改 即更新 我必须运行根据人和物品的各个方面进
  • NoSql DB 和 OO Db 有什么区别?

    NoSql DB 和 OO Db 有什么区别 NoSQL DB 通常是非规范化的 保存对象数据的副本来代替对象 而 OODB 是具有对象关系的规范化数据库 在 OODB 中 数据存储在对象中的一处 并链接 关系 到其他对象 由于上述非规范化
  • MongoDB、Redis 与 Cassandra 的快速写入、临时行存储解决方案

    我正在构建一个跟踪和验证广告展示次数和点击次数的系统 这意味着有很多插入命令 平均每秒约 90 个 峰值为 250 个 和一些读取操作 但重点是性能并使其速度极快 该系统目前使用 MongoDB 但从那时起我就开始使用 Cassandra
  • Titan 顶点中心索引与 Neo4j 标签

    在接近这个问题时 我试图对这两种技术进行比较 我想知道你们中是否有人已经有处理其中任何一种或两种技术的经验 我主要对处理类似用例时的性能数字感兴趣 这两个概念之间的区别是全局索引和本地索引之间的区别 据我了解 Neo4j顶点标签允许您通过顶
  • 多字段匹配查询

    我对弹性搜索相当陌生 想编写一个涉及两个字段的查询 我的意思是字段的内容包含指定的子字符串 我有一个包含字段的文档 如下所示 name n tag t 我试过这个 search d query match name n tag t 但查询结
  • 如何从 NoSQL DBMS(如 DynamoDB)存储 GPS 坐标并搜索半径范围内的地点

    我的团队需要像 DynamoDB 这样的 DBMS 来存储大量数据 主要是位置和坐标 我考虑过使用一些基于 GIS 的 DBMS 例如 PostGIS 并在 POINT 上建立索引 但 DynamoDB 似乎非常适合我们的使用 存储坐标并快
  • 是否可以针对 noSQL DB 构建复杂的查询

    我一直在研究 noSQL DB 但未能为自己满意地回答这个问题 是否可以针对 noSQL DB 构建复杂的查询 我想知道的查询类型是这样的 select from DB where vara gt x AND varb 2 AND varc
  • 一起使用 MongoDB 和 Neo4j

    我正在开始一个新项目 我正在考虑使用 MongoDB 作为文档存储工具 使用 Neo4j 作为映射文档之间关系的机制 然后我想通过 REST API 公开查询结果 人们会说这样做的优点和缺点是什么 是否有更好的方法可以使用不同的 NoSQL
  • 查询 mongodb 返回今天创建的文档

    我如何编写今天创建的结果文档的过滤器 我知道 ObjectId 有时间戳 我试过这个 db doc find id gte ObjectId getTimestamp getTime 我可以写吗 db doc find id getTime
  • Firebase 数据库结构 - 需要建议

    我知道这个问题可能被视为基于意见的问题 但是我认为值得讨论正确构建数据库的方法 我在 Swift 中开发 iOS 应用程序 并决定使用 firebase 作为我的后端服务 让我们从应用程序描述开始 该应用程序旨在为图书阅读体验提供跟踪和社交
  • 适用于 Web 照片库的正确 NoSQL 数据架构

    我正在寻找为照片库的 NoSQL 存储构建合适的数据结构 在我的网络应用程序中 一张照片可以是一个或多个相册的一部分 我有使用 MySQL 的经验 但几乎没有使用键值存储的经验 使用 MySQL 我将设置 3 个表 如下所示 photos
  • 计算 HBase 表中列族的记录数

    我正在寻找一个 HBase shell 命令来计算指定列族中的记录数 我知道我可以运行 echo scan table name hbase shell grep column family name wc l 然而 这将比标准计数命令运行
  • 如何:SQL 还是 NOSQL?

    我还没有遇到过这个问题 但这就是我的想法 非常肤浅和简单化恕我直言 如果您有键值类型的存储 并且所有访问都是键查找 请使用 NOSQL 解决方案 如果您想要基于值 和子值 进行查找或者有一些更复杂的东西 例如联接 您会选择关系解决方案 事务
  • ScyllaDB 是否支持 OR 运算符?

    scyladb 中 SELECT 语句的 WHERE 子句中的 OR 条件如何工作 我已经在电子邮件上创建了二级索引 下面的查询工作正常并返回结果 cqlsh gt select from test d emp where email em
  • 使用 Cassandra 进行单元版本控制

    我的应用程序使用 AbstractFactory 作为 DAO 层 因此一旦实现了 HBase DAO 系列 创建 Cassandra DAO 系列并从多个角度查看差异对我来说将是非常好的 不管怎样 试图做到这一点 我看到 Cassandr
  • 用于标签搜索的数据存储解决方案

    我已经按照预先计算的分数订购了数百万件商品 每个项目都有许多布尔属性 假设总共有大约一万个可能的属性 每个项目有十几个 我希望能够请求实时 几毫秒 给定任意属性组合的前 n 个项目 您会推荐什么解决方案 我正在寻找可扩展性极强的东西 我们目
  • MongoDB 支持浮点类型吗?

    我正在将 mysql 数据库迁移到 mongodb 但我读过 MongoDb 数据类型 然后没有引用浮点类型 如 float double decimal 我如何在 mysql 模式中拥有一些带有十进制类型的字段 我该怎么做或我能做什么 M
  • MongoDB中批量FindAndModify的解决方案

    我的用例如下 我在 mongoDB 中有一组文档 我必须发送这些文档进行分析 文件格式如下 id ObjectId 517e769164702dacea7c40d8 日期 1359911127494 状态 可用 其他字段 我有一个阅读器进程
  • Firestore从集合中获取文档ID

    我正在尝试使用 id 检索我的文档 但无法弄清楚 目前我像这样检索我的文档 const racesCollection AngularFirestoreCollection
  • 如何在图数据库(如 Neo4j)中对现实世界的关系进行建模?

    我有一个关于在图形数据库中建模的一般性问题 但我似乎无法解决这个问题 您如何建模这种类型的关系 牛顿发明了微积分 In a 简单图 http docs neo4j org chunked snapshot graphdb neo4j rel

随机推荐

  • Python 高级变量类型,函数进阶 day05

    高级变量类型 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 int 浮点型 float 布尔型 bool 真 True 非 0 数 非零即真 假 Fal
  • 命名空间system中不存在data_我理解中的Unity DOTS

    我是第一次接触到 ECS 并不是使用老手 以下仅仅是我通过浏览相关文章和实现相关 Demo 而写出的一篇分享初见文 如有错误 请您指出 谢谢 因为本身就是忠实的 Overwatch 玩家 所以天然的对其应用的 ECS 架构有所兴趣 再加上最
  • 流文件保存到本地的两种方法

    1 FileStream fs new FileStream path FileMode Create fs Write ImageBuff 0 ImageBuff Length fs Close 注释 ImageBuff 图片流 byte
  • HEX(Xilinx MCS)文件格式详解

    文章目录 自己定义个文件格式 HEX文件格式详解 HEX 文件是指以hex为后缀 采用Intel HEX编码规则的文件 可以直接使用文本编辑工具打开 通常用来对微控制器或ROM进行编程 本质上都是对存储器编程 其中包含了每个地址对应的数据
  • QT connect()连接函数的一点说明

    QObject connect中的signal和slot函数一定要有参数类型 但是 不可以有参数名 指定信号和方法时 必须使用SIGNAL 和SLOT 宏 例如 关联信号和槽函数 connect configureWindow SIGNAL
  • MySQL索引失效场景实例演示

    文章目录 一 环境信息 二 表 数据准备 三 复合索引的失效情况 最左前缀法则 or查询 四 单列索引的失效情况 like模糊查询使用前通配符 索引列上使用函数 字符串索引没加引号 使用 lt gt gt lt is null 或 is n
  • Jenkins安装与配置

    什么是CICD CI CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法 CI CD 的核心概念是持续集成 持续交付和持续部署 作为一个面向开发和运营团队的解决方案 CI CD 主要针对在集成新代码时所引发的问题 亦称 集成
  • Ubuntu16.04下基于Docker的Caffe-GPU版本环境搭建总结

    Caffe的GPU环境搭建在docker支持下并不困难 但是过程比较杂 所需依赖如下 本文会说明安装方法 帮助大家少走弯路 GNU Linux x86 64 with kernel version gt 3 10 Docker gt 1 9
  • 这是一个更新版本服务代码python

    import win32serviceutil import win32service import win32event import os import logging import inspect import time from u
  • 【计算机网络】实验报告三:Cisco Packet Tracer 实验

    Cisco Packet Tracer 实验 1 直接连接两台 PC 构建 LAN 2 用交换机构建 LAN 3 交换机接口地址列表 4 生成树协议 Spanning Tree Protocol 5 路由器配置初步 6 静态路由 7 动态路
  • 1045 快速排序

    著名的快速排序算法里有一个经典的划分过程 我们通常采用某种方法取一个元素作为主元 通过交换 把比主元小的元素放到它的左边 比主元大的元素放到它的右边 给定划分后的 N 个互不相同的正整数的排列 请问有多少个元素可能是划分前选取的主元 例如给
  • typora高亮_用Typora实现写作排版一体化

    用Typora实现写作排版一体化 一般的推文制作过程 大概都是在本地word写好文案以后 再导入到第三方的推文编辑器中进行排版 最后再黏贴到微信的图文素材编辑器里生成图文发布 经常看到许多公众号文章充满花里胡哨的元素 大概都是因为使用了推文
  • SpringBoot整合Elasticsearch(最新最全,高效安装到使用)

    文章目录 一 安装Elasticsearch相关插件 1 选择版本 2 安装Elasticsearch 3 安装node 4 安装grunt 5 安装es head插件 6 安装kibana 7 安装ik分词器 二 整合SpringBoot
  • 从零开始学编程——DOS命令

    一 DOS操作系统 DOS 英文 Disk Operating System 是一款由微软早期推出的磁盘操作系统 可以通过一系列dos命令直接对硬盘文件进行增删改查 DOS和windiws的最大不同之处在于它是一个字符式操作系统 所有的操作
  • Oracle 表空间查询与操作方法

    一 查询篇 1 查询oracle表空间的使用情况 select b file id 文件ID b tablespace name 表空间 b file name 物理文件名 b bytes 总字节数 b bytes sum nvl a by
  • 自动化办公更简单了:新版python-office,有哪些更新?

    职场经验谈 大家好 这里是程序员晚枫 小破站 小红薯都叫这个名 去年4月开源了一个Python自动化办公项目 python office GitHub和Gitee都能看到 1行代码实现复杂的自动化办公任务 帮助不懂代码的小白 快速使用Pyt
  • Unity鼠标控制物体的旋转、移动、缩放等

    这个是控制相机 44条消息 unity 相机 旋转缩放查看 物体或地图 unity旋转查看物体 野区捕龙为宠的博客 CSDN博客 下面的是控制物体本身 知识点 Input GetMouseButton 0 获取鼠标输入 参数为一个int值
  • QT moveToThread解析

    目录 简介 源码分析 判断是否可以执行移动动作 执行移动动作 调用moveToThread helper 调用setThreadData helper 简介 每一个QObject子类都会关联到一个具体QThread线程上 QObject有一
  • 同一块磁盘下,非lvm的扩容

    1 想要给跟分区扩容 2 先安装growpart yum install cloud utils growpart 3 growpart dev sda 2 发现lsblk看到扩容了 但是实际df还是没扩容 4 需要执行xfs growfs
  • 数据库系统之NoSQL数据库系统

    NoSQL Database Systems 什么是NoSQL数据库系统 为什么使用NoSQL NoSQL数据库系统的属性 半结构化的 无模式的数据模型 专业分布模型 弱一致性 Relaxing durability Versioning