🌿计算机的三级数据结构
现实数据 ——
处理
(eg.范式处理)——> 逻辑结构 ——处理
——> 存储结构注意:
数据三级结构(现实数据 → 逻辑结构 → 存储结构) 确实是计算机科学中数据库系统的核心抽象框架,而传统物理记录方式(如纸质笔记本)并不适用这一模型。
- 计算机数据库的三级结构是工程需求的产物,解决了抽象化、一致性、性能、并发等核心问题。
- 传统记录方式因缺乏分层和计算能力,无法实现类似功能。(现实中不像计算机这么讲求分层实现,传统方式(如纸质记录)仅有“现实数据”与“物理载体”两层,缺乏抽象与自动化处理能力,无法支持高效检索、并发访问和复杂约束。)
由此数据库作为实现数据的高效管理软件,自然也需要遵守三层结构
🍂数据库中的数据
数据库里的数据除了要存储的数据本身,还有为了提高操作数据速率的相关数据(如,索引),它们都是要存储的。
由此,都要有一个数据的逻辑结构和存储结构。
- 即数据库的数据=本身要存储的数据 + 和这些数据有关的依附数据(eg.索引)
🌿现实数据 ————> 逻辑结构
- 现实数据需要经过对应处理,才能转化为对应的逻辑结构。而不是直接就能存进去。而这一步转化通常手动完成。(如,关系数据库的范式处理)
- 转化为逻辑结构后,就可以在数据库里创建对应的数据逻辑结构来准备存储数据(eg.现实数据处理后在mysql里建立表,接着把数据存储进去)
- 由上一章可知,不同逻辑结构会影响数据处理的速度
🍂现实结构为啥要转化为逻辑结构?
现实数据往往无结构,无顺序而且有重复、冗余的,而数据逻辑结构抓住了数据的本质,是对数据结构的抽象概括,而没有无用、冗余的信息。所以要处理现实数据,把它精简到逻辑结构定义的格式
精简方法:根据数据库不同的数据逻辑结构有不同的精简方法
- 如关系型数据库的范式处理
🍂数据库中的逻辑结构
● 数据库根据逻辑结构分类
根据数据库根据所支持的数据逻辑结构种类可以分为两大类:
单一数据库 与 多模数据库
- 单一数据逻辑模型数据库(如MySQL、Redis、Neo4j): 所有数据、索引、查询都围绕一种核心逻辑结构设计,适合特定场景的高性能需求。
- 在MySQL(关系型数据库)中,索引的逻辑结构仍然是基于表(行和列)的,但它的物理存储和功能与数据表有所不同。(索引使用专门的数据结构(如B+树),以优化查询性能。)
- MySQL主要采用一种数据逻辑结构(关系型),
但可以通过特定方式模拟多种其他逻辑结构。它不是真正的多模型数据库,但对某些非关系型用例提供了基本支持。
多模数据库(如ArangoDB、Cosmos DB): 支持多种数据模型,适合复杂业务需求,减少数据在不同数据库间的迁移和同步成本。
选择: 如果业务数据模式明确且单一(如纯关系型数据),单一模型数据库(如MySQL)通常是更好的选择,因为它在特定场景下性能更优。如果数据多样化且关系复杂(如既有文档,又有图关系),多模数据库可能更合适。
● 数据的逻辑结构
所有数据库的数据结构本质上都是由基本数据逻辑结构(线性、树形、图、散列等)
组合或封装实现
的,但不同数据库类型会根据其设计目标,选择最适合的基础结构进行优化和扩展。
- 基本数据逻辑结构
- 线性结构(数组、链表、队列、栈)
- 树形结构(二叉树、B树、B+树、Trie树)
- 图结构(邻接表、邻接矩阵)
- 散列结构(哈希表、布隆过滤器)
- 不同数据库类型组合
- 关系型数据库(如MySQL)
**核心逻辑结构:**二维表(线性结构的扩展) **底层实现:** 存储:B+树(索引)、堆文件(无索引表数据) 查询优化:基于关系代数(选择、投影、连接) 事务:通过锁机制+日志(线性日志+树形索引)
- 文档数据库(如MongoDB)
**核心逻辑结构:**嵌套的键值对(JSON/BSON) **底层实现:** 存储:B树(默认WiredTiger引擎)、内存映射文件 索引:支持多级嵌套字段的树形索引
- 图数据库(如Neo4j)
**核心逻辑结构:**属性图(节点+边) **底层实现:** 存储:邻接表(物理存储为链表+索引) 查询:图遍历算法(如DFS/BFS优化)
- 键值数据库(如Redis)
**核心逻辑结构:**哈希表 **底层实现:** 内存存储:哈希表+跳表(有序数据) 持久化:线性日志(AOF)+快照(RDB)
不同逻辑结构的原因
差异的来源:设计目标(一致性、扩展性、灵活性)决定了基础结构的选择和优化方式。即不同逻辑结构适合的场景不同,因此要开发者灵活选择
🍂常见的数据库逻辑结构类型
- 关系型结构: 以表的形式组织数据(行和列),这是关系型数据库的主要结构
- 层次型结构: 树状结构,数据以父子关系组织
- 网状结构: 更复杂的关联结构,允许多对多关系
- 面向对象结构: 以对象的形式组织数据和关系
- 文档型结构: 以文档(如JSON)为单位组织数据
- 键值对结构: 简单的键值存储方式
🍂总结
现实数据到逻辑结构的转化是必要
转化必要性
- 现实数据特征:非结构化、冗余、多源异构
- 逻辑结构作用:消除歧义、建立数据关系模型、规范化存储
灵感开源视频链接
数据库的逻辑结构都是由基本数据逻辑结构(线性、树形、图、散列等)
组合或封装实现
的,但不同数据库类型会根据其设计目标,选择最适合的基础结构进行优化和扩展。
- 即不同数据库的数据逻辑结构适合的数据类型不同,效率也不同
同时数据库可分为单一数据逻辑模型数据库 与 多模数据库,各自适合场景不同
- 如果业务数据模式明确且单一(如纯关系型数据),单一模型数据库(如MySQL)通常是更好的选择,因为它在特定场景下性能更优。如果数据多样化且关系复杂(如既有文档,又有图关系),多模数据库可能更合适。
🌿逻辑结构 ————> 存储结构
- 逻辑结构是面向用户的抽象(如表、文档、图),而存储结构是面向计算机的物理实现。光有逻辑结构不行,是抽象的,所以要把它在计算机中实现————即存储结构。
数据库的存储结构本质上是由计算机的基本存储结构(如数组、链表、树、哈希表等)组合、优化和扩展而来,但针对数据库的特定需求(如持久化、高并发、快速查询)进行了深度定制
- 与逻辑结构不同的是,数据库会有多个存储结构,即便是单一数据库也不列外
🍂数据的存储结构
- 基本数据存储结构
**顺序存储结构** 典型应用:数组(包括一维数组、二维数组等)。 **链式存储结构** 典型应用:链表(包括单链表、双向链表、循环链表等)。 **索引存储结构** 典型应用:数据库中的索引。 **散列存储结构** 典型应用:散列表。
- 关系型数据库(RDBMS)
**数据逻辑结构**:关系型数据库以 关系模型 为基础,数据以 表格(表) 的形式存储,每个表由 行(记录) 和 列(字段) 组成。 **存储结构组成** - `表的存储` - 行存储(Heap File):将表中的记录按插入顺序存储在磁盘上,记录之间没有特定的顺序。这种存储方式适合于全表扫描,但插入和删除操作效率较高。 - 索引组织表(Index-Organized Table):表中的记录按照某个索引键的顺序存储,这种方式可以加快基于索引键的查询速度。 - `索引的存储`: - B树/B+树:这是关系型数据库中最常用的索引结构。B+树的叶子节点存储实际数据记录的指针,非叶子节点仅用于导航。B+树结构可以高效地支持范围查询和顺序扫描。 - 哈希索引:用于快速查找特定键值,但不支持范围查询。 - `其他优化`: - 分区表(Partitioning):将大表分割成多个小块(分区),每个分区可以独立存储和管理,提高查询和维护效率。 - 数据块(Block/Page):数据以固定大小的数据块存储在磁盘上,每个数据块包含多条记录。这种结构可以减少磁盘I/O操作,提高读写效率。 **基础存储结构的组合**: - 顺序存储结构:表中的记录按顺序存储在磁盘上,适合行存储。 - 索引存储结构:通过B树/B+树等索引结构,快速定位记录。 - 散列存储结构:哈希索引用于快速查找特定键值。
- 键值对数据库(Key-Value Store)
**数据逻辑结构**:键值对数据库以 键(Key) 和 值(Value) 的形式存储数据,每个键唯一标识一个值。 **存储结构组成** - `内存存储`: - 哈希表:键值对通常存储在内存中的哈希表中,通过哈希函数快速定位键对应的值。这种结构支持极高的读写速度。 - `持久化存储`: - LSM树(Log-Structured Merge Tree):一种用于持久化存储的结构,将数据分为内存中的MemTable和磁盘上的SSTable。MemTable是有序的键值对集合,当达到一定大小时,会将其写入磁盘上的SSTable。SSTable是不可变的有序文件,通过合并操作来维护数据的一致性。 - B树/B+树:一些键值对数据库也使用B树/B+树来存储键值对,支持快速查找和范围查询。 **基础存储结构的组合**: - 散列存储结构:哈希表用于快速查找键值对。 - 顺序存储结构:SSTable是有序的键值对文件,支持顺序扫描。 - 索引存储结构:B树/B+树用于支持范围查询。
- 文档型数据库(Document Store)
**数据逻辑结构**:文档型数据库以**文档**的形式存储数据,每个文档是一个自包含的、结构化的数据单元,通常以JSON、XML等格式表示。 **存储结构组成** - `文档存储`: - B树/B+树:用于存储文档的索引信息,快速定位文档。 - 压缩存储:文档数据通常以压缩格式存储,减少磁盘空间占用。 - `索引存储`: - 倒排索引(Inverted Index):用于支持全文搜索,将文档中的关键词映射到包含该关键词的文档列表。 - 复合索引:支持基于多个字段的查询。 **基础存储结构的组合**: - 索引存储结构:B树/B+树和倒排索引用于快速定位和查询文档。 - 顺序存储结构:文档数据以顺序的方式存储在磁盘上,支持顺序扫描。
- 列存储数据库(Columnar Database)
**数据逻辑结构**:列存储数据库以列为单位存储数据,每列存储相同类型的数据,适合于数据分析和数据仓库场景。 **存储结构组成** - `列存储`: - 列块(Column Chunk):每列的数据存储在一个单独的列块中,列块可以独立压缩和存储,提高存储效率。 - 字典编码(Dictionary Encoding):对列中的重复值进行编码,减少存储空间。 - `索引存储`: - 位图索引(Bitmap Index):用于快速过滤和查询,特别适合于低基数(Cardinality)的列。 - B树/B+树:用于支持范围查询和排序。 **基础存储结构的组合**: - 顺序存储结构:每列的数据按顺序存储,支持顺序扫描。 - 索引存储结构:位图索引和B树/B+树用于快速查询和过滤。
- 图数据库(Graph Database)
**数据逻辑结构**:图数据库以 节点(Node) 和 边(Edge) 的形式存储数据,节点表示实体,边表示实体之间的关系。 **存储结构组成** - `节点和边的存储`: - 邻接表(Adjacency List):每个节点存储一个邻接表,记录与其相连的边和节点信息。 - 索引存储:通过索引快速定位节点和边,支持快速查询。 - `图遍历优化`: - 索引加速:通过索引加速图遍历操作,支持深度优先搜索(DFS)和广度优先搜索(BFS)。 - 缓存机制:将频繁访问的节点和边缓存到内存中,提高查询效率。 **基础存储结构的组合**: - 链式存储结构:邻接表可以看作是一种链式存储结构,用于存储节点的连接关系。 - 索引存储结构:通过索引快速定位节点和边。 - 散列存储结构:哈希表用于快速查找节点和边。
● 总结
不同类型的数据库根据其数据逻辑结构和应用场景,采用了不同的存储结构进行优化。这些优化结构虽然基于基本的存储结构(顺序、链式、索引、散列),但通过特定的组合和设计,实现了高效的存储和查询性能。每种数据库的存储结构都针对其特定的查询模式和性能需求进行了优化,从而在不同的应用场景中发挥最佳性能。
- 举例: Kafka可以说是针对存储结构做了优化,所以很快
Kafka 的高性能很大程度上源于其对存储结构的精心优化。它通过顺序 I/O、零拷贝、页缓存、批量处理等机制,结合特定的数据结构设计,实现了超高的吞吐量和低延迟。
- 最大化顺序 I/O:规避磁盘随机写瓶颈。
- 最小化数据移动:零拷贝 + 页缓存。
- 批量化处理:减少系统调用和网络往返。
- 分布式扩展:分区并行处理。
🍂总结
逻辑数据到存储结构的转化是必要
因为数据最终要存储在计算机上,那么就得实现数据逻辑结构到数据存储结构的映射
数据库的存储结构本质上是由计算机的基本存储结构(如数组、链表、树、哈希表等)组合、优化和扩展而来,但针对数据库的特定需求(如持久化、高并发、快速查询)进行了深度定制
- 注意:数据库会有多个存储结构,即便是单一数据库也不列外
🌿数据库对三级结构的实现
所以,开发数据库,就要确定数据的逻辑结构和相关的存储结构。以及给出从现实数据到逻辑结构的处理方法
注意:逻辑结构是用户视角(如表、文档),存储结构是底层实现(如B+树、LSM树)。
🍂不同数据库支持的数据逻辑结构与存储结构
数据库类型 | 逻辑结构 | 典型存储结构 | 适用场景 |
---|---|---|---|
关系型数据库 | 二维表(行/列) | 行存储(InnoDB B+树) 列存储(ClickHouse) | OLTP(事务处理) OLAP(分析) |
键值数据库 | 键值对 | 哈希表(Redis) LSM树(RocksDB) | 缓存、会话管理 |
文档数据库 | JSON文档 | BSON + B树(MongoDB) | 灵活模式、嵌套数据 |
图数据库 | 顶点和边 | 邻接表(Neo4j) | 社交网络、推荐系统 |
列族数据库 | 宽表(行+列族) | SSTable(Cassandra) | 高写入、分布式存储 |
时序数据库 | 时间序列 | 压缩时间戳+值(InfluxDB) | 监控、IoT数据 |
🍂总结
- 计算机中的数据要实现三级结构的转化才能有效的存储起来
- 数据库作为研究在计算机上高效管理的数据自然要实现这三级结构
- 由此,数据库要给出从现实数据到逻辑结构的方法 以及 数据逻辑结构与数据存储结构的实现
- 数据库的目的是实现数据的高效管理,有的数据库只专注一种数据类型的管理(即单一数据库),有的则支持多种数据的管理(即多模数据库)
- 而由上一章可知,数据的逻辑结构和存储结构都会影响效率,所以,数据库要对它支持的数据给出高效的逻辑结构与存储结构的实现(效率当然要高,不然就违背了数据库高效的本质)
- 由此,数据库的逻辑结构与存储结构都是在原有基础结构上的根据自身解决问题的个性化改进,是针对与它所要解决的问题做出的优化