做后端开发的程序员基本都要学会数据库的相关知识。
1、关系型数据
今天就着这段时间了解大模型的事需要牵扯到是我们接触最多的、也是入门后端必学的关系型数据库。在关系型数据库中,数据以表的形式进行组织和存储,每个表就像一个 Excel 表格,包含多个行和多个列。
就比如我们经典的学生管理系统,把学生信息存储到关系型数据库中,结构大概是这样的:
上述学生表格中,每一行代表一个学生的信息,每一列代表学生的一个属性。我们可以使用结构化查询语言 SQL 来对关系型数据库表的数据进行灵活地查询、选择、过滤等。
而关系型数据库最大的特点,就是表和表之间可以存在关系 。比如学生管理系统中还可以有班级表,结构如下:
除了查询灵活、数据表间存在关系外,关系型数据库还具有很多其他的优点。
比较重要的是数据一致性 ,关系型数据库遵循 ACID 原则(原子性、一致性、隔离性和持久性),可以保证多个操作同时进行时,数据的状态保持一致。比如 A给B转账,A 扣钱的同时B也会加钱,不会出现 A 扣了钱 B 却没收到钱的情况。
兼顾查询的灵活和写入的准确性,使得关系型数据库几乎可以被应用于任何项目中!比如 CRM(客户关系管理)和 HRM(人力资源管理)等各类管理系统、数据分析系统、金融银行系统等。
比较经典的关系型数据库产品有 MySQL、Oracle、PostgreSQL、Microsoft SQL Server 等。其中,MySQL 由于开源又易学,已经成为后端开发同学必学的数据库技术。
关系型数据库的底层核心实现是基于关系模型的数学理论 ,最常见的实现方式是使用 B+ 树来存储索引结构,基于其平衡性,能够在存储大量数据时保持高效的查询性能,并且兼顾增删改操作的性能。
2、非关系型数据库
非关系型数据库又叫 NoSQL。最简单的理解方式:关系型数据库适用于存储相互之间 存在关系的数据表 ,那么非关系型数据库适用于关系不强的、结构相对灵活的、需要被快速访问的数据,比如字符串、JSON 等。
实际项目开发中,最常用的非关系型数据库当属 KV 数据库。
KV 即 Key-Value,数据是以 键值对 的方式存储在数据库中的。可以理解为一个 HashMap,数据库中存储的每个键都 唯一对应 一个值。键和值都可以是任意类型的数据,例如字符串、数字、数组等,非常灵活。
比如存储每位用户的个人信息,结构大概是这样的:
由于 KV 存储的结构简单清晰,我们能够很轻松地根据某个键查找出对应的值,无论是读写数据性能都非常高。
此外,KV 数据库还具备良好的可扩展性,由于数据间不存在直接关联,我们可以把键值对放到多个机器上存储,通过数据分片、负载均衡等策略来支持海量数据的高并发访问。由于高性能和高可扩展性,KV 数据库被广泛应用于缓存、分布式会话、分布式锁、实时统计等场景。
最经典的 KV 数据库当属 Redis 了,它是开源的、基于内存的、高性能的数据库,不仅支持丰富的数据类型和功能,还有持久化等重要特性,也是后端同学必学的技术。其他的常用 KV 数据库有 LevelDB、RocksDB、Apache Cassandra 等。
KV 数据库的底层实现比较灵活,常见的实现方式是使用哈希表来存储键值对。不同类型的值对应的实现方式也不同,比如 Redis 的字符串存储采用简单动态字符串(SDS)实现。
3、SQL与Redis之间的异同
首先上结论Redis不能代替MySQL, Redis和MySQL只能是一种互补。Redis是一种非关系kv内存数据库(也就是常说的NoSQL),即将数据存储在缓存中,支持的数据类型比较多,比如字符串,Hash,List等缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限。Redis的适用场景及优点:
- 经常要被查询,但是创建、更新、删除等操作频率低的数据;比如数据字典,确定了之后很少被修改,是可以放到缓存中的;还有热点数据,查询极为频繁的数据,放到Redis中可以减少MySQL的压力。
- 经常被查询,但是实时性要求不高数据,比如购物网站的热销排行榜,定时统计一次后把统计结果放到redis中提供查询 。
- 缓存还可以做数据共享(Session共享),在分布式的架构中,把用户的Session数据放到Redis中。
- 高并发场景下的计数器,比如秒杀,把商品库存数量放到Redis中(秒杀的场景会比较复杂,Redis只是其中之一,例如如果请求超过某个数量的时候,多余的请求就会被限流)。
- 因为Redis对高并发的支持和单线程机制,它也经常用作分布式锁。
Redis的缺点:Redis虽然功能强大、性能高效,但是也不是万能的,项目在引入Redis的时候,需要考虑的问题也比较多,并且会带来额外的开发和运维的工作量。
MySQL是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,数据的格式是我们熟知的二维表格的样式,关系型数据库具有很多强大的功能,大部分都支持SQL语句查询,对事务也有很好的支持。
MySQL的优点:1. 体积小、速度快、总体拥有成本低。2. 开源,提供的接口支持多种语言连接操作。3. MySQL 的核心程序采用完全的多线程编程。4. 有一个非常灵活而且安全的权限和口令系统。5. 支持大型的数据库, 可以方便地支持上千万条记录的数据库。6. 支持多种操作系统。7. 提供多语言支持。
MySQL的缺点:1. 不支持备份也不支持自定义数据类型,同时对存储过程和触发器支持,也不够友好。2. MySQL最大的缺点是安全系统,复杂而非标准,另外只有到调用mysqladmin来重读用户权限时才发生改变。
4、MongoDB(分布式文档存储数据库)
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式(JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,bson是一种类json的一种二进制形式的存储格式),因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
向量数据库入坑:使用 Docker 和 Milvus 快速构建本地轻量图片搜索引擎
Elasticsearch和MongoDB对比