2021-07-27 04:48:13
NOSQL的本质是采用键-值对数据模型,对关系模型中的非主键字段部分放宽限制,实现更灵活的数据组织方式,同时通过扩展数据类型和嵌套结构提升表达能力,其名称“Not Only SQL”体现了对SQL的补充而非完全替代。 以下是具体分析:
一、与关系模型的统一与扩展键-值对与关系模型的对应关系NOSQL的键-值对模型与关系模型本质统一。关系模型中,主键字段对应NOSQL的KEY,非主键字段对应VALUE。当VALUE的数据类型统一时,NOSQL与关系模型完全一致,因此关系模型可视为NOSQL的特例。例如,用户表中用户ID作为KEY,交易记录作为VALUE,若所有用户的VALUE结构相同,则与关系模型无异。
数据类型的灵活性SQL中VALUE的数据类型限于基本类型(如整数、字符串),而NOSQL支持复杂类型(如数组、集合、列表),甚至允许VALUE为另一个表。例如,用户表的VALUE可嵌套交易记录表,形成树形结构,而SQL的表结构为线性。这种嵌套能力使NOSQL在数据组织上更灵活。
树形结构与线性结构的对比SQL数据库由多个独立表构成,呈线性结构;NOSQL通过表嵌套表形成树形结构。例如,电商用户表中,每个用户的交易记录作为VALUE的子表,所有交易记录聚集在用户行内,查询时无需跨表操作,提升性能。
可扩展性与负载均衡NOSQL通过水平分段实现动态扩展。当节点数据量达到上限时,系统自动将数据一分为二,并更新分布式数据库管理系统(DDBMS)的元数据,确保负载均匀分布。例如,用户表从节点A迁移部分数据到节点B,DDBMS同步更新两个节点的KEY范围记录,实现无缝扩展。
系统可用性优势数据迁移时,NOSQL以用户为单位逐个迁移,每个用户迁移完成后立即可用,用户几乎无感知;而SQL通常以表为单位迁移,迁移期间整个表不可用,耗时较长。例如,QQ文件传输中,系统生成KEY供接收方下载,即使部分文件未迁移完成,已迁移部分仍可访问。
查询功能的局限性NOSQL通常仅支持基于KEY的等值查询,缺乏SQL的复杂查询能力(如范围查询、模糊查询、联接查询)。例如,MongoDB的查询需明确指定属性名,无法像SQL那样通过表关联获取多维度数据。
VALUE内容查询的性能问题NOSQL表中行以链表存储,不具有数组特性,基于VALUE内容的全表扫描需逐行逐字段检查,性能低下。例如,在用户表中查找特定交易记录时,若未创建索引,需遍历所有用户的VALUE子表,效率远低于SQL的列式查询。
索引的谨慎使用为提升查询性能,NOSQL需针对VALUE内容创建索引,但索引维护成本高。部分产品(如早期HBASE)甚至不提供索引功能,仅依赖KEY查询。例如,HBASE通过列族分表存储优化访问性能,减少索引需求。

MongoDB:文档模型的自由度MongoDB以文档(JSON格式)为单位存储数据,集合中的文档VALUE无固定结构,由用户自定义属性。例如,图书集合中的文档可包含标题、作者、标签等不同属性,标签甚至可为集合类型。这种灵活性适用于半结构化数据,但查询时需明确属性路径。
Redis:多值数据类型的支持Redis提供链表、有序集合等特殊数据类型,满足特定场景需求。例如,火车时刻表需保持顺序,有序集合可避免排序操作;用户订票记录按时间排序,链表可高效插入和删除元素,无需维护顺序。
单一数据类型的优势部分NOSQL产品(如HBASE、MongoDB)仅支持字符串类型,使用UTF-8编码,避免异构系统间的数据转换问题。例如,JSON作为数据交换格式,统一使用字符串表示数值和文本,简化跨平台通信。
KEY生成的策略NOSQL中,KEY可由系统自动生成(如MongoDB的文档ID)或由用户自定义(如业务唯一标识)。系统生成的KEY通常包含物理存储位置信息,提升查询效率,但无法检测数据冗余;用户自定义KEY适用于需唯一性的场景(如用户账号)。