当前位置: 首页 > 科技观察

迷失在NoSQL丛林中?你需要这本指南

时间:2023-03-19 10:48:32 科技观察

Nosql数据库NoSQL一词,意为“不仅仅是SQL”,最早出现于1990年代后期,指的是解决网络和云数据管理的需求,克服传统SQL技术局限的新系统构建(请参阅我们关于SQLvs.NoSQLvsNewSQL的博客文章,了解不同方法之间的比较)。这些限制包括缺乏水平可扩展性、低效的数据摄取、僵化的模式以及难以支持文档和图形等复杂数据。图1:传统SQL数据库作为支持标准关系模型的传统SQL数据库的替代方案,NoSQL系统支持标准SQL以外的数据模型和查询语言。他们通常强调可伸缩性(以一致性为代价)、灵活的模式和用于编写复杂的数据密集型应用程序的实用API。为了提供可伸缩性,NoSQL系统通常在无共享集群中使用扩展方法(请参阅有关无共享的博客文章),并通过复制来提高可用性。大数据软件堆栈中的nosql根据底层数据模型,NoSQL系统有四大类(?zsu&Valduriez,2020),例如键值数据存储、宽列存储、文档存储和图数据库。在每个类别中,我们可以找到数据模型的不同变体(不同于标准化的关系数据模型)和不同的查询语言或API。然而,对于文档存储,JSON正在成为事实上的标准。还有多模型数据存储,将多个数据模型(通常是文档和图形)组合在一个系统中。图2:NoSQL类别键值数据存储和宽列存储键值数据存储和宽列存储有时被归为一组,因为它们都是无模式的并且具有许多共同特征。在键值数据模型中,所有数据都表示为键值对,其中键是唯一的标识值。键值系统是无模式的,这产生了巨大的灵活性和可扩展性。它们通常提供简单的接口,例如put(key,value)、value=get(key)和delete(key)。宽列存储可以将行存储为属性值对的列表。第一个属性被称为主键或主键,例如社会保险号,它唯一地标识行集合中的行,例如人。键通常是排序的,这使得范围查询和键的有序处理成为可能。这是宽列存储的能力,一般key-value存储不支持。键值数据存储具有分布式架构,可在无共享集群中线性扩展。键值集的行通常使用哈希或键值范围进行水平分区,并存储在多个集群节点上。键值数据存储还擅长使用SSTables(他们声称使用LSM树,但实际上使用SSTables,请参阅我们关于B+树、LSM树和SSTables的博文)高效地摄取数据,这是一种数据结构和摄取算法,通过使用单个I/O插入多行来非常有效地摄取数据。键值数据存储解决了严格的模式问题,简单地通过无模式,每一行可以有不同的结构,即任意一组列。图3:B+树和SST表的比较键值数据存储的这些新特性会影响性能。首先,SST表查询数据的效率很低,所以在key-value数据存储中读取数据的成本远高于使用B+树的SQL数据库。其次,模式的灵活性意味着数据表示在空间方面变得更加昂贵,因为列名必须编码并存储在行中。更重要的是,无法应用通常用于填充相同大小的列的技术,因此数据表示效率较低。由于其固定模式,SQL数据库可以按行组织列,这在空间和访问时间方面非常高效。图4:关系和无模式方法的比较最后,键值存储以强数据一致性换取可伸缩性和可用性,依赖于控制一致性的不同方式,例如副本的最终一致性、条件写入以及最终一致性和强一致性读取。图5:键值数据存储的属性宽列存储结合了SQL数据库的一些有益特性(例如,将数据表示为表)与键值存储的灵活性和可扩展性(例如,列中的无模式数据).宽列表中的每一行都由一个键唯一标识,并有一些命名的列。然而,与关系表不同的是,列只能包含原子值(即二进制字符串),一个列可以很宽,包含多个键值对。宽列存储使用更多声明性结构扩展键值存储接口,允许对列族进行扫描、精确匹配和范围查询。他们通常为这些结构提供API以供编程语言使用。图6:key-value和宽列存储的比较