从需求出发来看关系模型与非关系模型--关系模型与非关系模型概述

简介: 自从NoSQL概念横空出世,关系数据库似乎就成了众矢之的,似乎一夜之间,关系数据库和SQL就成了低效,高成本,速度慢的数据处理模式的代名词。 在很多地方都能看到类似:"我的项目初创,应该选择什么NoSQL产品才能快速的开发?" 这样的问题。    正因有人提出这样的问题,才坚定了我把这篇文章放在
自从NoSQL概念横空出世,关系数据库似乎就成了众矢之的,似乎一夜之间,关系数据库和SQL就成了低效,高成本,速度慢的数据处理模式的代名词。 在很多地方都能看到类似:"我的项目初创,应该选择什么NoSQL产品才能快速的开发?" 这样的问题。 
 
正因有人提出这样的问题,才坚定了我把这篇文章放在了第一章的决心。主要的目标是希望借助这样一个形式,让大家能够比较清晰的认识到类似NoSQL,SchemaFree,RDBMS,CAP,BASE等等概念的本源,并了解到他们面对的主要场景,从而避免乱花渐入迷人眼的尴尬,知其然而知其所以然。
 
其实,软件中所谓的对象,结构体,实体,关系等概念,都只是对现实生活中的一种抽象。因为人类太过渺小,渺小到无法真正的理解和模拟这个世界,所以不得不创造出一些概念,过滤掉具体的细节而只关心他们所需要关心的事情。 这就产生了各种各样的抽象。
 
而SQL和关系模型,就是针对数据之间的“关系”而进行的一种抽象。
 
简单来说,他将一切事物都抽象为关系,并通过集合运算的方式规定了关系之间的运算过程,也因此更为严谨。比如,描述一辆车有四个轮子和四扇玻璃,那么就可以建立三张表格,一张存车的属性,一张存玻璃的属性,一张存轮子的属性,并且在轮子和玻璃的表格中,冗余车的唯一标示。这样就可以完成关系描述。如果要读取车A.id = 5车子的左前方轮子的出厂号码标示,做法一般是:查询轮子表,找到车子id=5的并且标有左前方属性的那行数据,读取他的出厂号码。
 
了解了关系模型,我们再来看看在关系模型产生之前,大家经常使用的层次模型吧。
层次模型其实也是非常简单的一类描述 ,还以车为例, 一辆车有唯一的标示(可以是个id,也可以只是个入口引用),然后车节点有两个子节点,一个是轮子集合节点,一个是玻璃集合节点,然后,轮子集合节点有四个节点,分别表示四个轮子,而玻璃集合有四个节点,分别标示四扇玻璃。如果要读取车A.id = 5车子的左前方轮子的出厂号码标示,做法一般是:找到顶节点车A,然后查找该节点的子节点,轮子集合节点,然后遍历4个子节点,找到标有左前方属性的车轮,读取其出厂号码。
 
从上面简单的例子对比来看,相信大家立刻就能看出关系模型与传统的层次or表格模型的最大差别。也就是用户不再需要关注从车->轮子集合->轮子本身,这个存取路径只需要关注于核心的查询逻辑(车子id=5 , 车轮属性是左前方),就可以立刻找到数据了。 使用关系模型,因为模型相对的比较简单,并且数学证明比较严密,所以很快被大家接受。
 
因此在市面上已经很少出现层次模型or网状模型了。
 
在互联网时代之前,数据库的研究领域更多的集中在关系模型与前端业务开发模型不匹配这个问题上, 众所周知的, 在面向对象的语言产生之后,继承,多态,充血模型已经成为了程序语言的标配,我们在这里不去讨论是面向对象好,还是函数式编程好这样没结论的问题,只来简单的浏览一下面向对象与关系模型的阻抗失配问题即可。
如果大家写过业务逻辑,一定也会觉得把数据库里的数据转变为程序对象是一件蛋疼无比的事情吧。将面向对象里面的继承和组合这类概念硬套到关系数据库上,需要耗费比较大的精力才能完成。
 
为了解决这些问题,一种思路是在程序层做这个ORMapping的转换,这类工具主要是hibernate、ibatis等工具。另外一个思路是在数据库层面做这件事,比如oracle一直宣传自己是ORDBMS。甚至甚至,连脚本语言框架比如ROR , django的核心目标之一也就是解决这个阻抗失配的问题~
 
因为类似java/c++/.net这样的语言是静态编译的,所以就必须要求用户要在代码中明确的定义对象的属性名字和类型,而在数据库内,也有一套对应的列名和数据库类型信息。 一张表有50多个字段,每次字段变更,都必须保证用户代码内的对象内的属性和数据库中的数据准确对应。这非常消耗时间,也非常容易错。
 
为了解决这个问题,要么是从程序代码生成关系模型,要么是从关系模型反向生成程序代码。 这两种方式都会面临程序逻辑与关系模型不匹配的问题,于是写ORMapping就成了一件蛋疼无比但又不得不做的事情。
 
为了自动化,有大量的工具组件出现在这里,比如hibernate,比如ibatis,他们主要作用就是将我们的对象模型转换为关系模型,不过这类工具最大的问题就是,学习工具本身的成本很高,甚至高于自己去做对象关系映射本身,而且经常会因为对ORMapping掌握的不够精深,造成很多低效的查询,拖慢了整体性能的问题。
 
还有一些人为了偷懒,放弃使用对象bean来表示数据库中数据。他们一般会采用Map映射来表示数据库中一行数据,使用这种方式,Map的key就是列的名字,value就是列的值,如果要表示多行数据,那么就是一个List<Map>的结构。使用这种结构,程序就可以自动的根据数据库给出的列名原信息来自动生成Map结构。但这种方式的问题是,丢失了面向对象所带来的良好的封装特性,经过多层传递与处理后,用户很难辨识哪些是数据中间过程数据,哪些是数据库原始数据。数据Map对象会膨胀的非常厉害,以至于无法管理。
 
脚本语言的核心目标之一也就是解决这个阻抗失配的问题, 脚本语言因为是动态编译的,所以动态对一个对象增加或减少属性变得非常简单而清晰,所以对象内的数据可以直接根据数据库内的数据进行内省获得,不在需要人工维护,同时又不会出现因为Map结构所导致的代码结构不清晰的问题,所以ROR这类的工具可以直接进行对象关系映射,极大地提升了小业务系统的生产力。
 
可惜,对象数据库和xml数据库,都没有形成一统天下的新浪潮,一直不瘟不火的缓慢发展着。 
 
 
随着互联网的爆发式发展,数据库概念领域又一次发生了摇摆,伴随着互联网的特殊需求,一批有着新鲜血液的NoSQL数据库涌现了出来,层次模型又从封印中苏醒,站在了大家面前。
 
这里就自然而然会有一系列的疑问产生了出来,为什么层次模型变种的NoSQL会出现并得到了一些人的认同?他满足了什么需求? 关系模型在什么地方不能满足大家的需求了?
 
那么,我们就从应用场景出发,尝试回答一下这些问题吧。
相关文章
|
2月前
|
存储 消息中间件 Apache
ZooKeeper 实战指南:从入门到场景解析
Apache ZooKeeper是分布式系统的协调核心,本文带你快速搭建环境,掌握Znode操作与Watcher机制,深入理解其在分布式锁、配置管理、服务发现等场景的应用,并解析美团Leaf中的实践案例。
671 181
|
2月前
|
监控 安全 Unix
iOS 崩溃排查不再靠猜!这份分层捕获指南请收好
从 Mach 内核异常到 NSException,从堆栈遍历到僵尸对象检测,阿里云 RUM iOS SDK 基于 KSCrash 构建了一套完整、异步安全、生产可用的崩溃捕获体系,让每一个线上崩溃都能被精准定位。
696 79
|
存储 缓存 NoSQL
阿里云 Tair KVCache 仿真分析:高精度的计算和缓存模拟设计与实现
阿里云 Tair 推出 KVCache-HiSim,首个高保真 LLM 推理仿真工具。在 CPU 上实现<5%误差的性能预测,成本仅为真实集群的1/39万,支持多级缓存建模与 SLO 约束下的配置优化,助力大模型高效部署。
|
23天前
|
人工智能 机器人 应用服务中间件
阿里云OpenClaw一键部署攻略,轻松拥有超级AI助理!
本文将为大家分享阿里云OpenClaw一键部署攻略,助力大家轻松拥有专属AI助理!
502 11
|
20天前
|
人工智能 自然语言处理 JavaScript
一分钟部署OpenClaw(Clawdbot)+问题解答,最爽的一键启动!
OpenClaw(前身为 Clawdbot、Moltbot)是一款开源 AI 代理与自动化平台,具备自然语言控制、任务自动化执行、多模型兼容等核心能力,可实现文件处理、邮件管理、日程规划、多工具协同等多样化功能,堪称 “专属数字员工”。2026 年阿里云推出的轻量应用服务器一键部署方案,通过预置专属镜像简化了复杂的环境配置流程,无需专业技术储备,零基础用户也能快速完成部署,实现 7×24 小时不间断运行。本文将详细拆解部署全流程,并针对性解读常见问题与解决方案,全程无营销表述,严格遵循技术文档核心逻辑。
438 4
|
28天前
|
存储 弹性计算 安全
阿里云服务器“99计划”是什么?2026年“99计划”具体活动内容及组合套餐介绍
阿里云“99计划”为个人和中小企业提供低价长效云服务器,包括经济型e实例(99元/年)和通用算力型u1实例(199元/年),新老用户同享,续费同价。除低价云服务器外,该计划还涵盖立享建站礼包、加99元享高效存储保障及弹性数据库等专属优惠,支持快速搭建网站、搭建FTP站点等场景。此外,多场景组合套餐和无忧数据备份服务满足用户多样化需求,确保数据安全与业务顺畅,助力用户轻松上云。
892 4
|
4月前
|
人工智能 安全 Serverless
再看 AI 网关:助力 AI 应用创新的关键基础设施
AI 网关作为云产品推出已有半年的时间,这半年的时间里,AI 网关从内核到外在都进行了大量的进化,本文将从 AI 网关的诞生、AI 网关的产品能力、AI 网关的开放生态,以及新推出的 Serverless 版,对其进行一个全面的介绍,期望对正在进行 AI 应用落地的朋友,在 AI 基础设施选型方面提供一些参考。
903 76
|
1月前
|
存储 人工智能 数据处理
2026年阿里云对象存储OSS最新收费标准价格表:
阿里云OSS按存储、流量、请求等维度收费,核心模式为按量付费与资源包(包年包月),未用功能不计费。主要费用为存储费(标准/低频/归档等类型)和流量费(仅公网流出,分闲忙时计费),另有请求、数据处理等增值费用。开通、上传及内网流量免费,新用户享免费额度,官网提供精准报价。
|
1月前
|
人工智能 JavaScript 开发者
解决 AI 落地“最后一公里”:如何优雅地将 Gemini 深度内容无损转为 Word 文档?
本文探讨如何将Gemini生成的Markdown内容无损转换为Word文档,破解公式乱码、图表失效、格式错乱三大难题。对比Google Docs原生导出、Pandoc命令行工具与ai2word等在线方案,从易用性、公式支持、图表渲染等维度评测,助你高效产出可编辑、高保真的专业文档,实现AI写作到办公交付的无缝衔接。
1574 1
|
7月前
|
JSON 分布式计算 大数据
springboot项目集成大数据第三方dolphinscheduler调度器
springboot项目集成大数据第三方dolphinscheduler调度器
463 3

热门文章

最新文章