多重表文件
多重表文件是将索引方法和链接方法相结合的一种组织方式。它的具体组织方式如下:对每个需要查询的次关键字建立一个索引,同时将具有相同次关键字的记录链接成一个链表,并将此链表的头指针、链表长度及次关键字,作为索引表的一个索引项。通常多重表文件的主文件是一个顺序文件。
例如,传智播客每个学科每个月都会开班,那么现在以各学科开班情况为数据建立一个多重表文件,主关键字为学科,次关键字是班编号、校区,如表1所示。
表1 多重表文件
物理地址 | 学科 | 学科编号 | 人数 | 班级编号 (按月份) | 校区 | 班级链 | 校区链 |
---|---|---|---|---|---|---|---|
1 | C/C++ | 001 | 200 | 03 | 北京 | 3 | 7 |
2 | JAVA | 002 | 196 | 06 | 武汉 | ^ | 5 |
3 | IOS | 003 | 206 | 03 | 南京 | ^ | ^ |
4 | ANDROID | 004 | 200 | 05 | 哈尔滨 | 6 | ^ |
5 | PHP | 005 | 190 | 07 | 武汉 | 7 | ^ |
6 | UI | 006 | 240 | 05 | 深圳 | ^ | ^ |
7 | 网络营销 | 007 | 120 | 07 | 北京 | ^ | ^ |
该文件有两个次关键字,它设有两个链接字段,分别将同一月份开班(班级编号)的和相同校区的记录链接在一起,由此形成班级编号索引和校区索引,分别如表2、3所示。
表2 班级编号索引
次关键字 | 头指针 | 链长 |
---|---|---|
03 | 1 | 2 |
05 | 4 | 2 |
06 | 2 | 1 |
07 | 5 | 2 |
表3 校区索引
次关键字 | 头指针 | 链长 |
---|---|---|
北京 | 1 | 2 |
武汉 | 2 | 2 |
南京 | 3 | 1 |
哈尔滨 | 4 | 1 |
深圳 | 6 | 1 |
将次关键字相同的记录链接在一起,如在多重表文件中,相同班级编号的记录链接在一起,在班级链中,物理地址为1的记录班级编号为03,这一条记录的班级链为3,表明下一条班级编号为03的记录是存储在物理地址3处,这样就将相同记录链接起来了。
在多重表文件中检索,可进行单关键字简单查询,也可进行多关键字组合查询。
单关键字简单查询是按给定值,在对应次关键字索引表中找到对应索引项,从头指针出发,列出该链表上所有记录。例如在表1中查询所有3月份开班的学科,则只需要在班级编号索引表中先找到次关键字03,然后从它的头指针出发,列出该链表上所有的记录即可。
多关键字组合查询,例如要查询北京校区3月份开班的学科,则既可以从班级编号索引表的头指针出发查找,也可以从校区索引表的头指针出发查找,读出链表上的每个记录,判定它是否满足查询条件。
注意,在查找同时满足多个关键字条件的记录时,可先比较多个索引链表的长度,然后选择较短的链表进行查找。
在多重表文件中插入新记录时,如果不要求保持链表的某种次序,则可将新记录插在链表的头指针之后;但删除记录时比较烦琐,需要在每个关键字的链表中删去该记录。