课程 1.2 · 阅读时间:约15分钟
有许多类型的数据库,每种数据库都针对特定类型的数据、查询模式或可扩展性需求进行了优化。在本课中,您将学习主要的数据库模型——关系型、键值、文档、宽列、图形、时间序列和列式——以及它们的主要差异、典型用例和实际系统示例。
数据库类型:关系型、NoSQL及其他
在上一课中,我们介绍了数据库和数据库管理系统(DBMS)的基本概念。在实践中,并非所有数据库都是以相同的方式构建的。不同的数据库类型针对不同类型的数据、查询模式、可扩展性需求和一致性需求进行了优化。
我们还将更深入地研究关系型数据库,因为它们将是我们在本课程中的主要关注点。
为什么会有不同类型的数据库?
没有单一的数据库设计适合每个应用程序。
例如:
- 银行系统需要强一致性和可靠的事务。
- 缓存系统需要极快的键查找。
- 社交网络可能需要灵活的文档存储和图形样式的关系分析。
- 分析平台可能需要高效扫描数十亿个值以进行报告。
由于不同的系统解决不同的问题,因此随着时间的推移,出现了几种数据库模型。
主要数据库类型:比较表
在我们更详细地检查每种类型之前,这里有一个快速比较:
| 类型 | 数据模型 | 优势 | 常见用例 | 示例 |
|---|---|---|---|---|
| 关系型 | 由行和列组成的表 | 强一致性、SQL、连接、结构化数据 | 银行、ERP、CRM、电子商务、报告 | PostgreSQL、MySQL、MariaDB、SQLite、Oracle |
| 键值 | 键与值的配对 | 非常快速的查找、简单的扩展 | 缓存、会话、功能标志、购物车 | Redis、Amazon DynamoDB、Riak |
| 文档 | 类似JSON的文档 | 灵活的模式、嵌套数据 | 内容管理、用户档案、目录、Web应用 | MongoDB、Couchbase、Firestore |
| 宽列 | 由按族分组的灵活列组成的行 | 高写入吞吐量、水平扩展 | 事件日志、物联网、大规模分布式工作负载 | Apache Cassandra、HBase、ScyllaDB |
| 图形 | 节点和边 | 关系密集型查询 | 社交网络、欺诈检测、推荐引擎 | Neo4j、Amazon Neptune、ArangoDB |
| 时间序列 | 带时间戳的记录 | 高效的时间聚合和摄取 | 监控、指标、传感器、金融数据 | InfluxDB、TimescaleDB、OpenTSDB |
| 列式分析 | 按列而非按行存储的数据 | 快速的分析扫描和聚合 | 商业智能、仪表板、数据仓库、OLAP | ClickHouse、DuckDB、Amazon Redshift、BigQuery |
| 内存 | 主要存储在RAM中的数据 | 极低的延迟 | 缓存、排行榜、实时计数器 | Redis、Memcached、SAP HANA |
关系型数据库
关系型数据库将数据存储在由行和列组成的表中。表可以通过关系相互连接,通常使用主键和外键。
当数据结构良好且正确性、一致性和复杂查询很重要时,这种模型特别有效。
关系型数据库的核心属性
1. 结构化模式
关系型数据库通常需要明确定义的模式。在存储数据之前,您需要定义表、列、数据类型、约束和关系。
这使得结构可预测且更易于验证。
2. 表之间的关系
关系型系统的一大优势是能够明确建模关系。
例如:
customers表可以与orders表相关联。orders表可以与order_items表相关联。
这使得关系型数据库非常适合实体相互关联的业务系统。
3. SQL支持
关系型数据库通常使用SQL(结构化查询语言)进行查询。SQL提供了一种标准方式来过滤、连接、聚合、排序和修改结构化数据。
4. ACID事务
关系型数据库以支持ACID属性而闻名:
- 原子性: 事务要么完全成功,要么完全失败。
- 一致性: 数据必须根据定义的规则保持有效。
- 隔离性: 并发事务不应错误地相互干扰。
- 持久性: 一旦提交,数据即使在故障后也会保持存储。
这些属性在银行、账单、预订和库存控制等系统中至关重要。
5. 数据完整性约束
关系型数据库可以直接在数据库层强制执行规则,例如:
- 主键
- 外键
- 唯一约束
NOT NULL约束- 检查约束
这些特性有助于防止无效或不一致的数据。
6. 强大的连接和报告
当您需要从多个表中组合信息时,关系型数据库表现出色。这是它们在报告、分析、财务、运营和许多事务系统中仍然占据中心地位的原因之一。
7. 规范化和减少冗余
关系型设计通常使用规范化,这意味着将数据组织到相关表中以减少重复并提高一致性。
例如,客户信息可以存储在 customers 表中,而不是在每个订单记录中重复存储。
关系型数据库的常见用例
当以下情况出现时,关系型数据库通常是最佳选择:
- 数据结构化且明确定义
- 实体之间的关系很重要
- 事务必须可靠
- 一致性比模式灵活性更重要
- 应用程序需要复杂的查询和报告
关系型数据库的示例
- PostgreSQL: 功能强大的开源关系型数据库,具有强大的标准支持和高级功能。
- MySQL: 流行的关系型数据库,广泛用于Web应用程序。
- MariaDB: 社区开发的MySQL分支。
- SQLite: 轻量级嵌入式关系型数据库,存储在单个文件中。
- Oracle Database: 企业级关系型数据库。
- Microsoft SQL Server: 广泛用于企业环境的关系型数据库。
键值数据库
键值数据库将数据存储为简单的配对:一个键及其关联的值。
键充当唯一标识符,数据库直接从该键检索值。该模型非常简单且速度极快。
关键差异
- 数据访问通常基于单个键,而不是复杂的连接。
- 数据库通常不理解值的内部结构。
- 它针对极快的读取和写入进行了优化。
典型用例
- 缓存查询结果
- 存储用户会话
- 购物车
- 功能标志
- 速率限制
- 排行榜和计数器
示例
- Redis
- Amazon DynamoDB
- Riak
文档数据库
文档数据库将数据存储为文档,通常采用类似JSON的格式。每个文档可以包含字段、数组和嵌套对象。
与关系型数据库不同,并非每个文档都必须具有完全相同的结构。
关键差异
- 模式灵活或半灵活。
- 相关数据通常可以存储在一个文档中。
- 它们方便用于结构经常变化的应用程序。
典型用例
- 内容管理系统
- 产品目录
- 用户档案
- 移动和Web应用
- 具有变化需求的原型系统
示例
- MongoDB
- Couchbase
- Google Firestore
宽列数据库
宽列数据库,有时称为列族数据库,以行的形式存储数据,但每行可以具有非常大且灵活的列集。它们设计用于分布在多个服务器上并具有高写入吞吐量。
关键差异
- 模式比关系型数据库更灵活。
- 它们针对大规模分布式存储进行了优化。
- 它们能够很好地处理大规模数据集和重写负载。
- 它们通常不以与SQL数据库相同的方式支持关系连接。
典型用例
- 事件日志
- 物联网遥测
- 消息系统
- 写入密集型应用
- 地理分布系统
示例
- Apache Cassandra
- Apache HBase
- ScyllaDB
列式分析数据库
列式数据库将相同列的值一起存储在磁盘上,而不是将完整的行一起存储。这与宽列数据库不同。
列式存储对于从非常大的数据集中读取少数列的分析查询特别高效。
关键差异
- 针对扫描和聚合大量数据进行了优化。
- 对报告和分析非常高效。
- 通常不适合具有许多小行更新的重事务工作负载。
典型用例
- 商业智能
- 仪表板
- 数据仓库
- 分析报告
- 大规模日志分析
示例
- ClickHouse
- DuckDB
- Amazon Redshift
- Google BigQuery
图形数据库
图形数据库专为关系最重要的数据而设计。它们存储节点(实体)和边(关系)。
关键差异
- 关系遍历快速且自然。
- 当查询路径、网络和连接数据时,它们是理想的选择。
- 对于多跳关系查询,它们通常比关系型数据库更合适。
典型用例
- 社交网络
- 欺诈检测
- 推荐系统
- 网络拓扑
- 知识图谱
示例
- Neo4j
- Amazon Neptune
- ArangoDB
时间序列数据库
时间序列数据库专门用于与时间相关的数据点。它们针对高摄取率、保留策略、压缩和基于时间的聚合进行了优化。
关键差异
- 每条记录都与时间戳相关联。
- 查询通常集中在如过去一小时、一天或一个月的范围内。
- 它们提供高效的时间窗口聚合。
典型用例
- 服务器监控
- 应用程序指标
- 传感器数据
- 股票市场数据
- 工业测量
示例
- InfluxDB
- TimescaleDB
- OpenTSDB
内存数据库
内存数据库将大部分或所有数据存储在RAM中,而不是在磁盘上。这使得它们极快,尽管内存比磁盘存储更昂贵。
一些内存数据库仅用作临时缓存,而其他数据库也可以将数据持久化到磁盘。
典型用例
- 缓存
- 会话存储
- 实时计数器
- 游戏排行榜
- 超低延迟系统
示例
- Redis
- Memcached
- SAP HANA
如何选择合适的数据库类型
在选择数据库时,可以问以下问题:
- 数据是高度结构化还是灵活的?
- 我需要强大的ACID事务吗?
- 我会运行复杂的连接吗?
- 低延迟的键查找是首要任务吗?
- 工作负载是事务性的还是分析性的?
- 系统是否会在多个服务器上扩展?
- 实体之间的关系是否对应用程序至关重要?
在许多实际系统中,组织使用多种数据库类型。例如:
- 用于核心业务数据的关系型数据库
- 用于缓存的Redis
- 用于灵活内容的文档数据库
- 用于分析的列式仓库
这通常被称为多语言持久性。
总结:数据库类型之间的主要差异
数据库类型之间的主要差异通常涉及:
- 数据模型——表、文档、键值对、图形或带时间戳的记录
- 模式灵活性——固定结构与灵活结构
- 查询风格——SQL、键查找、文档查询、图形遍历、时间窗口分析
- 一致性模型——强事务保证与关注可扩展性的权衡
- 性能特征——针对事务、分析、关系或超快速访问进行了优化
关键要点:
- 不同的数据库类型存在是因为不同的应用程序有不同的技术和业务需求。
- 关系型数据库以结构化模式、SQL、关系、完整性约束和ACID事务而闻名。
- 键值数据库非常适合快速查找和缓存。
- 文档数据库在数据结构灵活或经常变化时非常有用。
- 宽列数据库专为分布式、大规模、写入密集型工作负载而构建。
- 列式分析数据库针对报告和大规模分析进行了优化。
- 图形数据库非常适合关系密集型数据。
- 时间序列数据库专注于基于时间的指标和事件。
- 许多现代系统一起使用多种数据库类型(多语言持久性)。
常见问题解答
关系型数据库与NoSQL数据库有什么区别?
关系型数据库使用固定的基于表的模式,强制执行ACID事务,并使用SQL进行查询。NoSQL数据库是一个涵盖键值、文档、宽列和图形模型的总称——它们在模式灵活性或水平可扩展性上牺牲了一些一致性保证。两者没有绝对的优劣,正确的选择取决于您的数据和工作负载。
何时应该使用文档数据库而不是关系型数据库?
当您的数据具有自然嵌套、可变结构(例如每个产品具有不同属性的产品目录)且您很少需要跨集合连接时,使用文档数据库。当数据结构化、实体相互关联且您需要可靠的事务和复杂的多表查询时,使用关系型数据库。
单个应用程序可以使用多种数据库类型吗?
可以——这被称为多语言持久性。在生产系统中很常见:例如,PostgreSQL用于事务数据,Redis用于缓存,ClickHouse用于分析。每种数据库类型都在其性能最佳的地方使用。
面试问题
针对特定用例,您会选择哪种数据库类型,为什么?
从工作负载和约束开始:数据结构、一致性需求、查询模式、延迟目标和规模。例如,选择关系型数据库用于重ACID事务系统,选择文档数据库用于灵活的类似JSON的记录,选择时间序列数据库用于带有保留策略的时间戳指标。
一种数据库类型与另一种数据库类型相比有什么优缺点?
每种模型都是一种权衡。关系型数据库提供强一致性、连接和成熟的SQL工具,但在规模上模式更改可能会更严格。NoSQL模型通常提供更好的灵活性或水平可扩展性,但可能会限制连接或需要仔细设计一致性。
您可以在一个应用程序中使用不同的数据库类型吗?
可以。这是多语言持久性:使用多种数据库,每种数据库处理其最擅长的工作负载。一个常见的模式是PostgreSQL用于核心事务,Redis用于缓存,以及ClickHouse(或其他列式系统)用于分析。