文件组织存储

17 Mar 2025 | 4 分钟阅读

数据库中存储数据的方式有多种。文件存储是其中一种。用户可以以有组织的方式将数据存储在文件中。这些文件在逻辑上被组织成一系列记录,并永久存储在磁盘上。每个文件被划分为固定长度的存储单元,称为 **块 (Blocks)**。这些块是存储分配和数据传输的单元。尽管数据库的默认块大小为 4 到 8 千字节,但许多数据库允许在创建数据库实例时指定大小。

通常,记录大小小于块大小。但是,对于图像等大型数据项,大小可能会有所不同。为了快速访问数据,要求一条完整的记录只驻留在同一个块中。它不应被部分地分割到一两个块中。在 RDBMS 中,不同关系中元组的大小是不同的。因此,我们需要结构化我们的文件以实现多长度记录。在文件组织中,表示记录有两种可能的方式。

  • 固定长度记录
  • 可变长度记录

让我们详细讨论一下。

固定长度记录

固定长度记录意味着设置一个长度并将记录存储到文件中。如果记录大小超过固定大小,它将被分割成多个块。由于固定大小,会出现以下两个问题:

  1. 部分存储记录的子部分在多个块中,需要访问包含子部分的所有块才能对其进行读写。
  2. 在这种文件组织中删除记录很困难。因为如果现有记录的大小小于块大小,那么另一条记录或其一部分将填充该块。

但是,包含一定数量的字节是解决上述问题的方案。这被称为 **文件头 (File Header)**。分配的文件头包含有关文件的各种信息,例如第一条记录的地址。第二条记录的地址存储在第一条记录中,依此类推。此过程类似于指针。固定长度记录中的插入和删除方法很容易,因为被删除记录留下的或释放的空间与插入新记录所需空间完全相同。但这对于存储可变长度的记录会失败。

可变长度记录

可变长度记录是大小可变的记录。它需要创建多个不同大小的块来存储它们。这些可变长度记录在数据库系统中以以下方式保存:

  1. 在一个文件中存储多种记录类型。
  2. 它被保存为支持重复字段(如多集或数组)的记录类型。
  3. 它被保存为支持一个或多个字段可变长度的记录类型。

在可变长度记录中,存在以下两个问题:

  1. 定义表示单个记录的方式,以便轻松提取各个属性。
  2. 定义在块内存储可变长度记录的方式,以便轻松从块中提取该记录。

因此,可变长度记录的表示可以分为两部分:

  1. 记录的初始部分,包含固定长度的属性,如数值、日期、固定长度字符属性,用于存储其值。
  2. 可变长度属性(如 varchar 类型)的数据通过(偏移量,长度)对在记录的初始部分表示。偏移量指的是记录开始的位置,长度指的是可变大小属性的长度。因此,初始部分存储每个属性的固定大小信息,即它是固定长度还是可变长度属性。

带槽页结构

在块内存储可变长度记录时会遇到一个问题。因此,此类记录在块内的带槽页结构中进行组织。在带槽页结构中,每个块的开头都有一个头。这个头包含信息,例如:

  1. 头中的记录条目数
  2. 块中剩余的可用空间
  3. 一个包含记录位置和大小信息的数组。
File Organization Storage

插入和删除方法

可变长度记录在块内以连续的方式驻留。

当要插入新记录时,它会被放置在可用空间的末尾。这是因为可用空间也是连续的。此外,头会填充一个条目,其中包含新插入记录的大小和位置信息。

当现有记录被删除时,空间被释放,头条目被设置为已删除。删除之前,它会移动记录并占用空间以创建可用空间。可用空间末尾会更新。然后所有可用空间会重新设置在第一条记录和最后一个条目之间。

带槽页结构的主要技术是,不应有任何指针直接指向记录。相反,它应该指向包含其位置信息的头条目。这可以防止块内的空间碎片化,但支持指向记录的间接指针。


下一个主题RAID 级别选择