软件工程中的文件更新
先决条件 - 文件组织
数据不是静态的,因为它在不断变化,这些变化需要反映在它们的文件中。使文件保持最新的函数称为更新。
更新文件:
更新文件时会关联三个特定文件。
- 称为主文件的永久数据文件包含最新的文件数据。
- 事务文件包含要应用于主文件的更改。
- 更新程序中需要的第三个文件是错误报告文件。错误报告包含更新过程中发现的所有错误的列表,并提供给用户以进行纠正操作。
所有文件更新都会发生三种基本类型的更改:添加新数据、删除旧数据、修改包含修订的数据。
要处理任何这些交易,我们需要一个key 。键是唯一标识文件中数据的一个或多个字段。例如,在学生文件中,密钥是学生 ID。在员工档案中,密钥将是社会安全号码。
文件更新有两种类型:
- 在批量更新中,随着时间的推移收集更改,然后将所有更改立即应用于文件。
- 在在线更新中,用户直接连接到计算机,每次更改都会处理一次——通常是在更改发生时。
顺序文件更新:
假设一个批处理、顺序文件环境。它是一个必须从头开始串行处理的文件,没有任何随机处理能力。顺序文件更新实际上有两个主文件副本,旧主文件和新主文件。
在上图中,我们看到了我们上面讨论的四个文件。文件的磁带符号,因为它是顺序文件的经典符号。更新程序完成后,新的主文件被发送到离线存储,保存在那里直到再次需要它。当要更新文件时,从离线存储中检索主文件并用作旧主文件。
通常,在离线存储中至少保留三个主文件副本,以防需要重新生成不可读的文件。这个保留周期被称为祖父母系统,因为文件的三代始终可用:祖父母、父母和孩子。
更新程序设计:
更新过程要求我们匹配事务和主文件上的密钥,并且假设没有错误,遵循以下三个操作/规则之一:
- 如果事务文件密钥小于主文件密钥,则将事务添加到新的主文件中。
- 如果事务文件密钥等于主文件密钥,要么
- (一种)。如果事务是修订事务,则更改主文件的内容,或者
- (b)。如果事务是删除,则从主文件中删除数据。
- 如果事务文件密钥大于主文件密钥,则将旧的主文件记录写入新的主文件。
这个更新过程如上图所示。在事务文件中,事务代码是A表示添加, D表示删除, R表示修改。该过程首先匹配每个文件上第一条记录的键,在这种情况下,
14 > 10
因此,使用规则 3,并将主记录写入新的主记录。然后 14 和 13 匹配,这导致 13 被写入新的 master。在接下来的比赛中,我们有
14 == 14
因此,根据规则 2a,交易文件中的数据用于更改主文件中的数据。但是,此时不会写入新的主文件。更多事务可能与主文件匹配,它们也需要处理。给新主人写16后,情况是
17 < 20
根据规则 1,必须将 17 添加到新的主文件中。待办事项被复制到新的主文件中,但尚未写入。
继续处理,直到读取到删除事务,此时出现如下情况
21 == 21
并且由于事务是删除,根据规则 2b,从新的主文件中删除 21。为此,读取下一个主记录和事务记录而不写入新的主记录。处理以类似的方式继续,直到两个文件上的所有记录都已处理完毕。
更新错误:
更新程序中可能出现两类一般错误。第一个是坏数据,暗示不属于数据一部分的属性。第二类错误是文件错误。当事务文件上的数据与主文件上的数据不同步时,就会发生文件错误。
可能会出现 3 种不同的情况:
- 添加事务匹配主文件上具有相同键的记录。主文件不允许出现重复数据。因此,当添加事务上的密钥与主文件上的密钥匹配时,该事务被视为无效而被拒绝,并在错误报告中报告。
- 修订事务的密钥与主文件上的记录不匹配。在这种情况下,用户试图更改不存在的数据。这也是文件错误,必须在错误报告中报告。
- 删除事务的键与主文件上的记录不匹配。在这种情况下,用户试图删除不存在的数据,这也必须报告为错误。
更新逻辑:
初始化是打开文件并准备处理环境的函数。主线处理在Process中完成。作业结束是一个关闭文件并显示作业结束消息的函数。
文件更新的伪代码:
1 read first record from transaction file
2 read first record from old master file
3 select next entity to be processed
4 loop current entity not sentinel
1 if current entity equals old master entity
1 copy old master to new master work area
2 read old master file
2 end if
3 if current entity equals transaction entity
1 update new master work area
4 end if
5 if current entity equals new master entity
1 write new master file
6 end if
7 select next entity to be processed
5 end loop
前三个语句包含 Process 的初始化逻辑。更新逻辑背后的驱动力是,在每个while 循环中,所有数据都针对一个实体进行处理。为了确定处理下一个实体(语句和 4.7),当前条目是通过将当前事务密钥与当前主密钥进行比较来确定的。当前密钥较小。
然而,在比较键之前,必须在每个文件中读取第一条记录。这称为启动文件,在语句 1 和 2 中可以看到。算法中的循环语句包含整个程序的驱动逻辑。它建立在一个非常简单的原则上:只要数据存在于事务文件或主文件中,循环就会继续。当一个文件被完全读取后,它的键被设置为一个标记值。因此,当两个文件都在其末尾时,它们的两个密钥都将成为哨兵。然后,选择什么作为下一个要处理的实体,它将是一个哨兵,它是终止 while 循环的事件。
三个主要的处理函数发生在while 循环中。
- 首先,确定是否需要处理旧主文件上的实体。如果是,则将其移动到新的主输出区域,并从旧的主文件中读取下一个实体。 old master 上的 key 在两种情况下可以匹配当前 key:当前实体存在更改或删除事务。这个逻辑在语句 4.1 中可见。
- 第二个主要流程处理与当前实体匹配的事务。它调用一个函数来确定正在处理的事务类型(添加、更改或删除)并相应地处理它。如果是添加,则将新的实体数据移动到新的主区域。如果是更改,则更新新主区中的数据。而如果是delete,则清空新master区的key,这样记录就不会被写入了。为了在更新函数中处理多个事务,它会读取下一个事务并在其键与当前实体匹配时继续。
- 最后一个主要进程在适当的时候写入新的主进程。如果当前实体与新主文件区域中的键匹配,则需要将记录写入文件。除非处理了删除事务,否则将是这种情况。