Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПРОЛОГ.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
98.8 Кб
Скачать

48. Создание базы данных, располагающейся на диске

Более жизнеспособными являются СУБД, хранящие данные на

диске (нерезидентные). Так как объем внешней памяти сущест-

венно больше объема оперативной памяти, системы такого класса

пригодны для большинства практических задач.

Важной особенностью программы должно явиться обеспечение

эффективного доступа к базе. Это требование заставляет ис-

пользовать индексные файлы.

Данные в нашем примере требуют введения предиката такой

структуры:

team(name, school, city, state, color, stadium, coach,

year, team_power, offensive_power,

defensive_power, winning_power, home_power)

Предикат объявляется в разделе программы database. Не-

обходимо также описать (в разделе domains) объекты этого

предиката. В дополнение к ним нужно ввести два терма, обоз-

начающие файл БД и служебный индексный файл;

В результате раздел domains приобретает следующий вид:

domains

file = datafile ;

indexfile

name, school, city, state, color,

stadium, coach = string

year,team_power, offensive_power,

defensive_power, winning_power, home_power = integer

Очередной стадией проектирования программы является

описание предикатов, осуществляющих различные операции над

базой, в разделе predicates:

do_dbase /* цель */

menu /* интерфейс в виде меню */

process /* различные операции из перечня меню */

Дополнительно к ним надо ввести вспомогательные модули,

ответственные за операции ввода-вывода: добавление, удаление

и вывод данных.

predicates

repeat

menu

process(integer)

do_dbase

dbassert(dbasedom) /* добавление данных */

dbass(dbasedom,string,string)

dbretract(dbasedom) /* удаление данных */

dbret(dbasedom,string,string)

dbret1(dbasedom,real)

dbread(dbasedom) /* чтение данных */

dbrd(dbasedom,string,string)

dbaaccess(dbasedom,real)

Так же, как и предыдущая программа, do_dbase вызывает

модуль menu. В свою очередь menu вызывает один из модулей

process; который именно из них вызывается, зависит от значе-

ния введенного пользователем числа. Структура модулей

do_dbase и menu остается такой же, какой она была в программе

"Футбольная база данных". Модули process похожи на одноимен-

ные модули той же программы, с немногочисленными отличиями:

1) process(1) вызывает вспомогательный модуль dbassert,

предназначенный для засылки данных в базу на диск,

2) process(2) вызывает вспомогательный модуль dbretract,

который удаляет данные из базы на диске,

3) process(3) вызывает вспомогательный модуль dbread, осу-

ществляющий выборку данных для выдачи их на экран.

Каждое из трех правил вызывает свой модуль, выполняющий

заданную работу. Отметим, что в этих правилах содержатся

ссылки на файл БД и служебный индексный файл.

Ввод-вывод на диск осуществляется при помощи предикатов,

с которыми вы познакомились в гл.7. Для открытия файла БД

используется предикат openwrite. Используются также предикаты

writedevice, filepos и closefile.

Назначением модуля dbrd является поиск и чтение данных,

содержащихся в БД. Модуль оформлен следующим образом:

dbrd(Term,Indexfile,Datafile) :-

openread(datafile,Datafile),

openread(indexfile,Indexfile),

dbaaccess(Term,-1),

closefile(datafile),

closefile(indexfile).

Как видно из приведенного текста, здесь используется

вспомогательный модуль dbaaccess, осуществляющий поиск и вы-

борку данных из файла БД. Вариант правила, работающий с фай-

лом БД, задается таким выражением:

dbaaccess(Term,Datpos) :-

Datpos >= 0,

filepos(datafile,Datpos,0),

readdevice(datafile),

readterm(dbasedom,Term).

Этот предикат читает данные, логически связанные со зна-

чением индекса, задаваемым переменной Datapos. Соответствую-

щие значение индекса ищется в индексным файле другим вариан-

том dbaaccess:

dbaaccess(Term,_) :-

readdevice(indexfile),

readreal(Datpos1),

dbaaccess(Term,Datpos1).

Это правило пытается найти в базе такую запись, индекс

которой присутствует в индексном файле. Если индекс находит-

ся, по правило успешно; если нет, то неуспешно. В случае ус-

пеха переменная Term получает нужные пользователю значения.