
- •Введение
- •Содержание
- •1. Файловые системы
- •История развития
- •Файловые системы, принципы построения
- •Работа с типизированным файлом
- •Недостатки файловых систем
- •Задание
- •Реляционная таблица
- •Определение домена
- •Создание таблиц в среде Microsoft Access
- •Задание
- •Реляционные ключи
- •Связь между таблицами
- •Обеспечение целостности данных
- •Построение схемы данных средствами Microsoft Access
- •Мастер подстановок
- •Задание
- •Концепция ER-модели
- •Задание
- •Первая нормальная форма (1NF)
- •Вторая нормальная форма (2NF)
- •Третья нормальная форма (3NF)
- •Нормальная форма Бойса-Кодда (BCNF)
- •Четвёртая нормальная форма (4NF)
- •Пятая нормальная форма (5NF)
- •Задание
- •Выборка значений из таблиц – SELECT
- •Порядок сортировки – ORDER BY
- •Ограничение набора данных – WHERE
- •Предикат существования EXISTS
- •Агрегатные функции
- •Группировка данных – Group By
- •Псевдонимы столбцов
- •Псевдонимы таблиц
- •Объединение нескольких таблиц
- •Построение запросов в среде Microsoft Access
- •Задание
- •Вставка новой записи – INSERT
- •Редактирование данных – UPDATE
- •Удаление записей – DELETE
- •Задание
- •Основные типы данных SQL-92
- •Язык определения данных – DDL
- •Задание
- •Подготовка отчёта в среде Access
- •Задание
- •3-х уровневая архитектура ANSI-SPARC
- •Создание форм для ввода данных в Microsoft Access
- •Задание
- •Строка соединения ADO
- •Соединение с хранилищем данных, компонент TADOConnection
- •Установка соединения
- •Пример соединения без регистрации пользователя
- •Информирование о БД
- •Задание
- •Базовый класс доступа к данным TDataSet
- •Открытие и закрытие набора данных
- •Обновление набора данных
- •Перемещение по набору данных
- •Создание закладок и переход к закладке
- •Редактирование записей в наборе
- •Фильтрация набора данных
- •Организация поиска данных
- •Взаимодействие с элементами управления данными
- •Задание
- •Поле таблицы – класс TField
- •Классификация полей по функциональному назначению
- •Классификация полей по типу обслуживаемых данных
- •Обращение к отдельному объекту-полю
- •Задание
- •Поля подстановки
- •Вычисляемые поля
- •Организация отношения главная-подчинённая таблица
- •Задание
- •Поля BLOB
- •Задание
- •Источник данных – компонент TDataSource
- •Общие черты компонентов отображения данных
- •Сетка базы данных – компонент TDBGrid
- •Статический текст – компонент TDBText
- •Строка ввода БД – компонент TDBEdit
- •Многострочный текстовый редактор БД – TDBMemo
- •Изображение БД – компонент TDBImage
- •Список БД – TDBListBox
- •Комбинированный список БД – TDBComboBox
- •Флажок БД – TDBCheckBox
- •Радиогруппа БД – TDBRadioGroup
- •Компонент – TDBCtrlGrid
- •Навигатор – TDBNavigator
- •Задание
- •Создание базы данных
- •Удаление базы данных
- •Создание таблиц
- •Пример создания таблиц средствами Transact SQL
- •Создание представлений
- •Задание
- •Определение и использование переменных
- •Операторы управления Transact-SQL
- •Базовые функции Transact-SQL
- •Хранимые процедуры
- •Триггеры
- •Задание
- •Запрос TADOQuery
- •Хранимая процедура TADOStoredProc
- •Транзакции и их изоляция
- •Управление транзакциями и компонент TADOConnection
- •Задание
- •Построение простейшего документа XML
- •Атрибуты
- •Определение документа DTD
- •Задание

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;
Ставропольский государственный университет, кафедра КБ