DBMS - 将文件记录放置在磁盘上
存储数据不仅仅是简单地将它保存到某个地方。它关乎高效地组织数据,以便存储的数据能够轻松检索和使用。在 DBMS 中,这意味着要弄清楚如何将文件记录放置在磁盘上。虽然这看似是一个简单任务,但它涉及一些巧妙的技巧来处理不同类型的记录。这些技巧用于节省空间,并使数据库运行更快。
阅读本章以了解文件记录如何放置在磁盘上。我们将通过具体示例来理解存储固定长度记录和可变长度记录所使用的方法。
记录和文件类型
在 DBMS 中,record 是一组数据值的集合。我们通常将它们与特定实体关联起来。可以将其想象成联系人列表中的详细条目。例如,一个 EMPLOYEE record 可能包含不同的字段,如姓名、员工 ID、部门和薪资。这些字段中的每一个都保存关于特定员工的一段信息。
将文件记录放置在磁盘上有助于更好的数据索引和搜索能力。有了组织良好的结构,就可以更容易地定位特定文件或检索相关信息,而不会浪费时间和资源。
将文件记录放置在磁盘上的技术
将文件记录放置在磁盘上有多种技术,包括 −
- 固定长度记录 − 每个记录大小相同。每个字段都有预定的长度,这使得定位数据更容易,因为每个字段的位置是一致的。
- 可变长度记录 − 在这里,记录的大小可以不同。当某些字段保存的数据量不同时,就会出现这种情况。例如,一个人的姓名可能是 5 个字符,而另一个人的姓名可能是 20 个字符。
现在让我们详细讨论这些技术。
磁盘上的固定长度记录
由于固定长度记录的大小统一,存储它们非常简单。以下示例展示了其工作原理 −
固定长度记录示例
假设我们有一个员工的固定长度记录。它包含以下字段 −
- 姓名 − 30 个字符
- 社会保障号码 (SSN) − 9 个字符
- 薪资 − 4 bytes(整数)
- 职位代码 − 4 bytes(整数)
- 部门 − 20 个字符
每个字段的长度是固定的。如果将它们相加,总记录大小将是 (30 + 9 + 4 + 4 + 20) = 67 bytes。正是这种统一性使得计算记录内特定字段位置变得简单。例如,薪资字段从第 39 个 byte 开始(前 30 bytes 用于姓名,其后 9 bytes 用于 SSN)。
固定长度记录的局限性
固定长度记录易于处理,但可能会浪费空间。例如,如果部门名称只有 5 个字符,剩余的 15 bytes 就未被使用。对于数千条记录,这种浪费的空间会累积起来。
另一个问题是可选字段。有时某些记录对于特定字段没有值。即使如此,也会为这些字段预留空间。假设并非每个员工都有职位代码。即使如此,每个记录中仍会为该字段预留 4 bytes。
磁盘上的变长记录
变长记录通过允许字段只占用所需的空间来节省空间。但是,当记录大小不可预测时,我们如何管理这些记录呢?
使用分隔符 − 我们可以使用分隔符字符,如管道符 (|) 来分隔记录中的字段。因此,一条记录可能看起来像这样:
Smith|123456789|45000|Computer Department|
分隔符清楚地标明了每个字段的结束位置,即使字段大小不同。这种格式效果很好,但需要额外的处理来查找数据。
存储字段长度 − 另一种方法是在记录开头存储每个字段的长度。例如,
30 Smith 9 123456789 6 45000
这里,每个字段前面的数字表示其大小。该系统先读取长度,然后获取相应数量的字节。
实际示例:处理可选字段
假设我们的 EMPLOYEE 记录包含一个可选的中间名字段。对于某些员工,此字段可能为空。使用变长记录,我们只需在字段有值时才包含它,从而节省空间。
在包含此类记录的文件中 −
- Record A − Smith|123456789|45000|Computer Department|
- Record B − Jones|987654321|52000|HR|Michael
在 Record A 中,中间名被跳过。这种灵活性使变长记录更节省空间,但也使记录处理变得复杂。
混合记录和实际应用
有时,文件包含多种记录类型。如果我们考虑一个大学数据库,其中有两种类型的记录 −
- Student Records − 包含姓名、ID、课程和成绩的字段。
- Course Records − 包含课程名称、教师和日程的字段。
如果相关的学生记录和课程记录存储在一起,它们的尺寸将会有所不同。这在实际数据库中很常见,不同实体需要高效链接。
混合记录示例
- Student Record − John Doe|12345|Math: A, History: B|
- Course Record − Math|Prof. Smith|MWF 10:00 AM|
数据库系统会跟踪记录类型并相应调整。
磁盘上记录的组织
当记录放置在磁盘上时,它们被分组到块中。块是磁盘读写的小数据块。记录打包到块中的方式会影响性能。
- Unspanned Records − 在这种方法中,一条记录必须完全适合一个块。如果一个块在存储几条记录后仍有剩余空间,该空间将未被使用。这种方法简单,但会浪费一些磁盘空间。
- Spanned Records − 对于较大的记录,跨块方法允许单条记录跨越多个块。这里,一个块末尾的指针告诉系统记录的其余部分存储在哪里。这种方法更节省空间,但在实际场景中处理起来稍复杂。
示例:Spanned 与 Unspanned
查看以下跨块和非跨块记录的示例 −
- Unspanned Block − Record 1 | Record 2 | Record 3 | Empty Space
- Spanned Block − Record 1 | Part of Record 2 (next block has the rest of Record 2)
优化记录放置
我们需要优化记录的放置,以充分利用磁盘空间并提高速度。例如,如果员工记录经常与他们的部门详情一起访问,这些可以放置在同一个块中。
还有另一种优化类型称为 indexing。通过创建指向记录位置的 index,系统可以减少查找特定数据的时间。
结论
在本章中,我们详细介绍了文件记录如何放置在磁盘上。我们强调了定长记录和变长记录之间的区别。定长记录更容易管理,但可能会浪费空间。另一方面,变长记录可以节省空间,但处理起来需要更多努力。此外,我们还考察了记录如何分组为块,并讨论了跨越组织和非跨越组织之间的权衡取舍。