这里说的逻辑结构
,就是指在用户看来,文件内部的数据应该是如何组织起来的,而 物理结构
指的是在操作系统看来,文件的数据是如何被存放的。
从逻辑结构
结构来看,我们可以打开一个记事本,里面的文字内容从用户的角度来看就是无结构的,但是又从 Excel 来看,它是有结构的,它可以包含表头、包含数据。
所以在操作系统中,也是可以分为这两个不同类型的文件,进行存储,接下来我们就需要站在物理结构
的角度上来看,文件是如何被存放在硬盘上的。
无结构的文件,内部数据就是一系列的二进制或者字符流组成,又称 流式文件
。
在这里呢由于 无结构文件
是没有明显的结构特性,所以不用探讨无结构文件的是如何存储的,无非就是存储对应的二进制或者字符流即可。
结构文件:是由一组相似的记录组成,又称为 “记录式文件”,每条记录由若个干数据项组成,这个就好比如我们使用的 Excel,如下图:
对于操作系统而言,每一个记录项应该分配多少空间呢? 学过数据库的同学就知道,在创建一个数据库表,在设计表字段的时候,是需要指定字段的长度的。 基本的数据类型指定长度都没问题,但是有一个大文本的数据类型,它是没办法指定长度的。
所以操作系统在存储有结构的文件时,也可以分为定长记录
和可变长记录
两种。
对于有结构文件是如何在硬盘上进行存储的,一般可以分为三类:
顺序文件:文件中的记录一个接一个的顺序排列,记录可以是定长的也可以是可变长的,各个记录在物理上可以顺序存储或者链式存储。
顺序存储、链式存储如下图:
基于这两种存储方式,我们思考两个问题:
1、能否快速找到第 i 个记录对应的地址? 也就是能否实现随机存储
2、能否快速找到某个关键字对应的记录对应的存放地址? 也就是快速查找
链式存储:
无论是定长/可变长记录,都无法实现随机存取,而且每一次只能从第一个记录开始依次往后查找,和链表数据结构一样。
顺序存储:
如果是可变长记录,它是无法实现随机存储的,也是只能从第一个记录开始往后查找。如果是定长记录,可以实现随机存储,并且采用顺序结构,可以通过某者算法来达到快速查找。
索引文件相信大家应该也不陌生了,在数据库中,我们可以为数据库字段建立相对应的索引,而建立一个索引,对应磁盘上就会存在一个索引表的文件。 在这个索引表里面,会有对应的字段内容,长度,以及指向主表数据项的指针,如下图:
索引表本身是定长记录的顺序文件,因此可以快速找到第 i 个记录对应的索引项,可以将关键字作为索引号内容,若按照关键字顺序排序,则还可以支持按照关键字折半查找。
当我们要增加、删除一个记录时,需要对索引表进行修改,由于索引文件又很快的检索速度,因此主要用于对信息处理的及时性要求比较高的场合使用,
思考一下索引文件的缺点,表里面每一条数据都对应一个索引表项,因此索引表可能会很大,比如主表有1w条数据,那么对应的索引表也会是1w条数据,那有没有可能再优化一下呢?
我们来看下索引顺序文件,索引顺序文件是索引文件和顺序文件思想的结合,在索引顺序文件中,同样会为文件建立一张索引表,但是不同的是,并不是为每一个记录对应一个索引表项,而是一组记录对应一个索引表项。
这样做的好处就是,我们把逻辑文件表项分为 50 个组,每个组里面可能对应 100 条数据,而索引表里面只需要为每一个组建立一个对应的表项,那么也就是 50 条索引表记录即可。
在数据量特别庞大的情况下,为了进一步提高检索效率,我们可以为顺序文件建立多级索引表。集合索引顺序文件的逻辑,既然逻辑文件可以进行分组,那么同样的,索引表文件也可以进行分组,再一次进行拆分,如下图: