非关系型数据库和关系型数据库的区别
🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》
💬 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
文章目录
- 一、数据模型
- 二、数据一致性
- 三、可扩展性
- 四、查询语言
- 五、应用场景
一、数据模型
- 关系型数据库(RDBMS)
- 基于关系模型:关系型数据库采用关系模型来组织数据,以表(Table)的形式存储信息。表由行(Row,也称为记录)和列(Column,也称为字段)组成。例如,一个存储用户信息的表可能有“用户ID”、“姓名”、“年龄”、“电子邮件”等列,每一行代表一个用户的完整信息。
- 数据关联与约束:表与表之间可以通过主键(Primary Key)和外键(Foreign Key)建立关联。主键用于唯一标识表中的每一行数据,外键用于建立不同表之间的关系。这种关联使得数据具有完整性约束,例如,在一个订单系统中,“订单表”中的“用户ID”字段作为外键与“用户表”中的“用户ID”主键相关联,保证了订单数据与用户数据的一致性。
- 非关系型数据库(NoSQL)
- 多样的数据模型:非关系型数据库没有固定的表结构,其数据模型更加多样化。常见的数据模型包括键 - 值(Key - Value)存储、文档(Document)存储、列族(Column - Family)存储和图形(Graph)存储等。
- 键 - 值存储示例:以键 - 值存储为例,数据以键值对的形式存在,就像一个巨大的字典。例如,在一个缓存系统中,键可以是一个缓存项的唯一标识符,值可以是缓存的具体内容,如一个网页片段或用户配置信息。
- 文档存储示例:文档存储中的数据单元是文档,通常以JSON或XML等格式存储。例如,一个博客系统可以将每一篇博客文章存储为一个文档,文档中包含文章标题、作者、内容、发布时间等字段,这些字段的结构可以根据文章的具体需求灵活变化。
二、数据一致性
- 关系型数据库
- 强一致性保证:关系型数据库遵循ACID原则(原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability)来确保数据的一致性。原子性保证事务中的所有操作要么全部完成,要么全部不完成;一致性确保数据库在事务执行前后始终保持一致状态;隔离性防止不同事务之间的相互干扰;持久性保证一旦事务提交,其对数据库的修改将永久保存。
- 示例说明:在银行转账系统中,从一个账户转出资金和转入另一个账户这两个操作被视为一个事务。关系型数据库会确保这个事务要么完全成功(两个账户余额都正确更新),要么完全失败(两个账户余额都不变),不会出现只更新一个账户余额的情况,从而保证了数据的强一致性。
- 非关系型数据库
- 不同的一致性级别:非关系型数据库在一致性方面有多种策略,不一定遵循ACID原则。一些非关系型数据库提供强一致性,例如,某些键 - 值存储系统在特定配置下可以保证每次读取的数据都是最新写入的数据。然而,更多的非关系型数据库采用最终一致性(Eventual Consistency)策略。
- 最终一致性示例:在一个分布式的文档存储数据库中,当数据在不同节点之间进行复制时,可能会出现短暂的数据不一致。例如,在一个全球分布的内容管理系统中,对一篇文档的更新可能首先在一个数据中心完成,然后通过异步复制传播到其他数据中心。在复制过程中,不同用户在不同数据中心访问这篇文档时,可能会看到不同的版本,但最终所有数据中心的数据会达到一致状态。
三、可扩展性
- 关系型数据库
- 垂直扩展为主:关系型数据库在扩展时,通常先考虑垂直扩展,即通过增加服务器的硬件资源(如CPU、内存、存储容量)来提高性能。这种扩展方式在一定程度上能够满足业务增长的需求,但存在硬件资源瓶颈,当数据量和访问量达到一定规模后,单纯的垂直扩展可能会变得非常昂贵且效果有限。
- 水平扩展挑战:水平扩展(通过添加更多的服务器节点来分担负载)在关系型数据库中相对复杂。因为关系型数据库的数据结构和关联关系复杂,数据的分片(Sharding)和分布式事务处理等操作难度较大。例如,要将一个大型的电子商务订单数据库进行水平扩展,需要精心设计数据分片策略,以确保订单数据及其关联的用户数据、商品数据等在不同节点之间的合理分配,同时还要处理好分布式事务,避免数据不一致。
- 非关系型数据库
- 天生适合水平扩展:非关系型数据库通常设计为易于水平扩展,能够方便地通过添加更多的节点来处理不断增加的数据量和访问量。例如,在一个大规模的键 - 值存储系统中,新的数据可以均匀地分布到新增的节点上,系统可以自动调整数据的分布,以适应负载的变化。
- 分布式架构优势:许多非关系型数据库采用分布式架构,数据在多个节点之间进行复制和存储。这种分布式特性不仅提高了系统的可扩展性,还增强了系统的可用性和容错性。例如,在一个基于列族存储的大数据存储系统中,数据被分布在多个节点上,即使部分节点出现故障,系统仍然可以通过其他节点提供服务,并且可以自动进行数据恢复和重新平衡。
四、查询语言
- 关系型数据库
- SQL(Structured Query Language):关系型数据库使用SQL作为标准的查询语言。SQL是一种功能强大的声明式语言,能够进行复杂的数据查询、插入、更新和删除操作。例如,可以使用
SELECT
语句从多个表中检索数据,通过JOIN
操作关联不同的表,使用WHERE
子句进行条件筛选,使用GROUP BY
和HAVING
进行分组和分组条件筛选等。 - 示例查询:在一个包含“学生表”(有“学生ID”、“姓名”、“班级ID”等列)和“班级表”(有“班级ID”、“班级名称”等列)的学校数据库中,可以使用以下SQL查询获取每个班级的学生人数:
SELECT c.class_name, COUNT(s.student_id) AS student_count FROM classes c JOIN students s ON c.class_id = s.class_id GROUP BY c.class_name;
- SQL(Structured Query Language):关系型数据库使用SQL作为标准的查询语言。SQL是一种功能强大的声明式语言,能够进行复杂的数据查询、插入、更新和删除操作。例如,可以使用
- 非关系型数据库
- 因数据模型而异的查询语言或接口:非关系型数据库没有统一的查询语言。对于键 - 值存储,查询通常是通过键来获取值,操作相对简单,可能使用简单的API函数,如
get(key)
来获取指定键的值。对于文档存储,可能使用类似JSON查询语言(如MongoDB的查询语言),可以通过文档的字段进行筛选和查询。对于图形存储,则有专门的图形查询语言(如Cypher for Neo4j),用于查询节点和边之间的关系。 - 文档存储查询示例(以MongoDB为例):在一个存储用户文档(包含“姓名”、“年龄”、“爱好”等字段)的MongoDB数据库中,可以使用以下查询获取年龄大于30岁的用户:
db.users.find({ age: { $gt: 30 } });
- 因数据模型而异的查询语言或接口:非关系型数据库没有统一的查询语言。对于键 - 值存储,查询通常是通过键来获取值,操作相对简单,可能使用简单的API函数,如
五、应用场景
- 关系型数据库
- 事务性系统:适用于对数据一致性和完整性要求极高的事务性应用,如银行系统、财务系统、企业资源规划(ERP)系统等。在这些系统中,需要严格保证每一笔交易的准确性和数据的一致性,关系型数据库的ACID特性能够很好地满足这些需求。
- 结构化数据存储与分析:对于具有明确结构的数据,如员工信息表、订单明细表等,关系型数据库能够方便地进行存储、查询和数据分析。可以使用SQL进行复杂的查询和报表生成,例如,企业可以通过关系型数据库查询每个部门的员工绩效数据、每个产品的销售趋势等。
- 非关系型数据库
- 大数据和高并发场景:在处理海量数据(如互联网公司的用户行为数据、日志数据)和高并发访问(如社交网络的动态消息、电商网站的商品浏览记录)的场景中,非关系型数据库的可扩展性和高性能读写能力优势明显。例如,一个大型社交网络平台可以使用键 - 值存储来缓存用户的频繁访问信息,使用文档存储来存储用户的动态和个人资料,以应对庞大的用户群体和频繁的操作。
- 灵活的数据模型需求场景:当数据结构不固定或者需要频繁变化时,非关系型数据库的灵活性就体现出来了。例如,在一个内容管理系统中,文章、图片、视频等不同类型的内容可以采用文档存储,每种内容的元数据结构可以根据需要灵活调整,而不需要像关系型数据库那样频繁修改表结构。
- 图形数据处理:对于涉及图形关系的数据,如社交网络中的用户关系、知识图谱中的实体关系等,图形存储数据库能够更有效地进行存储和查询。通过图形查询语言,可以方便地查找节点之间的路径、最短距离等关系相关的信息。