Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие СУБД 2011.pdf
Скачиваний:
82
Добавлен:
10.06.2015
Размер:
2.75 Mб
Скачать

7

I. Файловые системы

Вид занятия – лабораторная работа. Время занятия – 4 часа.

ПО – среда Delphi.

Кто из нас не знает, как сложен первый шаг, особенно в ещё не исследованном направлении. Сколько шишек набьёт себе ребёнок, пока не совершит несколько неуклюжих шажков самостоятельно, не держась за руку отца или матери? А что говорить о первых попытках человека пересечь моря, воспарить к облакам или обуздать атомную энергию. Сколько сил и стараний ушло, сколько воли на это потребовалось? Насколько это был тяжкий труд? Нам и не представить.

Сегодня мы поговорим о попытках построения первых прообразов баз данных. Нашей основной целью станет не столько изучение истории (хотя и без неё мы не обойдёмся), сколько анализ недостатков этих систем.

История развития

Одна из самых первых фирм, нацелившая свой научный потенциал на исследование способов хранения и обработки больших массивов данных называлась North American Aviation (NAA)1. В середине 60-х годов XX века её инженеры разработали программное обеспечение (ПО) с очень серьёзным названием: Generalized Update Access Method (GUAM). Это было не что иное, как прототип представления данных в виде древообраз-

ных структур – иерархическая модель данных (hierarchical data model). Несколько позднее идея, заложенная в GUAM, получила своё развитие в стенах компании IBM. Ре-

зультат труда IBM реализовался в рамках ПО Information Management System (IMS).

Плоды совместного творчества NAA и IBM не только нашли своё отражение в одном из ключевых теоретических направлений развития БД, но и внесли существенный вклад в более осязаемый проект – благодаря IMS проводились расчеты первых полётов американского космического корабля Apollo на Луну.

Однако, не смотря на существенный успех, NAA и IBM ни сколько не монополизировали рынок будущих систем управления базами данных. Примерно в это же время компания General Electric разработала альтернативную систему Integrated Data Store (IDS). С этим проектом связано одно из ключевых имён исследователей СУБД – имя Чарльза Бачмана. Именно его идеи организации данных в дальнейшем воплотились в принципиально новое направление баз данных – сетевую модель данных (network data model).

Раз мы заговорили об именах, то нельзя не упомянуть имя учёного внесшего существенный вклад в становление реляционной модели данных (relational data model). Это Э.Ф. Кодд, сотрудник одной из научно исследовательских лабораторий IBM. Благодаря его теоретическим исследованиям в 1976 году в свет вышел проект System-R, послуживший родоначальником всех современных реляционных СУБД.

Файловые системы, принципы построения

Одним из направлений развития программного обеспечения, внесшего существенный вклад в становление современных БД, стали системы, основанные на файлах (filebased system) или, как их чаще называют файловые системы. Знание основных идей, заложенных в файловых системах, и присущих им недостатков позволит нам более

1 Сегодня эта компания называется Rockwell International

© Осипов Д.Л., 2011

8

глубоко разобраться со способами хранения данных в современных БД и, что очень важно, избежать ошибок свойственных файловым системам.

ФАЙЛОВАЯ СИСТЕМА (ФС) – программа (набор программ) позволяющая добавлять, редактировать, удалять и просматривать данные. Каждая программа определяет свой собственный формат хранения данных и свой собственный способ управления этими данными.

Первые разработки ФС были нацелены на решение элементарных задач – организацию обработки данных, хранившихся в обычных ручных картотеках. С точки зрения программирования решение подобных задач обычно производится в рамках разработки программ применяющих типизированные файлы.

ТИПИЗИРОВАННЫЙ ФАЙЛ – файл, содержащий данные, тип которых определён программистом.

Работа с типизированным файлом

Типизированный файл это именно то, что может помочь при хранении информации в табличном виде (ассортимент товаров магазина, железнодорожное расписание или список студентов ВУЗа). В зависимости от рода описываемой информации, записи такого файла определяются любым классическим типом данных (например: Integer, Real, Char). Кроме того, данные файла могут задаваться в виде определённой программистом структуры, в терминологии языка Паскаль – записи (Record).

Рассмотрим небольшую задачу. Необходимо организовать учёт студентов ВУЗа. Учету подлежат: фамилия и имя студента, название специальности и номер курса. Для этого объявляем запись типа TStudent:

type

TStudent = Record

 

 

Surname: String[15];//поле

фамилии

FName: String[10];

//поле

имени

SpCod : String[25];

//название специальности

YearNum : byte;

//номер курса

end;

Запись TStudent определяет единый тип данных, объединяющий четыре разноплановых элемента, называемых полями записи. Доступ к полям записи осуществляют по их имени. Вот пример заполнения такой записи:

var Student : TStudent; //объявление переменной на основе типа данных TStudent begin

Student.Surname

:='Петров';

Student.FName

:='Михаил';

Student.SpCod

:='Компьютерная безопасность';

Student.YearNum

:=4;

end;

На рисунке 1.1. представлена блок-схема определяющая последовательность действий программиста при реализации 3-х основных задач, при работе с типизированным файлом. Схема содержит три ветви:

1.Ветвь создания файла и заполнения его данными.

2.Ветвь открытия файла с возможностью добавления и редактирования данных.

3.Ветвь чтения данных из файла.

Ставропольский государственный университет, кафедра КБ

9

 

 

 

 

 

Начало

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Var F : File of …;

 

 

 

 

 

 

 

 

 

Создание нового

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Открытие файла,

 

файла и заполнение

 

 

 

 

 

 

 

 

 

 

 

 

его данными

 

 

 

 

 

 

 

 

 

 

добавление/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

AssignFile()

 

 

 

 

редактирование

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

данных

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Нет

Да

 

 

 

 

 

 

 

 

 

 

Открыть

 

 

 

 

 

 

 

 

 

 

 

 

 

файл?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Нет

 

 

 

 

 

Да

 

 

 

 

 

 

 

 

Только

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

чтение?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//только запись

 

 

 

 

//только чтение

 

 

 

 

 

 

FileMode:=1

 

 

 

 

 

FileMode:=0

 

 

 

 

 

 

//запись-чтение

 

 

 

 

 

 

 

 

 

 

 

FileMode:=2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//создание файла

 

 

Reset()

 

 

 

 

 

Reset()

 

 

ReWrite()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//позиция

 

 

 

 

 

//позиция

 

 

 

 

 

 

Seek()

 

 

 

 

 

Seek()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//запись данных

 

 

 

 

//чтение данных

 

 

 

 

 

 

WRITE()

 

 

 

 

 

Read()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CloseFile()

Конец

Открытие файла и чтение из него данных

Рисунок 1.1.-Блок-схема работы с типизированным файлом

Из рисунка легко заметить, что вне зависимости от стоящих перед нами задач, работа с файлом начинается с вызова процедуры AssignFile() и завершается обращением к процедуре CloseFile(). Первую процедуру алгоритма дальше станем называть процедурой инициализации базовых операций ввода-вывода.

procedure AssignFile(var F; FileName: string);

Она связывает файловую переменную F с файлом с именем FileName. С этого момента файловая переменная получит возможность держать связь с физическим файлом до тех пор, пока с ним осуществляются операции ввода/вывода. Для разрыва связи и освобождения занятых ресурсов необходим вызов процедуры закрытия файла.

procedure CloseFile(var F);

Указанный метод обязательно должен завершить операции ввода-вывода.

Представим Вашему вниманию пример создания типизированного файла и заполнения его одной записью (левая ветвь блок-схемы).

var Student: TStudent;

F : File Of TStudent; //объявляем файловую переменную

begin

AssignFile(F,'C:\Student.dat'); {связывание файловой переменной с именем файла} Rewrite(F); //создание файла

Ставропольский государственный университет, кафедра КБ

10

TRY

{заполнение полей записи} with Student do

begin

 

Student.Surname

:='Петров';

Student.FName

:='Михаил';

Student.SpCod

:='Компьютерная безопасность';

Student.YearNum

:=4;

end;

 

Write(F,Student); //внесение записи

FINALLY

CloseFile(F); //закрытие файла

END; end.

Для создания нового файла в нашем листинге мы воспользовались процедурой: procedure Rewrite(var F: File);

Ключевой параметр процедуры – файловая переменная F. Для записи данных в файл применялась процедура:

procedure Write( [var F: Text; ] P1 [ , P2,..., Pn] );

Познакомимся c правой ветвью блок-схемы. Она определяет последовательность работы при организации чтения данных из файла. В ней нам встретится несколько новых процедур. В первую очередь это процедура инициализации чтения:

procedure Reset(var F [: File; RecSize: Word ] );

Она устанавливает курсор чтения на первую запись файла.

Var Student: TStudent;

F : File Of TStudent; //объявляем файловую переменную

begin

AssignFile(F,'C:\Student.dat'); {связывание файловой переменной с именем файла}

TRY

Reset(F);

FileMode:=0;

while FilePos(F)<FileSize(F) do {организация цикла чтения данных} begin

Read(F,Student); //читаем запись и выводим её на экран

WriteLn(Student.Surname,' ', Student.FName,' ', Student.SpCod,' ', Student.YearNum); end;

FINALLY

CloseFile(F); //закрытие файла

END; ReadLn; end.

Чтение данных из файла производится посредством обращения к процедуре: procedure Read( [ var F: Text; ] V1 [, V2,...,Vn ] );

Файл может содержать несколько записей. На законный вопрос: “В каком месте находится курсор чтения?” нам ответит функция:

function FilePos(var F): Longint;

И если курсор ссылается на начало файла, то функция вернёт нулевое значение, а если на конец, то возвратится значение FileSize (). Эта функция проинформирует программиста о количестве записей в типизированном файле:

function FileSize(var F): Integer;

Ставропольский государственный университет, кафедра КБ