什么是数据库
数据库是结构化信息或数据的有序集合,一般以电子形式存储在计算机系统中。通常由数据库管理系统 (DBMS) 来控制。在现实中,数据、DBMS 及关联应用一起被称为数据库系统,通常简称为数据库。
为了提高数据处理和查询效率,当今最常见的数据库通常以行和列的形式将数据存储在一系列的表中,支持用户便捷地访问、管理、修改、更新、控制和组织数据。另外,大多数数据库都使用结构化查询语言 (SQL) 来编写和查询数据。
而数据库又可以分为关系型数据库和非关系型数据库。
关系型数据库
概念
关系型数据库是指采用了关系模型来组织数据的数据库。简单来说,关系模式就是二维表格模型。
主要代表:SQL Server,Oracle,Mysql,PostgreSQL。
优点
- 容易理解,二维表的结构非常贴近现实世界,二维表格,容易理解。
- 使用方便,通用的sql语句使得操作关系型数据库非常方便。
- 易于维护,数据库的ACID属性,大大降低了数据冗余和数据不一致的概率。
瓶颈
- 海量数据的读写效率。对于网站的并发量高,往往达到每秒上万次的请求,对于传统关系型数据库来说,硬盘I/o是一个很大的挑战。
- 高扩展性和可用性。在基于web的结构中,数据库是最难以横向拓展的,当一个应用系统的用户量和访问量与日俱增的时候,数据库没有办法像web Server那样简单的通过添加更多的硬件和服务节点来拓展性能和负载能力。
非关系型数据库
概念
NoSQL非关系型数据库,主要指那些非关系型的、分布式的,且一般不保证ACID的数据存储系统,主要代表MongoDB,Redis、CouchDB。
NoSQL提出了另一种理念,以键值来存储,且结构不稳定,每一个元组都可以有不一样的字段,这种就不会局限于固定的结构,可以减少一些时间和空间的开销。使用这种方式,为了获取用户的不同信息,不需要像关系型数据库中,需要进行多表查询。仅仅需要根据key来取出对应的value值即可。
缺点
但是由于Nosql约束少,所以也不能够像sql那样提供where字段属性的查询。因此适合存储较为简单的数据。有一些不能够持久化数据,所以需要和关系型数据库结合。
分类
非关系数据库大部分是开源的,实现比较简单,大都是针对一些特性的应用需求出现的。根据结构化方法和应用场景的不同,分为以下几类。
- 面向高性能并发读写的key-value数据库,主要特点是具有极高的并发读写性能,例如Redis、Tokyo Cabint等。
- 面向海量数据访问的面向文档数据库,特点是,可以在海量的数据库快速的查询数据。例如MongoDB以及CouchDB.
- 面向可拓展的分布式数据库,解决的主要问题是传统数据库的扩展性上的缺陷。
区别
数据存储方式不同
- 主要差异在于数据存储的方式,关系型数据库是表格形式存储数据的,存储在鼠标的行和列中。数据表可以彼此关联写作存储,也容易提取数据
- 非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。通常存储在数据集中,就像文档、键值对或者图结构。数据及其特性是选择数据存储和提取方式的首要影响因素
扩展方式不同
- SQL和NoSQL数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展
- 要支持更多并发量,SQL数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了。因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都需要通过提高计算机性能来客服。虽然SQL数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限
- NoSQL数据库是横向扩展的。因为非关系型数据存储天然就是分布式的,NoSQL数据库的扩展可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载
对事务性的支持不同
- 如果数据操作需要高事务性或者复杂数据查询需要控制执行计划,那么传统的SQL数据库从性能和稳定性方面考虑是你的最佳选择。SQL数据库支持对事务原子性细粒度控制,并且易于回滚事务
- 虽然NoSQL数据库也可以使用事务操作,但稳定性方面没法和关系型数据库比较,所以它们真正闪亮的价值是在操作的扩展性和大数据量处理方面
下面是一个简化的表格,以表格形式表示关系型数据库和非关系型数据库之间的区别:
特征 | 关系型数据库 | 非关系型数据库 |
---|---|---|
数据结构 | 表格(表),行,列 | 键值对,文档,列族,图形等 |
可扩展性 | 垂直扩展 | 水平扩展 |
灵活性 | 预定义模式和架构,需要修改表结构进行数据迁移 | 动态调整数据模型和结构 |
查询语言 | 结构化查询语言(SQL) | 不同的查询语言或API,如键值查询,文档查询等 |
数据一致性 | ACID事务,强调数据一致性 | 最终一致性,强调可用性和分区容忍性 |
适用场景 | 强调数据一致性和复杂查询,事务处理 | 大数据量、高并发和灵活性要求较高的场景 |
请注意,这只是一个概述,并不能完全涵盖所有数据库类型和特性。实际上,关系型数据库和非关系型数据库之间的差异更加复杂和多样化,具体的数据库产品可能具有不同的特性和功能。因此,在选择数据库时,最好根据实际需求和具体场景进行评估和比较。
当涉及到生活中的例子时,我们可以使用以下两个示例来说明关系型数据库和非关系型数据库之间的区别:
示例1
1.关系型数据库(RDBMS)示例:图书馆管理系统 在一个图书馆管理系统中,我们可以使用关系型数据库来存储和管理图书馆的数据。以下是数据库中可能包含的几个表:
- 书籍表(Books table):包含书籍的信息,如书名、作者、出版社等。
- 借阅者表(Borrowers table):包含借阅者的信息,如姓名、借书卡号等。
- 借书记录表(Borrowing records table):用于跟踪借书记录,包含书籍ID、借阅者ID、借书日期、还书日期等。
这些表之间通过主键和外键建立关联,例如,借书记录表中的书籍ID和借阅者ID可以与书籍表和借阅者表中的对应字段进行关联,形成关系。我们可以使用SQL查询语言进行各种查询操作,如查找某位借阅者借了哪些书籍、某本书的借阅历史等。
2.非关系型数据库(NoSQL)示例:社交媒体用户数据 当涉及到社交媒体平台的用户数据时,非关系型数据库更适合处理动态和半结构化的数据。例如,假设我们有一个社交媒体平台,需要存储和管理用户的个人资料、好友关系和发布的帖子。
使用非关系型数据库,我们可以采用文档模型来存储用户数据。每个用户的个人资料可以表示为一个文档,其中包含各种字段,如用户名、年龄、兴趣爱好等。好友关系可以使用键值对存储,其中键表示用户ID,值表示其好友的列表。用户发布的帖子可以作为文档存储,其中包含帖子内容、发布时间、点赞数量等字段。
在非关系型数据库中,我们可以使用特定的API或查询语言来搜索用户个人资料、查找某个用户的好友、获取帖子数据等。非关系型数据库的灵活性使其能够快速适应不断变化的数据结构和查询需求。
示例2
以下是另外两个生活中的例子:
1.关系型数据库(RDBMS)示例:学生课程管理系统 假设有一个学生课程管理系统,需要存储和管理学生的选课信息。在关系型数据库中,可以使用以下表来表示数据:
- 学生表(Students table):包含学生的信息,如学号、姓名、年龄等字段。
- 课程表(Courses table):包含课程的信息,如课程编号、课程名称、学分等字段。
- 选课记录表(Course enrollment table):用于跟踪学生的选课记录,包含学生ID、课程ID、成绩等字段。
这些表之间通过主键和外键进行关联,例如,选课记录表中的学生ID和课程ID可以与学生表和课程表中对应字段建立关系。使用SQL查询语言,可以进行各种查询操作,如查找某位学生的选课情况、某门课程的学生成绩等。
2.非关系型数据库(NoSQL)示例:物联网传感器数据 考虑一个物联网应用场景,其中存在大量传感器设备收集实时数据,并需要将这些数据存储和处理。非关系型数据库更适合处理此类动态、半结构化的数据。
例如,假设有一个温度监测系统,每秒收集来自不同传感器的温度数据。非关系型数据库可以使用时间序列数据库来存储这些数据,其中每个数据点可以作为一个文档存储,包含时间戳、传感器ID、温度值等字段。
使用非关系型数据库,可以轻松地添加新的传感器数据点,而无需预先定义表结构。通过特定的API或查询语言,可以进行实时分析、聚合查询和数据可视化等操作。非关系型数据库的高可扩展性和灵活性使其适用于处理大规模的物联网数据。
通过这些例子,我们可以深入了解关系型数据库和非关系型数据库的不同之处。关系型数据库适用于结构化数据和复杂查询,而非关系型数据库则适用于半结构化和非结构化数据,并具备灵活性和可扩展性。选择适当的数据库类型取决于特定应用场景和数据需求。
参考文章: